diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml
index 3d1900b..2153521 100644
--- a/.buildkite/pipeline.yml
+++ b/.buildkite/pipeline.yml
@@ -1,27 +1,44 @@
 steps:
-  - command: "auto/run-specs"
-    label: "rspec (1.9.3)"
+  - command: "auto/run-sorbet"
+    label: ":sorbet:"
+    env:
+      DOCKER_IMAGE: "ruby"
+      RUBY_VERSION: "2.7"
+
+  - command: "auto/run-require-strict-typing"
+    label: "typed: strict"
     env:
       DOCKER_IMAGE: "ruby"
-      RUBY_VERSION: "1.9.3"
+      RUBY_VERSION: "2.7"
+
+  - command: "auto/run-quality"
+    label: "quality"
+    env:
+      DOCKER_IMAGE: "ruby"
+      RUBY_VERSION: "2.7"
+
+  - wait
 
   - command: "auto/run-specs"
     label: "rspec (2.0)"
     env:
       DOCKER_IMAGE: "ruby"
       RUBY_VERSION: "2.0"
+      BUNDLE_GEMFILE: "/work/Gemfile-legacy"
 
   - command: "auto/run-specs"
     label: "rspec (2.1)"
     env:
       DOCKER_IMAGE: "ruby"
       RUBY_VERSION: "2.1"
+      BUNDLE_GEMFILE: "/work/Gemfile-legacy"
 
   - command: "auto/run-specs"
     label: "rspec (2.2)"
     env:
       DOCKER_IMAGE: "ruby"
       RUBY_VERSION: "2.2"
+      BUNDLE_GEMFILE: "/work/Gemfile-legacy"
 
   - command: "auto/run-specs"
     label: "rspec (2.3)"
@@ -53,6 +70,18 @@ steps:
       DOCKER_IMAGE: "ruby"
       RUBY_VERSION: "2.7"
 
+  - command: "auto/run-specs"
+    label: "rspec (3.0)"
+    env:
+      DOCKER_IMAGE: "ruby"
+      RUBY_VERSION: "3.0"
+
+  - command: "auto/run-specs"
+    label: "rspec (3.1)"
+    env:
+      DOCKER_IMAGE: "ruby"
+      RUBY_VERSION: "3.1"
+
   - command: "auto/run-specs"
     label: "rspec (jruby-9.1)"
     env:
@@ -65,3 +94,8 @@ steps:
       DOCKER_IMAGE: "jruby"
       RUBY_VERSION: "9.2"
 
+  - command: "auto/run-specs"
+    label: "rspec (jruby-9.3)"
+    env:
+      DOCKER_IMAGE: "jruby"
+      RUBY_VERSION: "9.3"
diff --git a/.gitignore b/.gitignore
index 6cf8445..53a8d1b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
 doc
 pkg
 Gemfile.lock
+Gemfile-legacy.lock
 .idea
 .rbx
 *.gem
diff --git a/.parlour b/.parlour
new file mode 100644
index 0000000..50c6b5a
--- /dev/null
+++ b/.parlour
@@ -0,0 +1,9 @@
+output_file:
+  rbi: rbi/pdf-reader.rbi
+
+
+parser:
+  included_paths:
+    - lib
+  excluded_paths:
+    - lib/pdf/reader/parser.rb
diff --git a/CHANGELOG b/CHANGELOG
index b932ed7..7f67aec 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,60 @@
+v2.9.1 (4th February 2022)
+- Fix exception in Page#walk introduced in 2.9.0 (http://github.com/yob/pdf-reader/pull/442)
+- Other small bug fixes
+
+v2.9.0 (24th January 2022)
+- Support additional encryption standards (http://github.com/yob/pdf-reader/pull/419)
+- Return CropBox correctly from Page#rectangles (https://github.com/yob/pdf-reader/pull/420)
+- For sorbet users, additional type annotations are included in the gem
+
+v2.8.0 (28th Decemeber 2021)
+- Add PDF::Reader::Page#runs for extracting text from a page with positioning metadata (http://github.com/yob/pdf-reader/pull/411)
+- Add options to PDF::Reader::Page#text to make some behaviour configurable (http://github.com/yob/pdf-reader/pull/411)
+    - including extracting the text for only part of the page
+- Improve text positioning and extraction for Type3 fonts (http://github.com/yob/pdf-reader/pull/412)
+- Skip extracting text that is positioned outside the page (http://github.com/yob/pdf-reader/pull/413)
+- Fix occasional crash when reading some streams (http://github.com/yob/pdf-reader/pull/405)
+
+v2.7.0 (13th December 2021)
+- Include RBI type files in the gem
+  - Downstream users of pdf-reader who also use sorbet *should* find many parts of the API will
+    now be typed checked by sorbet
+- Fix glyph positioning in some rotation scenarios (http://github.com/yob/pdf-reader/pull/403)
+  - Improved text extraction on some rotated pages, and rotated text on normal pages
+- Add PDF::Reader::Page#rectangles (http://github.com/yob/pdf-reader/pull/402)
+  - Returns page boxes (MediaBox, etc) with rotation applied, and as PORO rather than arrays of numbers
+- Add PDF::Reader::Page#origin (http://github.com/yob/pdf-reader/pull/400)
+- Add PDF::Reader::Page#{height,width} (http://github.com/yob/pdf-reader/pull/399)
+- Overlap filter should only drop characters that overlap *and* match (http://github.com/yob/pdf-reader/pull/401)
+
+v2.6.0 (12th November 2021)
+- Text extraction improvements
+  - Improved text layout on pages with a variety of font sizes (http://github.com/yob/pdf-reader/pull/355)
+  - Fixed text positioning for some rotated pages (http://github.com/yob/pdf-reader/pull/356)
+  - Improved character width calculation for PDFs using built-in (non-embedded) ZapfDingbats (http://github.com/yob/pdf-reader/pull/373)
+  - Skip zero-width characters (http://github.com/yob/pdf-reader/pull/372)
+- Performance improvements
+  - Reduced memory pressure when decoding TIFF images (http://github.com/yob/pdf-reader/pull/360)
+  - Optional dependency on ascii81_native gem for faster processing of files using the ascii85 filter (http://github.com/yob/pdf-reader/pull/359)
+- Successfully parse more files
+  - Gracefully handle some non-spec compliant CR/LF issues (http://github.com/yob/pdf-reader/pull/364)
+  - Fix parsing of some escape sequences in content streams (http://github.com/yob/pdf-reader/pull/368)
+  - Increase the amount of junk bytes we detect and skip at the end of a file (382)
+  - Ignore "/Prev 0" in trailers (http://github.com/yob/pdf-reader/pull/383)
+  - Fix parsing of some inline images (BI ID EI tokens) (http://github.com/yob/pdf-reader/pull/389)
+  - Gracefully handle some xref tables that incorrectly start with 1 (http://github.com/yob/pdf-reader/pull/384)
+
+v2.5.0 (6th June 2021)
+- bump minimum ruby version to 2.0
+- Correctly handle trascoding to UTF-8 from some fonts that use a difference table [#344](https://github.com/yob/pdf-reader/pull/344/) 
+- Fix some character spacing issues with the TJ operator [#343](https://github.com/yob/pdf-reader/pull/343)
+- Fix crash with some encrypted PDFs [#348](https://github.com/yob/pdf-reader/pull/348/)
+- Fix positions of text on some PDFs with pages rotated 90° [#350](https://github.com/yob/pdf-reader/pull/350/)
+
+v2.4.2 (28th January 2021)
+- relax ASCII85 dependency to allow 1.x
+- improved support for decompressing objects with slightly malformed zlib data
+
 v.2.4.1 (24th September 2020)
 - Re-vendor font metrics from Adobe to clarify their license
 
diff --git a/Gemfile b/Gemfile
index b4e2a20..db58534 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,3 +1,8 @@
 source "https://rubygems.org"
 
 gemspec
+
+# We require sorbet here rather than in the gemspec so we can avoid loading it in CI
+# for rubies < 2.3
+gem "sorbet", "0.5.9531"
+gem 'parlour'
diff --git a/Gemfile-legacy b/Gemfile-legacy
new file mode 100644
index 0000000..1104bce
--- /dev/null
+++ b/Gemfile-legacy
@@ -0,0 +1,5 @@
+source "https://rubygems.org"
+
+gemspec
+
+# This Gemfile is used in the CI environment for ruby < 2.3, where sorbet can't be loaded
diff --git a/README.md b/README.md
index d556070..aa79bd2 100644
--- a/README.md
+++ b/README.md
@@ -166,6 +166,19 @@ http://groups.google.com/group/pdf-reader
 The easiest way to explain how this works in practice is to show some examples.
 Check out the examples/ directory for a few files.
 
+# Alternate Decoder
+
+For PDF files containing Ascii85 streams, the [ascii85_native](https://github.com/AnomalousBit/ascii85_native) gem can be used for increased performance. If the ascii85_native gem is detected, pdf-reader will automatically use the gem.
+
+First, run `gem install ascii85_native` and then require the gem alongside pdf-reader:
+
+```ruby
+require "pdf-reader"
+require "ascii85_native"
+```
+
+Another way of enabling native Ascii85 decoding is to place `gem 'ascii85_native'` in your project's `Gemfile`.
+
 # Known Limitations
 
 Occasionally some text cannot be extracted properly due to the way it has been
@@ -176,7 +189,9 @@ little UTF-8 friendly box to indicate an unrecognisable character.
 
 * PDF::Reader Code Repository: http://github.com/yob/pdf-reader
 
-* PDF Specification: http://www.adobe.com/devnet/pdf/pdf_reference.html
+* PDF Specification: https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf
+
+* Adobe PDF Developer Resources: http://www.adobe.com/devnet/pdf/pdf_reference.html
 
 * PDF Tutorial Slide Presentations: https://web.archive.org/web/20150110042057/http://home.comcast.net/~jk05/presentations/PDFTutorials.html
 
diff --git a/Rakefile b/Rakefile
index 69e418a..26abb00 100644
--- a/Rakefile
+++ b/Rakefile
@@ -14,7 +14,7 @@ desc "Run cane to check quality metrics"
 Cane::RakeTask.new(:quality) do |cane|
   cane.abc_max = 20
   cane.style_measure = 100
-  cane.max_violations = 31
+  cane.max_violations = 28
 
   cane.use Morecane::EncodingCheck, :encoding_glob => "{app,lib,spec}/**/*.rb"
 end
diff --git a/auto/run-quality b/auto/run-quality
new file mode 100755
index 0000000..ceb4370
--- /dev/null
+++ b/auto/run-quality
@@ -0,0 +1,5 @@
+#! /bin/bash -eu
+#
+# Run the tests
+
+$(dirname $0)/with-ruby rake quality
diff --git a/auto/run-require-strict-typing b/auto/run-require-strict-typing
new file mode 100755
index 0000000..7c3a62e
--- /dev/null
+++ b/auto/run-require-strict-typing
@@ -0,0 +1,5 @@
+#! /bin/bash -eu
+#
+# Confirm recent ruby files use strict typing
+
+$(dirname $0)/with-ruby ./scripts/require-strict-typing 
diff --git a/auto/run-sorbet b/auto/run-sorbet
new file mode 100755
index 0000000..37005a8
--- /dev/null
+++ b/auto/run-sorbet
@@ -0,0 +1,5 @@
+#! /bin/bash -eu
+#
+# Run the tests
+
+$(dirname $0)/with-ruby srb tc
diff --git a/auto/run-specs b/auto/run-specs
index f16b5ec..76d013d 100755
--- a/auto/run-specs
+++ b/auto/run-specs
@@ -2,4 +2,4 @@
 #
 # Run the tests
 
-$(dirname $0)/with-ruby rake
+$(dirname $0)/with-ruby rspec
diff --git a/auto/with-ruby b/auto/with-ruby
index 3b82819..033ecad 100755
--- a/auto/with-ruby
+++ b/auto/with-ruby
@@ -7,6 +7,7 @@ cd $(dirname $0)/..
 docker_image="${DOCKER_IMAGE:=ruby}"
 ruby_version="${RUBY_VERSION:-2.7}"
 docker_volume_name="pdf-reader-gem-cache-${docker_image}${ruby_version}"
+gemfile="${BUNDLE_GEMFILE:=/work/Gemfile}"
 
 docker volume create ${docker_volume_name} > /dev/null
 
@@ -16,6 +17,7 @@ docker run \
   -w /work \
   --entrypoint /work/auto/bundle-exec \
   --rm \
+  -e BUNDLE_GEMFILE=${gemfile} \
   -i \
   -t ${docker_image}:${ruby_version} \
   "${@-bash}"
diff --git a/debian/changelog b/debian/changelog
index 21303f2..c79b6c5 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+ruby-pdf-reader (2.9.1-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Thu, 10 Mar 2022 13:30:48 -0000
+
 ruby-pdf-reader (2.4.1-1) unstable; urgency=medium
 
   * New upstream version 2.4.1
diff --git a/debian/patches/0004-spec_fix_requires.patch b/debian/patches/0004-spec_fix_requires.patch
index 3547db5..350ef43 100644
--- a/debian/patches/0004-spec_fix_requires.patch
+++ b/debian/patches/0004-spec_fix_requires.patch
@@ -4,9 +4,12 @@ Description: fix requires in spec/
 Author: Cédric Boutillier <cedric.boutillier@gmail.com>
 Last-Update: 2011-09-06
 
---- a/spec/spec_helper.rb
-+++ b/spec/spec_helper.rb
-@@ -1,9 +1,10 @@
+Index: ruby-pdf-reader/spec/spec_helper.rb
+===================================================================
+--- ruby-pdf-reader.orig/spec/spec_helper.rb
++++ ruby-pdf-reader/spec/spec_helper.rb
+@@ -1,10 +1,11 @@
+ # typed: strict
  # coding: utf-8
  
 -require "rubygems"
diff --git a/debian/patches/0006-spec_add_require_yaml.patch b/debian/patches/0006-spec_add_require_yaml.patch
index 81f2f37..8579c88 100644
--- a/debian/patches/0006-spec_add_require_yaml.patch
+++ b/debian/patches/0006-spec_add_require_yaml.patch
@@ -3,9 +3,11 @@ Author: Cédric Boutillier <cedric.boutillier@gmail.com>
 Bug: https://github.com/yob/pdf-reader/issues/49
 Last-Update: 2012-02-23
 
---- a/spec/spec_helper.rb
-+++ b/spec/spec_helper.rb
-@@ -9,6 +9,7 @@
+Index: ruby-pdf-reader/spec/spec_helper.rb
+===================================================================
+--- ruby-pdf-reader.orig/spec/spec_helper.rb
++++ ruby-pdf-reader/spec/spec_helper.rb
+@@ -10,6 +10,7 @@ require 'pdf/reader'
  require 'timeout'
  require 'singleton'
  require 'digest/md5'
diff --git a/examples/extract_fonts.rb b/examples/extract_fonts.rb
index 82c9b05..260cb93 100755
--- a/examples/extract_fonts.rb
+++ b/examples/extract_fonts.rb
@@ -17,8 +17,8 @@ module ExtractFonts
       return count if page.fonts.nil? || page.fonts.empty?
 
       page.fonts.each do |label, font|
-        next if complete_refs[font]
-        complete_refs[font] = true
+        next if complete_refs[label]
+        complete_refs[label] = true
 
         process_font(page, font)
 
@@ -39,7 +39,7 @@ module ExtractFonts
       when :TrueType, :CIDFontType2 then
         ExtractFonts::TTF.new(page.objects, font).save("#{font[:BaseFont]}.ttf")
       else
-        $stderr.puts "unsupported font type #{font[:Subtype]}"
+        $stderr.puts "unsupported font type #{font[:Subtype]} for #{font[:BaseFont]}"
       end
     end
 
@@ -68,10 +68,15 @@ module ExtractFonts
   end
 end
 
-filename = File.expand_path(File.dirname(__FILE__)) + "/../spec/data/cairo-unicode.pdf"
+if ARGV.size == 0 # default file name
+  ARGV << File.expand_path(File.join(File.dirname(__dir__), "spec", "data", "cairo-unicode.pdf")) 
+end
+
 extractor = ExtractFonts::Extractor.new
 
-PDF::Reader.open(filename) do |reader|
-  page = reader.page(1)
-  extractor.page(page)
+ARGV.each do |arg|
+  PDF::Reader.open(arg) do |reader|
+    page = reader.page(1)
+    extractor.page(page)
+  end
 end
diff --git a/examples/rspec.rb b/examples/rspec.rb
index 3fdffa7..593d1df 100644
--- a/examples/rspec.rb
+++ b/examples/rspec.rb
@@ -1,5 +1,6 @@
 #!/usr/bin/env ruby
 # coding: utf-8
+# typed: ignore
 
 #  Basic RSpec of a generated PDF
 #
diff --git a/lib/pdf-reader.rb b/lib/pdf-reader.rb
index 4a76715..c990f81 100644
--- a/lib/pdf-reader.rb
+++ b/lib/pdf-reader.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 require "pdf/reader"
diff --git a/lib/pdf/reader.rb b/lib/pdf/reader.rb
index 0ac514b..e49182b 100644
--- a/lib/pdf/reader.rb
+++ b/lib/pdf/reader.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 ################################################################################
@@ -111,19 +112,27 @@ module PDF
     #
     #   reader = PDF::Reader.new("somefile.pdf", :password => "apples")
     #
+    # Using this method directly is supported, but it's more common to use
+    # `PDF::Reader.open`
+    #
     def initialize(input, opts = {})
       @cache   = PDF::Reader::ObjectCache.new
       opts.merge!(:cache => @cache)
       @objects = PDF::Reader::ObjectHash.new(input, opts)
     end
 
+    # Return a Hash with some basic information about the PDF file
+    #
     def info
-      dict = @objects.deref(@objects.trailer[:Info])
+      dict = @objects.deref_hash(@objects.trailer[:Info]) || {}
       doc_strings_to_utf8(dict)
     end
 
+    # Return a Hash with extra metadata provided by the author of the PDF file. Not
+    # always present.
+    #
     def metadata
-      stream = @objects.deref(root[:Metadata])
+      stream = @objects.deref_stream(root[:Metadata])
       if stream.nil?
         nil
       else
@@ -133,20 +142,24 @@ module PDF
       end
     end
 
+    # To number of pages in this PDF
+    #
     def page_count
-      pages = @objects.deref(root[:Pages])
+      pages = @objects.deref_hash(root[:Pages])
       unless pages.kind_of?(::Hash)
-        raise MalformedPDFError, 'Pages structure is missing'
+        raise MalformedPDFError, "Pages structure is missing #{pages.class}"
       end
-      @page_count ||= @objects.deref(pages[:Count])
+      @page_count ||= @objects.deref_integer(pages[:Count]) || 0
     end
 
+    # The PDF version this file uses
+    #
     def pdf_version
       @objects.pdf_version
     end
 
-    # syntactic sugar for opening a PDF file. Accepts the same arguments
-    # as new().
+    # syntactic sugar for opening a PDF file and the most common approach. Accepts the
+    # same arguments as new().
     #
     #   PDF::Reader.open("somefile.pdf") do |reader|
     #     puts reader.pdf_version
@@ -177,6 +190,8 @@ module PDF
     # methods available on each page
     #
     def pages
+      return [] if page_count <= 0
+
       (1..self.page_count).map do |num|
         begin
           PDF::Reader::Page.new(@objects, num, :cache => @cache)
@@ -221,16 +236,24 @@ module PDF
       when Array then
         obj.map { |item| doc_strings_to_utf8(item) }
       when String then
-        if obj[0,2].unpack("C*") == [254, 255]
+        if has_utf16_bom?(obj)
           utf16_to_utf8(obj)
         else
           pdfdoc_to_utf8(obj)
         end
       else
-        @objects.deref(obj)
+        obj
       end
     end
 
+    def has_utf16_bom?(str)
+      first_bytes = str[0,2]
+
+      return false if first_bytes.nil?
+
+      first_bytes.unpack("C*") == [254, 255]
+    end
+
     # TODO find a PDF I can use to spec this behaviour
     #
     def pdfdoc_to_utf8(obj)
@@ -242,7 +265,7 @@ module PDF
     # String#encode
     #
     def utf16_to_utf8(obj)
-      str = obj[2, obj.size]
+      str = obj[2, obj.size].to_s
       str = str.unpack("n*").pack("U*")
       str.force_encoding("utf-8")
       str
@@ -250,7 +273,7 @@ module PDF
 
     def root
       @root ||= begin
-        obj = @objects.deref(@objects.trailer[:Root])
+        obj = @objects.deref_hash(@objects.trailer[:Root]) || {}
         unless obj.kind_of?(::Hash)
           raise MalformedPDFError, "PDF malformed, trailer Root should be a dictionary"
         end
@@ -262,8 +285,9 @@ module PDF
 end
 ################################################################################
 
-require 'pdf/reader/resource_methods'
+require 'pdf/reader/resources'
 require 'pdf/reader/buffer'
+require 'pdf/reader/bounding_rectangle_runs_filter'
 require 'pdf/reader/cid_widths'
 require 'pdf/reader/cmap'
 require 'pdf/reader/encoding'
@@ -286,18 +310,25 @@ require 'pdf/reader/object_hash'
 require 'pdf/reader/object_stream'
 require 'pdf/reader/pages_strategy'
 require 'pdf/reader/parser'
+require 'pdf/reader/point'
 require 'pdf/reader/print_receiver'
+require 'pdf/reader/rectangle'
 require 'pdf/reader/reference'
 require 'pdf/reader/register_receiver'
 require 'pdf/reader/null_security_handler'
-require 'pdf/reader/standard_security_handler'
-require 'pdf/reader/standard_security_handler_v5'
+require 'pdf/reader/security_handler_factory'
+require 'pdf/reader/standard_key_builder'
+require 'pdf/reader/key_builder_v5'
+require 'pdf/reader/aes_v2_security_handler'
+require 'pdf/reader/aes_v3_security_handler'
+require 'pdf/reader/rc4_security_handler'
 require 'pdf/reader/unimplemented_security_handler'
 require 'pdf/reader/stream'
 require 'pdf/reader/text_run'
+require 'pdf/reader/type_check'
 require 'pdf/reader/page_state'
 require 'pdf/reader/page_text_receiver'
 require 'pdf/reader/token'
 require 'pdf/reader/xref'
-require 'pdf/reader/orientation_detector'
 require 'pdf/reader/page'
+require 'pdf/reader/validating_receiver'
diff --git a/lib/pdf/reader/aes_v2_security_handler.rb b/lib/pdf/reader/aes_v2_security_handler.rb
new file mode 100644
index 0000000..a76b12c
--- /dev/null
+++ b/lib/pdf/reader/aes_v2_security_handler.rb
@@ -0,0 +1,41 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+require 'digest/md5'
+
+class PDF::Reader
+
+  # Decrypts data using the AESV2 algorithim defined in the PDF spec. Requires
+  # a decryption key, which is usually generated by PDF::Reader::StandardKeyBuilder
+  #
+  class AesV2SecurityHandler
+
+    def initialize(key)
+      @encrypt_key = key
+    end
+
+    ##7.6.2 General Encryption Algorithm
+    #
+    # Algorithm 1: Encryption of data using the AES-128-CBC algorithm
+    #
+    # version == 4 and CFM == AESV2
+    #
+    # buf - a string to decrypt
+    # ref - a PDF::Reader::Reference for the object to decrypt
+    #
+    def decrypt( buf, ref )
+      objKey = @encrypt_key.dup
+      (0..2).each { |e| objKey << (ref.id >> e*8 & 0xFF ) }
+      (0..1).each { |e| objKey << (ref.gen >> e*8 & 0xFF ) }
+      objKey << 'sAlT'  # Algorithm 1, b)
+      length = objKey.length < 16 ? objKey.length : 16
+      cipher = OpenSSL::Cipher.new("AES-#{length << 3}-CBC")
+      cipher.decrypt
+      cipher.key = Digest::MD5.digest(objKey)[0,length]
+      cipher.iv = buf[0..15]
+      cipher.update(buf[16..-1]) + cipher.final
+    end
+
+  end
+end
diff --git a/lib/pdf/reader/aes_v3_security_handler.rb b/lib/pdf/reader/aes_v3_security_handler.rb
new file mode 100644
index 0000000..3794731
--- /dev/null
+++ b/lib/pdf/reader/aes_v3_security_handler.rb
@@ -0,0 +1,38 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+require 'digest'
+require 'openssl'
+
+class PDF::Reader
+
+  # Decrypts data using the AESV3 algorithim defined in the PDF 1.7, Extension Level 3 spec.
+  # Requires a decryption key, which is usually generated by PDF::Reader::KeyBuilderV5
+  #
+  class AesV3SecurityHandler
+
+    def initialize(key)
+      @encrypt_key = key
+      @cipher = "AES-256-CBC"
+    end
+
+    ##7.6.2 General Encryption Algorithm
+    #
+    # Algorithm 1: Encryption of data using the RC4 or AES algorithms
+    #
+    # used to decrypt RC4/AES encrypted PDF streams (buf)
+    #
+    # buf - a string to decrypt
+    # ref - a PDF::Reader::Reference for the object to decrypt
+    #
+    def decrypt( buf, ref )
+      cipher = OpenSSL::Cipher.new(@cipher)
+      cipher.decrypt
+      cipher.key = @encrypt_key.dup
+      cipher.iv = buf[0..15]
+      cipher.update(buf[16..-1]) + cipher.final
+    end
+
+  end
+end
diff --git a/lib/pdf/reader/bounding_rectangle_runs_filter.rb b/lib/pdf/reader/bounding_rectangle_runs_filter.rb
new file mode 100644
index 0000000..0524195
--- /dev/null
+++ b/lib/pdf/reader/bounding_rectangle_runs_filter.rb
@@ -0,0 +1,16 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+class PDF::Reader
+
+  # Filter our text/characters that are positioned outside a rectangle. Usually the page
+  # MediaBox or CropBox, but could be a user specified rectangle too
+  class BoundingRectangleRunsFilter
+
+    def self.runs_within_rect(runs, rect)
+      runs.select { |run| rect.contains?(run.origin) }
+    end
+  end
+end
+
diff --git a/lib/pdf/reader/buffer.rb b/lib/pdf/reader/buffer.rb
index d1a9a69..605ae38 100644
--- a/lib/pdf/reader/buffer.rb
+++ b/lib/pdf/reader/buffer.rb
@@ -1,4 +1,5 @@
 # coding: ASCII-8BIT
+# typed: true
 # frozen_string_literal: true
 
 ################################################################################
@@ -48,6 +49,18 @@ class PDF::Reader
     ID = "ID"
     FWD_SLASH = "/"
     NULL_BYTE = "\x00"
+    CR = "\r"
+    LF = "\n"
+    CRLF = "\r\n"
+    WHITE_SPACE = [LF, CR, ' ']
+
+    # Quite a few PDFs have trailing junk.
+    # This can be several k of nuls in some cases
+    # Allow for this here
+    TRAILING_BYTECOUNT = 5000
+
+    # must match whole tokens
+    DIGITS_ONLY = %r{\A\d+\z}
 
     attr_reader :pos
 
@@ -86,9 +99,12 @@ class PDF::Reader
     #
     # options:
     #
-    #   :skip_eol - if true, the IO stream is advanced past a CRLF or LF that
-    #               is sitting under the io cursor.
-    #
+    #   :skip_eol - if true, the IO stream is advanced past a CRLF, CR or LF
+    #               that is sitting under the io cursor.
+    #   Note:
+    #   Skipping a bare CR is not spec-compliant.
+    #   This is because the data may start with LF.
+    #   However we check for CRLF first, so the ambiguity is avoided.
     def read(bytes, opts = {})
       reset_pos
 
@@ -97,9 +113,9 @@ class PDF::Reader
         str = @io.read(2)
         if str.nil?
           return nil
-        elsif str == "\r\n"
+        elsif str == CRLF # This MUST be done before checking for CR alone
           # do nothing
-        elsif str[0,1] == "\n"
+        elsif str[0, 1] == LF || str[0, 1] == CR # LF or CR alone
           @io.seek(-1, IO::SEEK_CUR)
         else
           @io.seek(-2, IO::SEEK_CUR)
@@ -127,8 +143,10 @@ class PDF::Reader
     #
     def find_first_xref_offset
       check_size_is_non_zero
-      @io.seek(-1024, IO::SEEK_END) rescue @io.seek(0)
-      data = @io.read(1024)
+      @io.seek(-TRAILING_BYTECOUNT, IO::SEEK_END) rescue @io.seek(0)
+      data = @io.read(TRAILING_BYTECOUNT)
+
+      raise MalformedPDFError, "PDF does not contain EOF marker" if data.nil?
 
       # the PDF 1.7 spec (section #3.4) says that EOL markers can be either \r, \n, or both.
       lines = data.split(/[\n\r]+/).reverse
@@ -136,7 +154,12 @@ class PDF::Reader
 
       raise MalformedPDFError, "PDF does not contain EOF marker" if eof_index.nil?
       raise MalformedPDFError, "PDF EOF marker does not follow offset" if eof_index >= lines.size-1
-      lines[eof_index+1].to_i
+      offset = lines[eof_index+1].to_i
+
+      # a byte offset < 0 doesn't make much sense. This is unlikely to happen, but in theory some
+      # corrupted PDFs might have a line that looks like a negative int preceding the `%%EOF`
+      raise MalformedPDFError, "invalid xref offset" if offset < 0
+      offset
     end
 
     private
@@ -217,45 +240,73 @@ class PDF::Reader
       return if @tokens.size < 3
       return if @tokens[2] != "R"
 
-      if @tokens[0].match(/\d+/) && @tokens[1].match(/\d+/)
-        @tokens[0] = PDF::Reader::Reference.new(@tokens[0].to_i, @tokens[1].to_i)
-        @tokens[1] = nil
-        @tokens[2] = nil
-        @tokens.compact!
+      token_one = @tokens[0]
+      token_two = @tokens[1]
+      if token_one.is_a?(String) && token_two.is_a?(String) && token_one.match(DIGITS_ONLY) && token_two.match(DIGITS_ONLY)
+        @tokens[0] = PDF::Reader::Reference.new(token_one.to_i, token_two.to_i)
+        @tokens.delete_at(2)
+        @tokens.delete_at(1)
       end
     end
 
+    # Extract data between ID and EI
+    # If the EI follows white-space the space is dropped from the data
+    # The EI must followed by white-space or end of buffer
+    # This is to reduce the chance of accidentally matching an embedded EI
     def prepare_inline_token
-      str = "".dup
-
-      buffer = []
-
-      until buffer[0] =~ /\s|\0/ && buffer[1, 2] == ["E", "I"]
+      idstart = @io.pos
+      prevchr = ''
+      eisize = 0 # how many chars in the end marker
+      seeking = 'E' # what are we looking for now?
+      loop do
         chr = @io.read(1)
-        buffer << chr
-
-        if buffer.length > 3
-          str << buffer.shift
+        break if chr.nil?
+        case seeking
+        when 'E'
+          if chr == 'E'
+            seeking = 'I'
+            if WHITE_SPACE.include? prevchr
+              eisize = 3 # include whitespace in delimiter, i.e. drop from data
+            else # assume the EI immediately follows the data
+              eisize = 2 # leave prevchr in data
+            end
+          end
+        when 'I'
+          if chr == 'I'
+            seeking = ''
+          else
+            seeking = 'E'
+          end
+        when ''
+          if WHITE_SPACE.include? chr
+            eisize += 1 # Drop trailer
+            break
+          else
+            seeking = 'E'
+          end
         end
+        prevchr = chr.is_a?(String) ? chr : ''
       end
-
-      str << NULL_BYTE if buffer.first == NULL_BYTE
-
-      @tokens << string_token(str)
-      @io.seek(-3, IO::SEEK_CUR) unless chr.nil?
+      unless seeking == ''
+        raise MalformedPDFError, "EI terminator not found"
+      end
+      eiend = @io.pos
+      @io.seek(idstart, IO::SEEK_SET)
+      str = @io.read(eiend - eisize - idstart) # get the ID content
+      @tokens << str.freeze if str
     end
 
     # if we're currently inside a hex string, read hex nibbles until
     # we find a closing >
     #
     def prepare_hex_token
+      finished = :false
       str = "".dup
-      finished = false
 
-      while !finished
+      until finished == :true
         byte = @io.getbyte
         if byte.nil?
-          finished = true # unbalanced params
+          finished = :true # unbalanced params
         elsif (48..57).include?(byte) || (65..90).include?(byte) || (97..122).include?(byte)
           str << byte
         elsif byte <= 32
@@ -264,7 +315,7 @@ class PDF::Reader
           @tokens << str if str.size > 0
           @tokens << ">" if byte != 0x3E # '>'
           @tokens << byte.chr
-          finished = true
+          finished = :true
         end
       end
     end
@@ -311,14 +362,17 @@ class PDF::Reader
     def prepare_regular_token
       tok = "".dup
 
-      while byte = @io.getbyte
+      loop do
+        byte = @io.getbyte
+
         case byte
+        when nil
+          break
         when 0x25
           # comment, ignore everything until the next EOL char
-          done = false
-          while !done
-            byte = @io.getbyte
-            done = true if byte.nil? || byte == 0x0A || byte == 0x0D
+          loop do
+            commentbyte = @io.getbyte
+            break if commentbyte.nil? || commentbyte == 0x0A || commentbyte == 0x0D
           end
         when *TOKEN_WHITESPACE
           # white space, token finished
@@ -388,15 +442,5 @@ class PDF::Reader
       byte
     end
 
-    # for a handful of tokens we want to tell the parser how to convert them
-    # into higher level tokens. This methods adds a to_token() method
-    # to tokens that should remain as strings.
-    #
-    def string_token(token)
-      def token.to_token
-        to_s
-      end
-      token
-    end
   end
 end
diff --git a/lib/pdf/reader/cid_widths.rb b/lib/pdf/reader/cid_widths.rb
index 7cf3dd2..f91ad1c 100644
--- a/lib/pdf/reader/cid_widths.rb
+++ b/lib/pdf/reader/cid_widths.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 #
diff --git a/lib/pdf/reader/cmap.rb b/lib/pdf/reader/cmap.rb
index 5f6de5b..7e554bd 100644
--- a/lib/pdf/reader/cmap.rb
+++ b/lib/pdf/reader/cmap.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 ################################################################################
@@ -32,16 +33,17 @@ class PDF::Reader
   # extracting various useful information.
   #
   class CMap # :nodoc:
+
     CMAP_KEYWORDS = {
-      "begincodespacerange" => 1,
-      "endcodespacerange" => 1,
-      "beginbfchar" => 1,
-      "endbfchar" => 1,
-      "beginbfrange" => 1,
-      "endbfrange" => 1,
-      "begin" => 1,
-      "begincmap" => 1,
-      "def" => 1
+      "begincodespacerange" => :noop,
+      "endcodespacerange" => :noop,
+      "beginbfchar" => :noop,
+      "endbfchar" => :noop,
+      "beginbfrange" => :noop,
+      "endbfrange" => :noop,
+      "begin" => :noop,
+      "begincmap" => :noop,
+      "def" => :noop
     }
 
     attr_reader :map
@@ -51,30 +53,6 @@ class PDF::Reader
       process_data(data)
     end
 
-    def process_data(data)
-      parser = build_parser(data)
-      mode = nil
-      instructions = []
-
-      while token = parser.parse_token(CMAP_KEYWORDS)
-        if token == "beginbfchar"
-          mode = :char
-        elsif token == "endbfchar"
-          process_bfchar_instructions(instructions)
-          instructions = []
-          mode = nil
-        elsif token == "beginbfrange"
-          mode = :range
-        elsif token == "endbfrange"
-          process_bfrange_instructions(instructions)
-          instructions = []
-          mode = nil
-        elsif mode == :char || mode == :range
-          instructions << token
-        end
-      end
-    end
-
     def size
       @map.size
     end
@@ -84,13 +62,40 @@ class PDF::Reader
     # Returns an array of Integers.
     #
     def decode(c)
-      # TODO: implement the conversion
-      return c unless Integer === c
-      @map[c]
+      @map.fetch(c, [])
     end
 
     private
 
+    def process_data(data, initial_mode = :none)
+      parser = build_parser(data)
+      mode = initial_mode
+      instructions = []
+
+      while token = parser.parse_token(CMAP_KEYWORDS)
+        if token.is_a?(String) || token.is_a?(Array)
+          if token == "beginbfchar"
+            mode = :char
+          elsif token == "endbfchar"
+            process_bfchar_instructions(instructions)
+            instructions = []
+            mode = :none
+          elsif token == "beginbfrange"
+            mode = :range
+          elsif token == "endbfrange"
+            process_bfrange_instructions(instructions)
+            instructions = []
+            mode = :none
+          elsif mode == :char
+            instructions << token.to_s
+          elsif mode == :range
+            instructions << token
+          end
+        end
+      end
+    end
+
+
     def build_parser(instructions)
       buffer = Buffer.new(StringIO.new(instructions))
       Parser.new(buffer)
@@ -105,7 +110,6 @@ class PDF::Reader
     # exception when we try converting broken UTF-16 to UTF-8
     #
     def str_to_int(str)
-      return nil if str.nil? || str.size == 0
       unpacked_string = if str.bytesize == 1 # UTF-8
         str.unpack("C*")
       else # UTF-16
@@ -113,12 +117,15 @@ class PDF::Reader
       end
       result = []
       while unpacked_string.any? do
-        if unpacked_string.size >= 2 && unpacked_string[0] > 0xD800 && unpacked_string[0] < 0xDBFF
+        if unpacked_string.size >= 2 &&
+            unpacked_string.first.to_i > 0xD800 &&
+            unpacked_string.first.to_i < 0xDBFF
           # this is a Unicode UTF-16 "Surrogate Pair" see Unicode Spec. Chapter 3.7
           # lets convert to a UTF-32. (the high bit is between 0xD800-0xDBFF, the
           # low bit is between 0xDC00-0xDFFF) for example: U+1D44E (U+D835 U+DC4E)
-          points = [unpacked_string.shift, unpacked_string.shift]
-          result << (points[0] - 0xD800) * 0x400 + (points[1] - 0xDC00) + 0x10000
+          point_one = unpacked_string.shift.to_i
+          point_two = unpacked_string.shift.to_i
+          result << (point_one - 0xD800) * 0x400 + (point_two - 0xDC00) + 0x10000
         else
           result << unpacked_string.shift
         end
@@ -128,9 +135,11 @@ class PDF::Reader
 
     def process_bfchar_instructions(instructions)
       instructions.each_slice(2) do |one, two|
-        find    = str_to_int(one)
-        replace = str_to_int(two)
-        @map[find.first] = replace
+        find    = str_to_int(one.to_s)
+        replace = str_to_int(two.to_s)
+        if find.any? && replace.any?
+          @map[find.first.to_i] = replace
+        end
       end
     end
 
@@ -141,30 +150,36 @@ class PDF::Reader
         elsif start.kind_of?(String) && finish.kind_of?(String) && to.kind_of?(Array)
           bfrange_type_two(start, finish, to)
         else
-          raise "invalid bfrange section"
+          raise MalformedPDFError, "invalid bfrange section"
         end
       end
     end
 
     def bfrange_type_one(start_code, end_code, dst)
-      start_code = str_to_int(start_code)[0]
-      end_code   = str_to_int(end_code)[0]
+      start_code = str_to_int(start_code).first
+      end_code   = str_to_int(end_code).first
       dst        = str_to_int(dst)
 
+      return if start_code.nil? || end_code.nil?
+
       # add all values in the range to our mapping
       (start_code..end_code).each_with_index do |val, idx|
-        @map[val] = dst.length == 1 ? [dst[0] + idx] : [dst[0], dst[1] + 1]
+        @map[val] = dst.length == 1 ? [dst[0].to_i + idx] : [dst[0].to_i, dst[1].to_i + 1]
       end
     end
 
     def bfrange_type_two(start_code, end_code, dst)
-      start_code = str_to_int(start_code)[0]
-      end_code   = str_to_int(end_code)[0]
+      start_code = str_to_int(start_code).first
+      end_code   = str_to_int(end_code).first
+
+      return if start_code.nil? || end_code.nil?
+
       from_range = (start_code..end_code)
 
       # add all values in the range to our mapping
       from_range.each_with_index do |val, idx|
-        @map[val] = str_to_int(dst[idx])
+        dst_char = dst[idx]
+        @map[val.to_i] = str_to_int(dst_char) if dst_char
       end
     end
   end
diff --git a/lib/pdf/reader/encoding.rb b/lib/pdf/reader/encoding.rb
index 5f7faad..6dcf73d 100644
--- a/lib/pdf/reader/encoding.rb
+++ b/lib/pdf/reader/encoding.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 ################################################################################
@@ -68,7 +69,7 @@ class PDF::Reader
     #
     #   [25, :A, :B]
     def differences=(diff)
-      raise ArgumentError, "diff must be an array" unless diff.kind_of?(Array)
+      PDF::Reader::Error.validate_type(diff, "diff", Array)
 
       @differences = {}
       byte = 0
@@ -208,7 +209,7 @@ class PDF::Reader
     def load_mapping(file)
       File.open(file, "r:BINARY") do |f|
         f.each do |l|
-          _m, single_byte, unicode = *l.match(/([0-9A-Za-z]+);([0-9A-F]{4})/)
+          _m, single_byte, unicode = *l.match(/\A([0-9A-Za-z]+);([0-9A-F]{4})/)
           @mapping["0x#{single_byte}".hex] = "0x#{unicode}".hex if single_byte
         end
       end
diff --git a/lib/pdf/reader/error.rb b/lib/pdf/reader/error.rb
index b6bea64..80c0194 100644
--- a/lib/pdf/reader/error.rb
+++ b/lib/pdf/reader/error.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 ################################################################################
@@ -33,19 +34,34 @@ class PDF::Reader
     def self.str_assert(lvalue, rvalue, chars=nil)
       raise MalformedPDFError, "PDF malformed, expected string but found #{lvalue.class} instead" if chars and !lvalue.kind_of?(String)
       lvalue = lvalue[0,chars] if chars
-      raise MalformedPDFError, "PDF malformed, expected '#{rvalue}' but found #{lvalue} instead"  if lvalue != rvalue
+      raise MalformedPDFError, "PDF malformed, expected '#{rvalue}' but found '#{lvalue}' instead"  if lvalue != rvalue
     end
     ################################################################################
     def self.str_assert_not(lvalue, rvalue, chars=nil)
       raise MalformedPDFError, "PDF malformed, expected string but found #{lvalue.class} instead" if chars and !lvalue.kind_of?(String)
       lvalue = lvalue[0,chars] if chars
-      raise MalformedPDFError, "PDF malformed, expected '#{rvalue}' but found #{lvalue} instead"  if lvalue == rvalue
+      raise MalformedPDFError, "PDF malformed, expected '#{rvalue}' but found '#{lvalue}' instead"  if lvalue == rvalue
     end
     ################################################################################
     def self.assert_equal(lvalue, rvalue)
-      raise MalformedPDFError, "PDF malformed, expected #{rvalue} but found #{lvalue} instead" if lvalue != rvalue
+      raise MalformedPDFError, "PDF malformed, expected '#{rvalue}' but found '#{lvalue}' instead" if lvalue != rvalue
     end
     ################################################################################
+    def self.validate_type(object, name, klass)
+      raise ArgumentError, "#{name} (#{object}) must be a #{klass}" unless object.is_a?(klass)
+    end
+    ################################################################################
+    def self.validate_type_as_malformed(object, name, klass)
+      raise MalformedPDFError, "#{name} (#{object}) must be a #{klass}" unless object.is_a?(klass)
+    end
+    ################################################################################
+    def self.validate_not_nil(object, name)
+      raise ArgumentError, "#{object} must not be nil" if object.nil?
+    end
+    ################################################################################
+    def self.validate_not_nil_as_malformed(object, name)
+      raise MalformedPDFError, "#{object} must not be nil" if object.nil?
+    end
   end
 
   ################################################################################
diff --git a/lib/pdf/reader/filter.rb b/lib/pdf/reader/filter.rb
index ecc9091..c2d899d 100644
--- a/lib/pdf/reader/filter.rb
+++ b/lib/pdf/reader/filter.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 ################################################################################
@@ -41,17 +42,16 @@ class PDF::Reader
     # returned untouched. At this stage PDF::Reader has no need to decode images.
     #
     def self.with(name, options = {})
-      case name.to_sym
-      when :ASCII85Decode   then PDF::Reader::Filter::Ascii85.new(options)
-      when :ASCIIHexDecode  then PDF::Reader::Filter::AsciiHex.new(options)
-      when :CCITTFaxDecode  then PDF::Reader::Filter::Null.new(options)
-      when :DCTDecode       then PDF::Reader::Filter::Null.new(options)
-      when :FlateDecode     then PDF::Reader::Filter::Flate.new(options)
-      when :Fl              then PDF::Reader::Filter::Flate.new(options)
-      when :JBIG2Decode     then PDF::Reader::Filter::Null.new(options)
-      when :JPXDecode       then PDF::Reader::Filter::Null.new(options)
-      when :LZWDecode       then PDF::Reader::Filter::Lzw.new(options)
-      when :RunLengthDecode then PDF::Reader::Filter::RunLength.new(options)
+      case name
+      when :ASCII85Decode, :A85   then PDF::Reader::Filter::Ascii85.new(options)
+      when :ASCIIHexDecode, :AHx  then PDF::Reader::Filter::AsciiHex.new(options)
+      when :CCITTFaxDecode, :CCF  then PDF::Reader::Filter::Null.new(options)
+      when :DCTDecode, :DCT       then PDF::Reader::Filter::Null.new(options)
+      when :FlateDecode, :Fl      then PDF::Reader::Filter::Flate.new(options)
+      when :JBIG2Decode           then PDF::Reader::Filter::Null.new(options)
+      when :JPXDecode             then PDF::Reader::Filter::Null.new(options)
+      when :LZWDecode, :LZW       then PDF::Reader::Filter::Lzw.new(options)
+      when :RunLengthDecode, :RL  then PDF::Reader::Filter::RunLength.new(options)
       else
         raise UnsupportedFeatureError, "Unknown filter: #{name}"
       end
diff --git a/lib/pdf/reader/filter/ascii85.rb b/lib/pdf/reader/filter/ascii85.rb
index 1986f72..ac91a63 100644
--- a/lib/pdf/reader/filter/ascii85.rb
+++ b/lib/pdf/reader/filter/ascii85.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 require 'ascii85'
@@ -7,6 +8,7 @@ class PDF::Reader
   module Filter # :nodoc:
     # implementation of the Ascii85 filter
     class Ascii85
+
       def initialize(options = {})
         @options = options
       end
@@ -17,7 +19,11 @@ class PDF::Reader
       #
       def filter(data)
         data = "<~#{data}" unless data.to_s[0,2] == "<~"
-        ::Ascii85::decode(data)
+        if defined?(::Ascii85Native)
+          ::Ascii85Native::decode(data)
+        else
+          ::Ascii85::decode(data)
+        end
       rescue Exception => e
         # Oops, there was a problem decoding the stream
         raise MalformedPDFError,
diff --git a/lib/pdf/reader/filter/ascii_hex.rb b/lib/pdf/reader/filter/ascii_hex.rb
index 0d06468..efe0836 100644
--- a/lib/pdf/reader/filter/ascii_hex.rb
+++ b/lib/pdf/reader/filter/ascii_hex.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 #
@@ -6,6 +7,7 @@ class PDF::Reader
   module Filter # :nodoc:
     # implementation of the AsciiHex stream filter
     class AsciiHex
+
       def initialize(options = {})
         @options = options
       end
@@ -16,9 +18,12 @@ class PDF::Reader
       def filter(data)
         data.chop! if data[-1,1] == ">"
         data = data[1,data.size] if data[0,1] == "<"
+
+        return "" if data.nil?
+
         data.gsub!(/[^A-Fa-f0-9]/,"")
         data << "0" if data.size % 2 == 1
-        data.scan(/.{2}/).map { |s| s.hex.chr }.join("")
+        data.scan(/.{2}/).flatten.map { |s| s.hex.chr }.join("")
       rescue Exception => e
         # Oops, there was a problem decoding the stream
         raise MalformedPDFError,
diff --git a/lib/pdf/reader/filter/depredict.rb b/lib/pdf/reader/filter/depredict.rb
index d86431e..230a617 100644
--- a/lib/pdf/reader/filter/depredict.rb
+++ b/lib/pdf/reader/filter/depredict.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 class PDF::Reader
@@ -6,8 +7,9 @@ class PDF::Reader
     # some filter implementations support preprocessing of the  data to
     # improve compression
     class Depredict
+
       def initialize(options = {})
-        @options = options || {}
+        @options = options
       end
 
       ################################################################################
@@ -34,7 +36,7 @@ class PDF::Reader
       ################################################################################
       def tiff_depredict(data)
         data        = data.unpack("C*")
-        unfiltered  = []
+        unfiltered  = ''
         bpc         = @options[:BitsPerComponent] || 8
         pixel_bits  = bpc * @options[:Colors]
         pixel_bytes = pixel_bits / 8
@@ -51,11 +53,11 @@ class PDF::Reader
             left = index < pixel_bytes ? 0 : row_data[index - pixel_bytes]
             row_data[index] = (byte + left) % 256
           end
-          unfiltered += row_data
+          unfiltered += row_data.pack("C*")
           pos += line_len
         end
 
-        unfiltered.pack("C*")
+        unfiltered
       end
       ################################################################################
       def png_depredict(data)
@@ -67,7 +69,7 @@ class PDF::Reader
         scanline_length = (pixel_bytes * @options[:Columns]) + 1
         row = 0
         pixels = []
-        paeth, pa, pb, pc = nil
+        paeth, pa, pb, pc = 0, 0, 0, 0
         until data.empty? do
           row_data = data.slice! 0, scanline_length
           filter = row_data.shift
@@ -94,17 +96,17 @@ class PDF::Reader
               row_data[index] = (byte + ((left + upper)/2).floor) % 256
             end
           when 4 # Paeth
-            left = upper = upper_left = nil
+            left = upper = upper_left = 0
             row_data.each_with_index do |byte, index|
               col = index / pixel_bytes
 
-              left = index < pixel_bytes ? 0 : row_data[index - pixel_bytes]
+              left = index < pixel_bytes ? 0 : Integer(row_data[index - pixel_bytes])
               if row.zero?
                 upper = upper_left = 0
               else
-                upper = pixels[row-1][col][index % pixel_bytes]
+                upper = Integer(pixels[row-1][col][index % pixel_bytes])
                 upper_left = col.zero? ? 0 :
-                  pixels[row-1][col-1][index % pixel_bytes]
+                  Integer(pixels[row-1][col-1][index % pixel_bytes])
               end
 
               p = left + upper - upper_left
diff --git a/lib/pdf/reader/filter/flate.rb b/lib/pdf/reader/filter/flate.rb
index 95092a7..2047bfe 100644
--- a/lib/pdf/reader/filter/flate.rb
+++ b/lib/pdf/reader/filter/flate.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 
@@ -8,7 +9,9 @@ class PDF::Reader
   module Filter # :nodoc:
     # implementation of the Flate (zlib) stream filter
     class Flate
+
       ZLIB_AUTO_DETECT_ZLIB_OR_GZIP = 47  # Zlib::MAX_WBITS + 32
+      ZLIB_RAW_DEFLATE              = -15 # Zlib::MAX_WBITS * -1
 
       def initialize(options = {})
         @options = options
@@ -17,24 +20,34 @@ class PDF::Reader
       ################################################################################
       # Decode the specified data with the Zlib compression algorithm
       def filter(data)
-        deflated = nil
+        deflated = zlib_inflate(data) || zlib_inflate(data[0, data.bytesize-1])
+
+        if deflated.nil?
+          raise MalformedPDFError,
+            "Error while inflating a compressed stream (no suitable inflation algorithm found)"
+        end
+        Depredict.new(@options).filter(deflated)
+      end
+
+      private
+
+      def zlib_inflate(data)
         begin
-          deflated = Zlib::Inflate.new(ZLIB_AUTO_DETECT_ZLIB_OR_GZIP).inflate(data)
-        rescue Zlib::DataError => e
+          return Zlib::Inflate.new(ZLIB_AUTO_DETECT_ZLIB_OR_GZIP).inflate(data)
+        rescue Zlib::Error
           # by default, Ruby's Zlib assumes the data it's inflating
           # is RFC1951 deflated data, wrapped in a RFC1950 zlib container. If that
-          # fails, then use a lightly-documented 'feature' to attempt to inflate
-          # the data as a raw RFC1951 stream.
-          #
-          # See
-          # - http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/243545
-          deflated = Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(data)
+          # fails, swallow the exception and attempt to inflate the data as a raw
+          # RFC1951 stream.
         end
-        Depredict.new(@options).filter(deflated)
-      rescue Exception => e
-        # Oops, there was a problem inflating the stream
-        raise MalformedPDFError,
-          "Error occured while inflating a compressed stream (#{e.class.to_s}: #{e.to_s})"
+
+        begin
+          return Zlib::Inflate.new(ZLIB_RAW_DEFLATE).inflate(data)
+        rescue Zlib::Error
+          # swallow this one too, so we can try some other fallback options
+        end
+
+        nil
       end
     end
   end
diff --git a/lib/pdf/reader/filter/lzw.rb b/lib/pdf/reader/filter/lzw.rb
index f987c47..3c7ded0 100644
--- a/lib/pdf/reader/filter/lzw.rb
+++ b/lib/pdf/reader/filter/lzw.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 #
@@ -6,6 +7,7 @@ class PDF::Reader
   module Filter # :nodoc:
     # implementation of the LZW stream filter
     class Lzw
+
       def initialize(options = {})
         @options = options
       end
diff --git a/lib/pdf/reader/filter/null.rb b/lib/pdf/reader/filter/null.rb
index a9564d0..62354be 100644
--- a/lib/pdf/reader/filter/null.rb
+++ b/lib/pdf/reader/filter/null.rb
@@ -1,7 +1,7 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
-#
 class PDF::Reader
   module Filter # :nodoc:
     # implementation of the null stream filter
diff --git a/lib/pdf/reader/filter/run_length.rb b/lib/pdf/reader/filter/run_length.rb
index 9a39772..89b865c 100644
--- a/lib/pdf/reader/filter/run_length.rb
+++ b/lib/pdf/reader/filter/run_length.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 #
@@ -6,6 +7,7 @@ class PDF::Reader # :nodoc:
   module Filter # :nodoc:
     # implementation of the run length stream filter
     class RunLength
+
       def initialize(options = {})
         @options = options
       end
@@ -20,19 +22,23 @@ class PDF::Reader # :nodoc:
           length = data.getbyte(pos)
           pos += 1
 
-          case
-          when length == 128
-            break
-          when length < 128
-            # When the length is < 128, we copy the following length+1 bytes
-            # literally.
-            out << data[pos, length + 1]
-            pos += length
-          else
-            # When the length is > 128, we copy the next byte (257 - length)
-            # times; i.e., "\xFA\x00" ([250, 0]) will expand to
-            # "\x00\x00\x00\x00\x00\x00\x00".
-            out << data[pos, 1] * (257 - length)
+          unless length.nil?
+            case
+              # nothing
+            when length == 128
+              break
+            when length < 128
+              # When the length is < 128, we copy the following length+1 bytes
+              # literally.
+              out << data[pos, length + 1]
+              pos += length
+            else
+              # When the length is > 128, we copy the next byte (257 - length)
+              # times; i.e., "\xFA\x00" ([250, 0]) will expand to
+              # "\x00\x00\x00\x00\x00\x00\x00".
+              previous_byte = data[pos, 1] || ""
+              out << previous_byte * (257 - length)
+            end
           end
 
           pos += 1
diff --git a/lib/pdf/reader/font.rb b/lib/pdf/reader/font.rb
index 17cab92..d143caa 100644
--- a/lib/pdf/reader/font.rb
+++ b/lib/pdf/reader/font.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 ################################################################################
@@ -42,6 +43,7 @@ class PDF::Reader
       @tounicode = nil
 
       extract_base_info(obj)
+      extract_type3_info(obj)
       extract_descriptor(obj)
       extract_descendants(obj)
       @width_calc = build_width_calculator
@@ -72,8 +74,44 @@ class PDF::Reader
       @cached_widths[code_point] ||= @width_calc.glyph_width(code_point)
     end
 
+    # In most cases glyph width is converted into text space with a simple divide by 1000.
+    #
+    # However, Type3 fonts provide their own FontMatrix that's used for the transformation.
+    #
+    def glyph_width_in_text_space(code_point)
+      glyph_width_in_glyph_space = glyph_width(code_point)
+
+      if @subtype == :Type3
+        x1, y1 = font_matrix_transform(0,0)
+        x2, y2 = font_matrix_transform(glyph_width_in_glyph_space, 0)
+        (x2 - x1).abs.round(2)
+      else
+        glyph_width_in_glyph_space / 1000.0
+      end
+    end
+
     private
 
+    # Only valid for Type3 fonts
+    def font_matrix_transform(x, y)
+      return x, y if @font_matrix.nil?
+
+      matrix = TransformationMatrix.new(
+        @font_matrix[0], @font_matrix[1],
+        @font_matrix[2], @font_matrix[3],
+        @font_matrix[4], @font_matrix[5],
+      )
+
+      if x == 0 && y == 0
+        [matrix.e, matrix.f]
+      else
+        [
+          (matrix.a * x) + (matrix.c * y) + (matrix.e),
+          (matrix.b * x) + (matrix.d * y) + (matrix.f)
+        ]
+      end
+    end
+
     def default_encoding(font_name)
       case font_name.to_s
       when "Symbol" then
@@ -111,37 +149,55 @@ class PDF::Reader
       end
     end
 
-    def extract_base_info(obj)
-      @subtype  = @ohash.object(obj[:Subtype])
-      @basefont = @ohash.object(obj[:BaseFont])
-      if @ohash.object(obj[:Encoding])
-        @encoding = PDF::Reader::Encoding.new(@ohash.object(obj[:Encoding]))
+    def build_encoding(obj)
+      if obj[:Encoding].is_a?(Symbol)
+        # one of the standard encodings, referenced by name
+        # TODO pass in a standard shape, always a Hash
+        PDF::Reader::Encoding.new(obj[:Encoding])
+      elsif obj[:Encoding].is_a?(Hash) || obj[:Encoding].is_a?(PDF::Reader::Stream)
+        PDF::Reader::Encoding.new(obj[:Encoding])
+      elsif obj[:Encoding].nil?
+        default_encoding(@basefont)
       else
-        @encoding = default_encoding(@basefont)
+        raise MalformedPDFError, "Unexpected type for Encoding (#{obj[:Encoding].class})"
       end
-      @widths   = @ohash.object(obj[:Widths]) || []
-      @first_char = @ohash.object(obj[:FirstChar])
-      @last_char = @ohash.object(obj[:LastChar])
+    end
+
+    def extract_base_info(obj)
+      @subtype  = @ohash.deref_name(obj[:Subtype])
+      @basefont = @ohash.deref_name(obj[:BaseFont])
+      @encoding = build_encoding(obj)
+      @widths   = @ohash.deref_array_of_numbers(obj[:Widths]) || []
+      @first_char = @ohash.deref_integer(obj[:FirstChar])
+      @last_char = @ohash.deref_integer(obj[:LastChar])
 
       # CID Fonts are not required to have a W or DW entry, if they don't exist,
       # the default cid width = 1000, see Section 9.7.4.1 PDF 32000-1:2008 pp 269
-      @cid_widths         = @ohash.object(obj[:W])  || []
-      @cid_default_width  = @ohash.object(obj[:DW]) || 1000
+      @cid_widths         = @ohash.deref_array(obj[:W])  || []
+      @cid_default_width  = @ohash.deref_number(obj[:DW]) || 1000
 
       if obj[:ToUnicode]
         # ToUnicode is optional for Type1 and Type3
-        stream = @ohash.object(obj[:ToUnicode])
-        if stream.is_a?(PDF::Reader::Stream)
+        stream = @ohash.deref_stream(obj[:ToUnicode])
+        if stream
           @tounicode = PDF::Reader::CMap.new(stream.unfiltered_data)
         end
       end
     end
 
+    def extract_type3_info(obj)
+      if @subtype == :Type3
+        @font_matrix = @ohash.deref_array_of_numbers(obj[:FontMatrix]) || [
+          0.001, 0, 0, 0.001, 0, 0
+        ]
+      end
+    end
+
     def extract_descriptor(obj)
       if obj[:FontDescriptor]
         # create a font descriptor object if we can, in other words, unless this is
         # a CID Font
-        fd = @ohash.object(obj[:FontDescriptor])
+        fd = @ohash.deref_hash(obj[:FontDescriptor])
         @font_descriptor = PDF::Reader::FontDescriptor.new(@ohash, fd)
       else
         @font_descriptor = nil
@@ -153,9 +209,9 @@ class PDF::Reader
       # per PDF 32000-1:2008 pp. 280 :DescendentFonts is:
       # A one-element array specifying the CIDFont dictionary that is the
       # descendant of this Type 0 font.
-      descendants = @ohash.object(obj[:DescendantFonts])
+      descendants = @ohash.deref_array(obj[:DescendantFonts])
       @descendantfonts = descendants.map { |desc|
-        PDF::Reader::Font.new(@ohash, @ohash.object(desc))
+        PDF::Reader::Font.new(@ohash, @ohash.deref_hash(desc))
       }
     end
 
diff --git a/lib/pdf/reader/font_descriptor.rb b/lib/pdf/reader/font_descriptor.rb
index 1f22aa7..9d9b821 100644
--- a/lib/pdf/reader/font_descriptor.rb
+++ b/lib/pdf/reader/font_descriptor.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 require 'ttfunk'
@@ -14,22 +15,23 @@ class PDF::Reader
                 :x_height, :font_flags
 
     def initialize(ohash, fd_hash)
-      @ascent                = ohash.object(fd_hash[:Ascent])    || 0
-      @descent               = ohash.object(fd_hash[:Descent])   || 0
-      @missing_width         = ohash.object(fd_hash[:MissingWidth]) || 0
-      @font_bounding_box     = ohash.object(fd_hash[:FontBBox])  || [0,0,0,0]
-      @avg_width             = ohash.object(fd_hash[:AvgWidth])  || 0
-      @cap_height            = ohash.object(fd_hash[:CapHeight]) || 0
-      @font_flags            = ohash.object(fd_hash[:Flags])     || 0
-      @italic_angle          = ohash.object(fd_hash[:ItalicAngle])
-      @font_name             = ohash.object(fd_hash[:FontName]).to_s
-      @leading               = ohash.object(fd_hash[:Leading])   || 0
-      @max_width             = ohash.object(fd_hash[:MaxWidth])  || 0
-      @stem_v                = ohash.object(fd_hash[:StemV])
-      @x_height              = ohash.object(fd_hash[:XHeight])
-      @font_stretch          = ohash.object(fd_hash[:FontStretch]) || :Normal
-      @font_weight           = ohash.object(fd_hash[:FontWeight])  || 400
-      @font_family           = ohash.object(fd_hash[:FontFamily])
+      # TODO change these to typed derefs
+      @ascent                = ohash.deref_number(fd_hash[:Ascent])    || 0
+      @descent               = ohash.deref_number(fd_hash[:Descent])   || 0
+      @missing_width         = ohash.deref_number(fd_hash[:MissingWidth]) || 0
+      @font_bounding_box     = ohash.deref_array_of_numbers(fd_hash[:FontBBox])  || [0,0,0,0]
+      @avg_width             = ohash.deref_number(fd_hash[:AvgWidth])  || 0
+      @cap_height            = ohash.deref_number(fd_hash[:CapHeight]) || 0
+      @font_flags            = ohash.deref_integer(fd_hash[:Flags])     || 0
+      @italic_angle          = ohash.deref_number(fd_hash[:ItalicAngle])
+      @font_name             = ohash.deref_name(fd_hash[:FontName]).to_s
+      @leading               = ohash.deref_number(fd_hash[:Leading])   || 0
+      @max_width             = ohash.deref_number(fd_hash[:MaxWidth])  || 0
+      @stem_v                = ohash.deref_number(fd_hash[:StemV])
+      @x_height              = ohash.deref_number(fd_hash[:XHeight])
+      @font_stretch          = ohash.deref_name(fd_hash[:FontStretch]) || :Normal
+      @font_weight           = ohash.deref_number(fd_hash[:FontWeight])  || 400
+      @font_family           = ohash.deref_string(fd_hash[:FontFamily])
 
       # A FontDescriptor may have an embedded font program in FontFile
       # (Type 1 Font Program), FontFile2 (TrueType font program), or
@@ -39,7 +41,7 @@ class PDF::Reader
       # 2) CIDFontType0C: Type 0 Font Program in Compact Font Format
       # 3) OpenType:      OpenType Font Program
       # see Section 9.9, PDF 32000-1:2008, pp 288-292
-      @font_program_stream = ohash.object(fd_hash[:FontFile2])
+      @font_program_stream = ohash.deref_stream(fd_hash[:FontFile2])
       #TODO handle FontFile and FontFile3
 
       @is_ttf = true if @font_program_stream
diff --git a/lib/pdf/reader/form_xobject.rb b/lib/pdf/reader/form_xobject.rb
index 6572fe2..5c6bb1a 100644
--- a/lib/pdf/reader/form_xobject.rb
+++ b/lib/pdf/reader/form_xobject.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 require 'digest/md5'
@@ -14,15 +15,24 @@ module PDF
     # This behaves and looks much like a limited PDF::Reader::Page class.
     #
     class FormXObject
-      include ResourceMethods
+      extend Forwardable
 
       attr_reader :xobject
 
+      def_delegators :resources, :color_spaces
+      def_delegators :resources, :fonts
+      def_delegators :resources, :graphic_states
+      def_delegators :resources, :patterns
+      def_delegators :resources, :procedure_sets
+      def_delegators :resources, :properties
+      def_delegators :resources, :shadings
+      def_delegators :resources, :xobjects
+
       def initialize(page, xobject, options = {})
         @page    = page
         @objects = page.objects
         @cache   = options[:cache] || {}
-        @xobject = @objects.deref(xobject)
+        @xobject = @objects.deref_stream(xobject)
       end
 
       # return a hash of fonts used on this form.
@@ -33,9 +43,9 @@ module PDF
       # to most available metrics for each font.
       #
       def font_objects
-        raw_fonts = @objects.deref(resources[:Font] || {})
+        raw_fonts = @objects.deref_hash(fonts)
         ::Hash[raw_fonts.map { |label, font|
-          [label, PDF::Reader::Font.new(@objects, @objects.deref(font))]
+          [label, PDF::Reader::Font.new(@objects, @objects.deref_hash(font))]
         }]
       end
 
@@ -60,7 +70,7 @@ module PDF
       # Returns the resources that accompany this form.
       #
       def resources
-        @resources ||= @objects.deref(@xobject.hash[:Resources]) || {}
+        @resources ||= Resources.new(@objects, @objects.deref_hash(@xobject.hash[:Resources]) || {})
       end
 
       def callback(receivers, name, params=[])
diff --git a/lib/pdf/reader/glyph_hash.rb b/lib/pdf/reader/glyph_hash.rb
index 1df113e..8674a1c 100644
--- a/lib/pdf/reader/glyph_hash.rb
+++ b/lib/pdf/reader/glyph_hash.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 ################################################################################
@@ -103,19 +104,25 @@ class PDF::Reader
 
     # returns a hash that maps glyph names to unicode codepoints. The mapping is based on
     # a text file supplied by Adobe at:
-    # http://www.adobe.com/devnet/opentype/archives/glyphlist.txt
+    # https://github.com/adobe-type-tools/agl-aglfn
     def load_adobe_glyph_mapping
       keyed_by_name      = {}
       keyed_by_codepoint = {}
 
-      File.open(File.dirname(__FILE__) + "/glyphlist.txt", "r:BINARY") do |f|
-        f.each do |l|
-          _m, name, code = *l.match(/([0-9A-Za-z]+);([0-9A-F]{4})/)
-          if name && code
-            cp = "0x#{code}".hex
-            keyed_by_name[name.to_sym]   = cp
-            keyed_by_codepoint[cp]     ||= []
-            keyed_by_codepoint[cp]     << name.to_sym
+      paths = [
+        File.dirname(__FILE__) + "/glyphlist.txt",
+        File.dirname(__FILE__) + "/glyphlist-zapfdingbats.txt",
+      ]
+      paths.each do |path|
+        File.open(path, "r:BINARY") do |f|
+          f.each do |l|
+            _m, name, code = *l.match(/([0-9A-Za-z]+);([0-9A-F]{4})/)
+            if name && code
+              cp = "0x#{code}".hex
+              keyed_by_name[name.to_sym]   = cp
+              keyed_by_codepoint[cp]     ||= []
+              keyed_by_codepoint[cp]     << name.to_sym
+            end
           end
         end
       end
diff --git a/lib/pdf/reader/glyphlist-zapfdingbats.txt b/lib/pdf/reader/glyphlist-zapfdingbats.txt
new file mode 100644
index 0000000..ab52700
--- /dev/null
+++ b/lib/pdf/reader/glyphlist-zapfdingbats.txt
@@ -0,0 +1,245 @@
+# -----------------------------------------------------------
+# Copyright 2002-2019 Adobe (http://www.adobe.com/).
+#
+# 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 Adobe 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 HOLDER 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.
+# -----------------------------------------------------------
+# Name:          ITC Zapf Dingbats Glyph List
+# Table version: 2.0
+# Date:          September 20, 2002
+# URL:           https://github.com/adobe-type-tools/agl-aglfn
+#
+# Format: two semicolon-delimited fields:
+#   (1) glyph name--upper/lowercase letters and digits
+#   (2) Unicode scalar value--four uppercase hexadecimal digits
+#
+a100;275E
+a101;2761
+a102;2762
+a103;2763
+a104;2764
+a105;2710
+a106;2765
+a107;2766
+a108;2767
+a109;2660
+a10;2721
+a110;2665
+a111;2666
+a112;2663
+a117;2709
+a118;2708
+a119;2707
+a11;261B
+a120;2460
+a121;2461
+a122;2462
+a123;2463
+a124;2464
+a125;2465
+a126;2466
+a127;2467
+a128;2468
+a129;2469
+a12;261E
+a130;2776
+a131;2777
+a132;2778
+a133;2779
+a134;277A
+a135;277B
+a136;277C
+a137;277D
+a138;277E
+a139;277F
+a13;270C
+a140;2780
+a141;2781
+a142;2782
+a143;2783
+a144;2784
+a145;2785
+a146;2786
+a147;2787
+a148;2788
+a149;2789
+a14;270D
+a150;278A
+a151;278B
+a152;278C
+a153;278D
+a154;278E
+a155;278F
+a156;2790
+a157;2791
+a158;2792
+a159;2793
+a15;270E
+a160;2794
+a161;2192
+a162;27A3
+a163;2194
+a164;2195
+a165;2799
+a166;279B
+a167;279C
+a168;279D
+a169;279E
+a16;270F
+a170;279F
+a171;27A0
+a172;27A1
+a173;27A2
+a174;27A4
+a175;27A5
+a176;27A6
+a177;27A7
+a178;27A8
+a179;27A9
+a17;2711
+a180;27AB
+a181;27AD
+a182;27AF
+a183;27B2
+a184;27B3
+a185;27B5
+a186;27B8
+a187;27BA
+a188;27BB
+a189;27BC
+a18;2712
+a190;27BD
+a191;27BE
+a192;279A
+a193;27AA
+a194;27B6
+a195;27B9
+a196;2798
+a197;27B4
+a198;27B7
+a199;27AC
+a19;2713
+a1;2701
+a200;27AE
+a201;27B1
+a202;2703
+a203;2750
+a204;2752
+a205;276E
+a206;2770
+a20;2714
+a21;2715
+a22;2716
+a23;2717
+a24;2718
+a25;2719
+a26;271A
+a27;271B
+a28;271C
+a29;2722
+a2;2702
+a30;2723
+a31;2724
+a32;2725
+a33;2726
+a34;2727
+a35;2605
+a36;2729
+a37;272A
+a38;272B
+a39;272C
+a3;2704
+a40;272D
+a41;272E
+a42;272F
+a43;2730
+a44;2731
+a45;2732
+a46;2733
+a47;2734
+a48;2735
+a49;2736
+a4;260E
+a50;2737
+a51;2738
+a52;2739
+a53;273A
+a54;273B
+a55;273C
+a56;273D
+a57;273E
+a58;273F
+a59;2740
+a5;2706
+a60;2741
+a61;2742
+a62;2743
+a63;2744
+a64;2745
+a65;2746
+a66;2747
+a67;2748
+a68;2749
+a69;274A
+a6;271D
+a70;274B
+a71;25CF
+a72;274D
+a73;25A0
+a74;274F
+a75;2751
+a76;25B2
+a77;25BC
+a78;25C6
+a79;2756
+a7;271E
+a81;25D7
+a82;2758
+a83;2759
+a84;275A
+a85;276F
+a86;2771
+a87;2772
+a88;2773
+a89;2768
+a8;271F
+a90;2769
+a91;276C
+a92;276D
+a93;276A
+a94;276B
+a95;2774
+a96;2775
+a97;275B
+a98;275C
+a99;275D
+a9;2720
+# END
diff --git a/lib/pdf/reader/key_builder_v5.rb b/lib/pdf/reader/key_builder_v5.rb
new file mode 100644
index 0000000..c94f8e7
--- /dev/null
+++ b/lib/pdf/reader/key_builder_v5.rb
@@ -0,0 +1,138 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+require 'digest/md5'
+require 'rc4'
+
+class PDF::Reader
+
+  # Processes the Encrypt dict from an encrypted PDF and a user provided
+  # password and returns a key that can decrypt the file.
+  #
+  # This can generate a decryption key compatible with the following standard encryption algorithms:
+  #
+  # * Version 5 (AESV3)
+  #
+  class KeyBuilderV5
+
+    def initialize(opts = {})
+      @key_length   = 256
+
+      # hash(32B) + validation salt(8B) + key salt(8B)
+      @owner_key    = opts[:owner_key] || ""
+
+      # hash(32B) + validation salt(8B) + key salt(8B)
+      @user_key     = opts[:user_key] || ""
+
+      # decryption key, encrypted w/ owner password
+      @owner_encryption_key = opts[:owner_encryption_key] || ""
+
+      # decryption key, encrypted w/ user password
+      @user_encryption_key  = opts[:user_encryption_key] || ""
+    end
+
+    # Takes a string containing a user provided password.
+    #
+    # If the password matches the file, then a string containing a key suitable for
+    # decrypting the file will be returned. If the password doesn't match the file,
+    # and exception will be raised.
+    #
+    def key(pass)
+      pass = pass.byteslice(0...127).to_s   # UTF-8 encoded password. first 127 bytes
+
+      encrypt_key   = auth_owner_pass(pass)
+      encrypt_key ||= auth_user_pass(pass)
+      encrypt_key ||= auth_owner_pass_r6(pass)
+      encrypt_key ||= auth_user_pass_r6(pass)
+
+      raise PDF::Reader::EncryptedPDFError, "Invalid password (#{pass})" if encrypt_key.nil?
+      encrypt_key
+    end
+
+    private
+
+    # Algorithm 3.2a - Computing an encryption key
+    #
+    # Defined in PDF 1.7 Extension Level 3
+    #
+    # if the string is a valid user/owner password, this will return the decryption key
+    #
+    def auth_owner_pass(password)
+      if Digest::SHA256.digest(password + @owner_key[32..39] + @user_key) == @owner_key[0..31]
+        cipher = OpenSSL::Cipher.new('AES-256-CBC')
+        cipher.decrypt
+        cipher.key = Digest::SHA256.digest(password + @owner_key[40..-1] + @user_key)
+        cipher.iv = "\x00" * 16
+        cipher.padding = 0
+        cipher.update(@owner_encryption_key) + cipher.final
+      end
+    end
+
+    def auth_user_pass(password)
+      if Digest::SHA256.digest(password + @user_key[32..39]) == @user_key[0..31]
+        cipher = OpenSSL::Cipher.new('AES-256-CBC')
+        cipher.decrypt
+        cipher.key = Digest::SHA256.digest(password + @user_key[40..-1])
+        cipher.iv = "\x00" * 16
+        cipher.padding = 0
+        cipher.update(@user_encryption_key) + cipher.final
+      end
+    end
+
+    def auth_owner_pass_r6(password)
+      if r6_digest(password, @owner_key[32..39].to_s, @user_key[0,48].to_s) == @owner_key[0..31]
+        cipher = OpenSSL::Cipher.new('AES-256-CBC')
+        cipher.decrypt
+        cipher.key = r6_digest(password, @owner_key[40,8].to_s, @user_key[0, 48].to_s)
+        cipher.iv = "\x00" * 16
+        cipher.padding = 0
+        cipher.update(@owner_encryption_key) + cipher.final
+      end
+    end
+
+    def auth_user_pass_r6(password)
+      if r6_digest(password, @user_key[32..39].to_s) == @user_key[0..31]
+        cipher = OpenSSL::Cipher.new('AES-256-CBC')
+        cipher.decrypt
+        cipher.key = r6_digest(password, @user_key[40,8].to_s)
+        cipher.iv = "\x00" * 16
+        cipher.padding = 0
+        cipher.update(@user_encryption_key) + cipher.final
+      end
+    end
+
+    # PDF 2.0 spec, 7.6.4.3.4
+    # Algorithm 2.B: Computing a hash (revision 6 and later)
+    def r6_digest(password, salt, user_key = '')
+      k = Digest::SHA256.digest(password + salt + user_key)
+      e = ''
+
+      i = 0
+      while i < 64 or e.getbyte(-1).to_i > i - 32
+        k1 = (password + k + user_key) * 64
+
+        aes = OpenSSL::Cipher.new("aes-128-cbc").encrypt
+        aes.key = k[0, 16].to_s
+        aes.iv = k[16, 16].to_s
+        aes.padding = 0
+        e = String.new(aes.update(k1))
+        k = case unpack_128bit_bigendian_int(e) % 3
+            when 0 then Digest::SHA256.digest(e)
+            when 1 then Digest::SHA384.digest(e)
+            when 2 then Digest::SHA512.digest(e)
+            end
+        i = i + 1
+      end
+
+      k[0, 32].to_s
+    end
+
+    def unpack_128bit_bigendian_int(str)
+      ints = str[0,16].to_s.unpack("N*")
+      (ints[0].to_i << 96) + (ints[1].to_i << 64) + (ints[2].to_i << 32) + ints[3].to_i
+    end
+
+  end
+end
+
diff --git a/lib/pdf/reader/lzw.rb b/lib/pdf/reader/lzw.rb
index 05bc65c..dfdea1f 100644
--- a/lib/pdf/reader/lzw.rb
+++ b/lib/pdf/reader/lzw.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 module PDF
@@ -35,9 +36,9 @@ module PDF
 
         def read
           bits_left_in_chunk = @bits_in_chunk
-          chunk = nil
+          chunk = -1
           while bits_left_in_chunk > 0 and @current_pos < @data.size
-            chunk = 0 if chunk.nil?
+            chunk = 0 if chunk < 0
             codepoint = @data[@current_pos, 1].unpack("C*")[0]
             current_byte = codepoint & (2**@bits_left_in_byte - 1) #clear consumed bits
             dif = bits_left_in_chunk - @bits_left_in_byte
@@ -83,6 +84,7 @@ module PDF
       #
       def self.decode(data)
         stream = BitStream.new data.to_s, 9 # size of codes between 9 and 12 bits
+        string_table = StringTable.new
         result = "".dup
         until (code = stream.read) == CODE_EOD
           if code == CODE_CLEAR_TABLE
diff --git a/lib/pdf/reader/null_security_handler.rb b/lib/pdf/reader/null_security_handler.rb
index 869cdd0..72b079b 100644
--- a/lib/pdf/reader/null_security_handler.rb
+++ b/lib/pdf/reader/null_security_handler.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 class PDF::Reader
@@ -6,10 +7,6 @@ class PDF::Reader
   # A null object security handler. Used when a PDF is unencrypted.
   class NullSecurityHandler
 
-    def self.supports?(encrypt)
-      encrypt.nil?
-    end
-
     def decrypt(buf, _ref)
       buf
     end
diff --git a/lib/pdf/reader/object_cache.rb b/lib/pdf/reader/object_cache.rb
index f139c6a..aa0b7fa 100644
--- a/lib/pdf/reader/object_cache.rb
+++ b/lib/pdf/reader/object_cache.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 require 'hashery/lru_hash'
diff --git a/lib/pdf/reader/object_hash.rb b/lib/pdf/reader/object_hash.rb
index cf01c1b..553e847 100644
--- a/lib/pdf/reader/object_hash.rb
+++ b/lib/pdf/reader/object_hash.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 class PDF::Reader
@@ -47,7 +48,11 @@ class PDF::Reader
       @trailer     = @xref.trailer
       @cache       = opts[:cache] || PDF::Reader::ObjectCache.new
       @sec_handler = NullSecurityHandler.new
-      @sec_handler = build_security_handler(opts)
+      @sec_handler = SecurityHandlerFactory.build(
+        deref(trailer[:Encrypt]),
+        deref(trailer[:ID]),
+        opts[:password]
+      )
     end
 
     # returns the type of object a ref points to
@@ -91,6 +96,218 @@ class PDF::Reader
     end
     alias :deref :object
 
+    # If key is a PDF::Reader::Reference object, lookup the corresponding
+    # object in the PDF and return it. Otherwise return key untouched.
+    #
+    # Guaranteed to only return an Array or nil. If the dereference results in
+    # any other type then a MalformedPDFError exception will raise. Useful when
+    # expecting an Array and no other type will do.
+    def deref_array(key)
+      obj = deref(key)
+
+      return obj if obj.nil?
+
+      obj.tap { |obj|
+        raise MalformedPDFError, "expected object to be an Array or nil" if !obj.is_a?(Array)
+      }
+    end
+
+    # If key is a PDF::Reader::Reference object, lookup the corresponding
+    # object in the PDF and return it. Otherwise return key untouched.
+    #
+    # Guaranteed to only return an Array of Numerics or nil. If the dereference results in
+    # any other type then a MalformedPDFError exception will raise. Useful when
+    # expecting an Array and no other type will do.
+    #
+    # Some effort to cast array elements to a number is made for any non-numeric elements.
+    def deref_array_of_numbers(key)
+      arr = deref(key)
+
+      return arr if arr.nil?
+
+      raise MalformedPDFError, "expected object to be an Array" unless arr.is_a?(Array)
+
+      arr.map { |item|
+        if item.is_a?(Numeric)
+          item
+        elsif item.respond_to?(:to_f)
+          item.to_f
+        elsif item.respond_to?(:to_i)
+          item.to_i
+        else
+          raise MalformedPDFError, "expected object to be a number"
+        end
+      }
+    end
+
+    # If key is a PDF::Reader::Reference object, lookup the corresponding
+    # object in the PDF and return it. Otherwise return key untouched.
+    #
+    # Guaranteed to only return a Hash or nil. If the dereference results in
+    # any other type then a MalformedPDFError exception will raise. Useful when
+    # expecting an Array and no other type will do.
+    def deref_hash(key)
+      obj = deref(key)
+
+      return obj if obj.nil?
+
+      obj.tap { |obj|
+        raise MalformedPDFError, "expected object to be a Hash or nil" if !obj.is_a?(Hash)
+      }
+    end
+
+    # If key is a PDF::Reader::Reference object, lookup the corresponding
+    # object in the PDF and return it. Otherwise return key untouched.
+    #
+    # Guaranteed to only return a PDF name (Symbol) or nil. If the dereference results in
+    # any other type then a MalformedPDFError exception will raise. Useful when
+    # expecting an Array and no other type will do.
+    #
+    # Some effort to cast to a symbol is made when the reference points to a non-symbol.
+    def deref_name(key)
+      obj = deref(key)
+
+      return obj if obj.nil?
+
+      if !obj.is_a?(Symbol)
+        if obj.respond_to?(:to_sym)
+          obj = obj.to_sym
+        else
+          raise MalformedPDFError, "expected object to be a Name"
+        end
+      end
+
+      obj
+    end
+
+    # If key is a PDF::Reader::Reference object, lookup the corresponding
+    # object in the PDF and return it. Otherwise return key untouched.
+    #
+    # Guaranteed to only return an Integer or nil. If the dereference results in
+    # any other type then a MalformedPDFError exception will raise. Useful when
+    # expecting an Array and no other type will do.
+    #
+    # Some effort to cast to an int is made when the reference points to a non-integer.
+    def deref_integer(key)
+      obj = deref(key)
+
+      return obj if obj.nil?
+
+      if !obj.is_a?(Integer)
+        if obj.respond_to?(:to_i)
+          obj = obj.to_i
+        else
+          raise MalformedPDFError, "expected object to be an Integer"
+        end
+      end
+
+      obj
+    end
+
+    # If key is a PDF::Reader::Reference object, lookup the corresponding
+    # object in the PDF and return it. Otherwise return key untouched.
+    #
+    # Guaranteed to only return a Numeric or nil. If the dereference results in
+    # any other type then a MalformedPDFError exception will raise. Useful when
+    # expecting an Array and no other type will do.
+    #
+    # Some effort to cast to a number is made when the reference points to a non-number.
+    def deref_number(key)
+      obj = deref(key)
+
+      return obj if obj.nil?
+
+      if !obj.is_a?(Numeric)
+        if obj.respond_to?(:to_f)
+          obj = obj.to_f
+        elsif obj.respond_to?(:to_i)
+          obj.to_i
+        else
+          raise MalformedPDFError, "expected object to be a number"
+        end
+      end
+
+      obj
+    end
+
+    # If key is a PDF::Reader::Reference object, lookup the corresponding
+    # object in the PDF and return it. Otherwise return key untouched.
+    #
+    # Guaranteed to only return a PDF::Reader::Stream or nil. If the dereference results in
+    # any other type then a MalformedPDFError exception will raise. Useful when
+    # expecting a stream and no other type will do.
+    def deref_stream(key)
+      obj = deref(key)
+
+      return obj if obj.nil?
+
+      obj.tap { |obj|
+        if !obj.is_a?(PDF::Reader::Stream)
+          raise MalformedPDFError, "expected object to be an Array or nil"
+        end
+      }
+    end
+
+    # If key is a PDF::Reader::Reference object, lookup the corresponding
+    # object in the PDF and return it. Otherwise return key untouched.
+    #
+    # Guaranteed to only return a String or nil. If the dereference results in
+    # any other type then a MalformedPDFError exception will raise. Useful when
+    # expecting a string and no other type will do.
+    #
+    # Some effort to cast to a string is made when the reference points to a non-string.
+    def deref_string(key)
+      obj = deref(key)
+
+      return obj if obj.nil?
+
+      if !obj.is_a?(String)
+        if obj.respond_to?(:to_s)
+          obj = obj.to_s
+        else
+          raise MalformedPDFError, "expected object to be a string"
+        end
+      end
+
+      obj
+    end
+
+    # If key is a PDF::Reader::Reference object, lookup the corresponding
+    # object in the PDF and return it. Otherwise return key untouched.
+    #
+    # Guaranteed to only return a PDF Name (symbol), Array or nil. If the dereference results in
+    # any other type then a MalformedPDFError exception will raise. Useful when
+    # expecting a Name or Array and no other type will do.
+    def deref_name_or_array(key)
+      obj = deref(key)
+
+      return obj if obj.nil?
+
+      obj.tap { |obj|
+        if !obj.is_a?(Symbol) && !obj.is_a?(Array)
+          raise MalformedPDFError, "expected object to be an Array or Name"
+        end
+      }
+    end
+
+    # If key is a PDF::Reader::Reference object, lookup the corresponding
+    # object in the PDF and return it. Otherwise return key untouched.
+    #
+    # Guaranteed to only return a PDF::Reader::Stream, Array or nil. If the dereference results in
+    # any other type then a MalformedPDFError exception will raise. Useful when
+    # expecting a stream or Array and no other type will do.
+    def deref_stream_or_array(key)
+      obj = deref(key)
+
+      return obj if obj.nil?
+
+      obj.tap { |obj|
+        if !obj.is_a?(PDF::Reader::Stream) && !obj.is_a?(Array)
+          raise MalformedPDFError, "expected object to be an Array or Stream"
+        end
+      }
+    end
+
     # Recursively dereferences the object refered to be +key+. If +key+ is not
     # a PDF::Reader::Reference, the key is returned unchanged.
     #
@@ -98,6 +315,22 @@ class PDF::Reader
       deref_internal!(key, {})
     end
 
+    def deref_array!(key)
+      deref!(key).tap { |obj|
+        if !obj.nil? && !obj.is_a?(Array)
+          raise MalformedPDFError, "expected object (#{obj.inspect}) to be an Array or nil"
+        end
+      }
+    end
+
+    def deref_hash!(key)
+      deref!(key).tap { |obj|
+        if !obj.nil? && !obj.is_a?(Hash)
+          raise MalformedPDFError, "expected object (#{obj.inspect}) to be a Hash or nil"
+        end
+      }
+    end
+
     # Access an object from the PDF. key can be an int or a PDF::Reader::Reference
     # object.
     #
@@ -232,7 +465,10 @@ class PDF::Reader
     #
     def page_references
       root  = fetch(trailer[:Root])
-      @page_references ||= get_page_objects(root[:Pages]).flatten
+      @page_references ||= begin
+                             pages_root = deref_hash(root[:Pages]) || {}
+                             get_page_objects(pages_root)
+                           end
     end
 
     def encrypted?
@@ -298,44 +534,18 @@ class PDF::Reader
       end
     end
 
-    def build_security_handler(opts = {})
-      encrypt = deref(trailer[:Encrypt])
-      if NullSecurityHandler.supports?(encrypt)
-        NullSecurityHandler.new
-      elsif StandardSecurityHandler.supports?(encrypt)
-        encmeta = !encrypt.has_key?(:EncryptMetadata) || encrypt[:EncryptMetadata].to_s == "true"
-        StandardSecurityHandler.new(
-          key_length: (encrypt[:Length] || 40).to_i,
-          revision: encrypt[:R],
-          owner_key: encrypt[:O],
-          user_key: encrypt[:U],
-          permissions: encrypt[:P].to_i,
-          encrypted_metadata: encmeta,
-          file_id: (deref(trailer[:ID]) || []).first,
-          password: opts[:password],
-          cfm: encrypt.fetch(:CF, {}).fetch(encrypt[:StmF], {}).fetch(:CFM, nil)
-        )
-      elsif StandardSecurityHandlerV5.supports?(encrypt)
-        StandardSecurityHandlerV5.new(
-            O: encrypt[:O],
-            U: encrypt[:U],
-            OE: encrypt[:OE],
-            UE: encrypt[:UE],
-            password: opts[:password]
-        )
-      else
-        UnimplementedSecurityHandler.new
-      end
-    end
-
     def decrypt(ref, obj)
       case obj
       when PDF::Reader::Stream then
-        obj.data = sec_handler.decrypt(obj.data, ref)
+        # PDF 32000-1:2008 7.5.8.2: "The cross-reference stream shall not be encrypted [...]."
+        # Therefore we shouldn't try to decrypt it.
+        obj.data = sec_handler.decrypt(obj.data, ref) unless obj.hash[:Type] == :XRef
         obj
       when Hash                then
-        arr = obj.map { |key,val| [key, decrypt(ref, val)] }.flatten(1)
-        Hash[*arr]
+        arr = obj.map { |key,val| [key, decrypt(ref, val)] }
+        arr.each_with_object({}) { |(k,v), accum|
+          accum[k] = v
+        }
       when Array               then
         obj.collect { |item| decrypt(ref, item) }
       when String
@@ -357,19 +567,19 @@ class PDF::Reader
       @object_stream ||= {}
     end
 
-    # returns a nested array of object references for all pages in this object store.
+    # returns an array of object references for all pages in this object store. The ordering of
+    # the Array is significant and matches the page ordering of the document
     #
-    def get_page_objects(ref)
-      obj = deref(ref)
-
-      unless obj.kind_of?(::Hash)
-        raise MalformedPDFError, "Dereferenced page object must be a dict"
-      end
-
+    def get_page_objects(obj)
       if obj[:Type] == :Page
-        ref
+        [obj]
       elsif obj[:Kids]
-        deref(obj[:Kids]).map { |kid| get_page_objects(kid) }
+        kids = deref_array(obj[:Kids]) || []
+        kids.map { |kid|
+          get_page_objects(deref_hash(kid) || {})
+        }.flatten
+      else
+        raise MalformedPDFError, "Expected Page or Pages object"
       end
     end
 
diff --git a/lib/pdf/reader/object_stream.rb b/lib/pdf/reader/object_stream.rb
index fb5042c..333edfa 100644
--- a/lib/pdf/reader/object_stream.rb
+++ b/lib/pdf/reader/object_stream.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 class PDF::Reader
diff --git a/lib/pdf/reader/orientation_detector.rb b/lib/pdf/reader/orientation_detector.rb
deleted file mode 100644
index 250551a..0000000
--- a/lib/pdf/reader/orientation_detector.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-# coding: utf-8
-# frozen_string_literal: true
-
-class PDF::Reader
-  # Small util class for detecting the orientation of a single PDF page. Accounts
-  # for any page rotation that is in place.
-  #
-  #     OrientationDetector.new(:MediaBox => [0,0,612,792]).orientation
-  #     => "portrait"
-  #
-  class OrientationDetector
-    def initialize(attributes)
-      @attributes = attributes
-    end
-
-    def orientation
-      @orientation ||= detect_orientation
-    end
-
-    private
-
-    def detect_orientation
-      llx,lly,urx,ury = @attributes[:MediaBox]
-      rotation        = @attributes[:Rotate].to_i
-      width           = (urx.to_i - llx.to_i).abs
-      height          = (ury.to_i - lly.to_i).abs
-      if width > height
-        (rotation % 180).zero? ? 'landscape' : 'portrait'
-      else
-        (rotation % 180).zero? ? 'portrait' : 'landscape'
-      end
-    end
-  end
-end
diff --git a/lib/pdf/reader/overlapping_runs_filter.rb b/lib/pdf/reader/overlapping_runs_filter.rb
index 972bedf..30b1dc6 100644
--- a/lib/pdf/reader/overlapping_runs_filter.rb
+++ b/lib/pdf/reader/overlapping_runs_filter.rb
@@ -1,4 +1,6 @@
+# typed: true
 # coding: utf-8
+# frozen_string_literal: true
 
 class PDF::Reader
   # remove duplicates from a collection of TextRun objects. This can be helpful when a PDF
@@ -38,7 +40,8 @@ class PDF::Reader
 
     def self.detect_intersection(sweep_line_status, event_point)
       sweep_line_status.each do |open_text_run|
-        if event_point.x >= open_text_run.x &&
+        if open_text_run.text == event_point.run.text &&
+            event_point.x >= open_text_run.x &&
             event_point.x <= open_text_run.endx &&
             open_text_run.intersection_area_percent(event_point.run) >= OVERLAPPING_THRESHOLD
           return true
@@ -51,10 +54,14 @@ class PDF::Reader
   # Utility class used to avoid modifying the underlying TextRun objects while we're
   # looking for duplicates
   class EventPoint
-    attr_reader :x, :run
 
-    def initialize x, run
-      @x, @run = x, run
+    attr_reader :x
+
+    attr_reader :run
+
+    def initialize(x, run)
+      @x = x
+      @run = run
     end
 
     def start?
diff --git a/lib/pdf/reader/page.rb b/lib/pdf/reader/page.rb
index e58448e..555d818 100644
--- a/lib/pdf/reader/page.rb
+++ b/lib/pdf/reader/page.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 module PDF
@@ -13,7 +14,7 @@ module PDF
     # objects accessor to help walk the page dictionary in any useful way.
     #
     class Page
-      include ResourceMethods
+      extend Forwardable
 
       # lowlevel hash-like access to all objects in the underlying PDF
       attr_reader :objects
@@ -26,6 +27,15 @@ module PDF
       # operations
       attr_reader :cache
 
+      def_delegators :resources, :color_spaces
+      def_delegators :resources, :fonts
+      def_delegators :resources, :graphic_states
+      def_delegators :resources, :patterns
+      def_delegators :resources, :procedure_sets
+      def_delegators :resources, :properties
+      def_delegators :resources, :shadings
+      def_delegators :resources, :xobjects
+
       # creates a new page wrapper.
       #
       # * objects - an ObjectHash instance that wraps a PDF file
@@ -33,7 +43,7 @@ module PDF
       #
       def initialize(objects, pagenum, options = {})
         @objects, @pagenum = objects, pagenum
-        @page_object = objects.deref(objects.page_references[pagenum - 1])
+        @page_object = objects.deref_hash(objects.page_references[pagenum - 1])
         @cache       = options[:cache] || {}
 
         unless @page_object.is_a?(::Hash)
@@ -59,7 +69,7 @@ module PDF
       def attributes
         @attributes ||= {}.tap { |hash|
           page_with_ancestors.reverse.each do |obj|
-            hash.merge!(@objects.deref(obj))
+            hash.merge!(@objects.deref_hash(obj) || {})
           end
         }
         # This shouldn't be necesary, but some non compliant PDFs leave MediaBox
@@ -68,22 +78,56 @@ module PDF
         @attributes
       end
 
+      def height
+        rect = Rectangle.new(*attributes[:MediaBox])
+        rect.apply_rotation(rotate) if rotate > 0
+        rect.height
+      end
+
+      def width
+        rect = Rectangle.new(*attributes[:MediaBox])
+        rect.apply_rotation(rotate) if rotate > 0
+        rect.width
+      end
+
+      def origin
+        rect = Rectangle.new(*attributes[:MediaBox])
+        rect.apply_rotation(rotate) if rotate > 0
+
+        rect.bottom_left
+      end
+
       # Convenience method to identify the page's orientation.
       #
       def orientation
-        OrientationDetector.new(attributes).orientation
+        if height > width
+          "portrait"
+        else
+          "landscape"
+        end
       end
 
       # returns the plain text content of this page encoded as UTF-8. Any
       # characters that can't be translated will be returned as a ▯
       #
-      def text
+      def text(opts = {})
         receiver = PageTextReceiver.new
         walk(receiver)
-        receiver.content
+        runs = receiver.runs(opts)
+
+        # rectangles[:MediaBox] can never be nil, but I have no easy way to tell sorbet that atm
+        mediabox = rectangles[:MediaBox] || Rectangle.new(0, 0, 0, 0)
+
+        PageLayout.new(runs, mediabox).to_s
       end
       alias :to_s :text
 
+      def runs(opts = {})
+        receiver = PageTextReceiver.new
+        walk(receiver)
+        receiver.runs(opts)
+      end
+
       # processes the raw content stream for this page in sequential order and
       # passes callbacks to the receiver objects.
       #
@@ -108,6 +152,9 @@ module PDF
       # the program in the correct order and calls out to your implementation.
       #
       def walk(*receivers)
+        receivers = receivers.map { |receiver|
+          ValidatingReceiver.new(receiver)
+        }
         callback(receivers, :page=, [self])
         content_stream(receivers, raw_content)
       end
@@ -116,10 +163,10 @@ module PDF
       # see here unless you're a PDF nerd like me.
       #
       def raw_content
-        contents = objects.deref(@page_object[:Contents])
+        contents = objects.deref_stream_or_array(@page_object[:Contents])
         [contents].flatten.compact.map { |obj|
-          objects.deref(obj)
-        }.map { |obj|
+          objects.deref_stream(obj)
+        }.compact.map { |obj|
           obj.unfiltered_data
         }.join(" ")
       end
@@ -139,30 +186,62 @@ module PDF
       # returns the "boxes" that define the page object.
       # values are defaulted according to section 7.7.3.3 of the PDF Spec 1.7
       #
+      # DEPRECATED. Recommend using Page#rectangles instead
+      #
       def boxes
-        mediabox = attributes[:MediaBox]
-        cropbox = attributes[:Cropbox] || mediabox
+        # In ruby 2.4+ we could use Hash#transform_values
+        Hash[rectangles.map{ |k,rect| [k,rect.to_a] } ]
+      end
+
+      # returns the "boxes" that define the page object.
+      # values are defaulted according to section 7.7.3.3 of the PDF Spec 1.7
+      #
+      def rectangles
+        # attributes[:MediaBox] can never be nil, but I have no easy way to tell sorbet that atm
+        mediabox = objects.deref_array_of_numbers(attributes[:MediaBox]) || []
+        cropbox = objects.deref_array_of_numbers(attributes[:CropBox]) || mediabox
+        bleedbox = objects.deref_array_of_numbers(attributes[:BleedBox]) || cropbox
+        trimbox = objects.deref_array_of_numbers(attributes[:TrimBox]) || cropbox
+        artbox = objects.deref_array_of_numbers(attributes[:ArtBox]) || cropbox
+
+        begin
+          mediarect = Rectangle.from_array(mediabox)
+          croprect = Rectangle.from_array(cropbox)
+          bleedrect = Rectangle.from_array(bleedbox)
+          trimrect = Rectangle.from_array(trimbox)
+          artrect = Rectangle.from_array(artbox)
+        rescue ArgumentError => e
+          raise MalformedPDFError, e.message
+        end
+
+        if rotate > 0
+          mediarect.apply_rotation(rotate)
+          croprect.apply_rotation(rotate)
+          bleedrect.apply_rotation(rotate)
+          trimrect.apply_rotation(rotate)
+          artrect.apply_rotation(rotate)
+        end
 
         {
-          MediaBox: objects.deref!(mediabox),
-          CropBox: objects.deref!(cropbox),
-          BleedBox: objects.deref!(attributes[:BleedBox] || cropbox),
-          TrimBox: objects.deref!(attributes[:TrimBox] || cropbox),
-          ArtBox: objects.deref!(attributes[:ArtBox] || cropbox)
+          MediaBox: mediarect,
+          CropBox: croprect,
+          BleedBox: bleedrect,
+          TrimBox: trimrect,
+          ArtBox: artrect,
         }
       end
 
       private
 
       def root
-        root ||= objects.deref(@objects.trailer[:Root])
+        @root ||= objects.deref_hash(@objects.trailer[:Root]) || {}
       end
 
       # Returns the resources that accompany this page. Includes
       # resources inherited from parents.
       #
       def resources
-        @resources ||= @objects.deref(attributes[:Resources]) || {}
+        @resources ||= Resources.new(@objects, @objects.deref_hash(attributes[:Resources]) || {})
       end
 
       def content_stream(receivers, instructions)
@@ -198,7 +277,8 @@ module PDF
         if origin.nil?
           []
         else
-          obj = objects.deref(origin)
+          obj = objects.deref_hash(origin)
+          PDF::Reader::Error.validate_not_nil_as_malformed(obj, "parent")
           [ select_inheritable(obj) ] + ancestors(obj[:Parent])
         end
       end
diff --git a/lib/pdf/reader/page_layout.rb b/lib/pdf/reader/page_layout.rb
index 984f641..ac26bf2 100644
--- a/lib/pdf/reader/page_layout.rb
+++ b/lib/pdf/reader/page_layout.rb
@@ -1,7 +1,9 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 require 'pdf/reader/overlapping_runs_filter'
+require 'pdf/reader/zero_width_runs_filter'
 
 class PDF::Reader
 
@@ -15,14 +17,15 @@ class PDF::Reader
     DEFAULT_FONT_SIZE = 12
 
     def initialize(runs, mediabox)
-      raise ArgumentError, "a mediabox must be provided" if mediabox.nil?
+      # mediabox is a 4-element array for now, but it'd be nice to switch to a
+      # PDF::Reader::Rectangle at some point
+      PDF::Reader::Error.validate_not_nil(mediabox, "mediabox")
 
-      @runs    = merge_runs(OverlappingRunsFilter.exclude_redundant_runs(runs))
+      @mediabox = process_mediabox(mediabox)
+      @runs = runs
       @mean_font_size   = mean(@runs.map(&:font_size)) || DEFAULT_FONT_SIZE
       @mean_font_size = DEFAULT_FONT_SIZE if @mean_font_size == 0
-      @mean_glyph_width = mean(@runs.map(&:mean_character_width)) || 0
-      @page_width  = (mediabox[2] - mediabox[0]).abs
-      @page_height = (mediabox[3] - mediabox[1]).abs
+      @median_glyph_width = median(@runs.map(&:mean_character_width)) || 0
       @x_offset = @runs.map(&:x).sort.first || 0
       lowest_y = @runs.map(&:y).sort.first || 0
       @y_offset = lowest_y > 0 ? 0 : lowest_y
@@ -30,6 +33,7 @@ class PDF::Reader
 
     def to_s
       return "" if @runs.empty?
+      return "" if row_count == 0
 
       page = row_count.times.map { |i| " " * col_count }
       @runs.each do |run|
@@ -44,6 +48,14 @@ class PDF::Reader
 
     private
 
+    def page_width
+      @mediabox.width
+    end
+
+    def page_height
+      @mediabox.height
+    end
+
     # given an array of strings, return a new array with empty rows from the
     # beginning and end removed.
     #
@@ -62,19 +74,19 @@ class PDF::Reader
     end
 
     def row_count
-      @row_count ||= (@page_height / @mean_font_size).floor
+      @row_count ||= (page_height / @mean_font_size).floor
     end
 
     def col_count
-      @col_count ||= ((@page_width  / @mean_glyph_width) * 1.05).floor
+      @col_count ||= ((page_width  / @median_glyph_width) * 1.05).floor
     end
 
     def row_multiplier
-      @row_multiplier ||= @page_height.to_f / row_count.to_f
+      @row_multiplier ||= page_height.to_f / row_count.to_f
     end
 
     def col_multiplier
-      @col_multiplier ||= @page_width.to_f / col_count.to_f
+      @col_multiplier ||= page_width.to_f / col_count.to_f
     end
 
     def mean(collection)
@@ -85,40 +97,28 @@ class PDF::Reader
       end
     end
 
-    def each_line(&block)
-      @runs.sort.group_by { |run|
-        run.y.to_i
-      }.map { |y, collection|
-        yield y, collection
-      }
+    def median(collection)
+      if collection.size == 0
+        0
+      else
+        collection.sort[(collection.size * 0.5).floor]
+      end
     end
 
-    # take a collection of TextRun objects and merge any that are in close
-    # proximity
-    def merge_runs(runs)
-      runs.group_by { |char|
-        char.y.to_i
-      }.map { |y, chars|
-        group_chars_into_runs(chars.sort)
-      }.flatten.sort
+    def local_string_insert(haystack, needle, index)
+      haystack[Range.new(index, index + needle.length - 1)] = String.new(needle)
     end
 
-    def group_chars_into_runs(chars)
-      runs = []
-      while head = chars.shift
-        if runs.empty?
-          runs << head
-        elsif runs.last.mergable?(head)
-          runs[-1] = runs.last + head
-        else
-          runs << head
-        end
+    def process_mediabox(mediabox)
+      if mediabox.is_a?(Array)
+        msg = "Passing the mediabox to PageLayout as an Array is deprecated," +
+          " please use a Rectangle instead"
+        $stderr.puts msg
+        PDF::Reader::Rectangle.from_array(mediabox)
+      else
+        mediabox
       end
-      runs
     end
 
-    def local_string_insert(haystack, needle, index)
-      haystack[Range.new(index, index + needle.length - 1)] = String.new(needle)
-    end
   end
 end
diff --git a/lib/pdf/reader/page_state.rb b/lib/pdf/reader/page_state.rb
index 7d81ff4..a8b7c50 100644
--- a/lib/pdf/reader/page_state.rb
+++ b/lib/pdf/reader/page_state.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 require 'pdf/reader/transformation_matrix'
@@ -30,15 +31,7 @@ class PDF::Reader
         @xobject_stack = [page.xobjects]
         @cs_stack      = [page.color_spaces]
         @stack         = [DEFAULT_GRAPHICS_STATE.dup]
-        if page.rotate == 0
-          state[:ctm]  = identity_matrix
-        else
-          rotate_cos = Math.cos(page.rotate * (Math::PI/180.0)).round(2)
-          rotate_sin = Math.sin(page.rotate * (Math::PI/180.0)).round(2)
-          state[:ctm] = TransformationMatrix.new(rotate_cos, rotate_sin,
-                                                 rotate_sin * -1, rotate_cos,
-                                                 0, 0)
-        end
+        state[:ctm]  = identity_matrix
       end
 
       #####################################################
@@ -320,7 +313,7 @@ class PDF::Reader
       #                 may need to be added
       #
       def process_glyph_displacement(w0, tj, word_boundary)
-        fs = font_size # font size
+        fs = state[:text_font_size]
         tc = state[:char_spacing]
         if word_boundary
           tw = state[:word_spacing]
@@ -330,22 +323,24 @@ class PDF::Reader
         th = state[:h_scaling]
         # optimise the common path to reduce Float allocations
         if th == 1 && tj == 0 && tc == 0 && tw == 0
-          glyph_width = w0 * fs
-          tx = glyph_width
+          tx = w0 * fs
+        elsif tj != 0
+          # don't apply spacing to TJ displacement
+          tx = (w0 - (tj/1000.0)) * fs * th
         else
-          glyph_width = ((w0 - (tj/1000.0)) * fs) * th
-          tx = glyph_width + ((tc + tw) * th)
+          # apply horizontal scaling to spacing values but not font size
+          tx = ((w0 * fs) + tc + tw) * th
         end
-
-        # TODO: I'm pretty sure that tx shouldn't need to be divided by
-        #       ctm[0] here, but this gets my tests green and I'm out of
-        #       ideas for now
         # TODO: support ty > 0
-        if ctm.a == 1 || ctm.a == 0
-          @text_matrix.horizontal_displacement_multiply!(tx)
-        else
-          @text_matrix.horizontal_displacement_multiply!(tx/ctm.a)
-        end
+        ty = 0
+        temp = TransformationMatrix.new(1, 0,
+                                        0, 1,
+                                        tx, ty)
+        @text_matrix = temp.multiply!(
+          @text_matrix.a, @text_matrix.b,
+          @text_matrix.c, @text_matrix.d,
+          @text_matrix.e, @text_matrix.f
+        )
         @font_size = @text_rendering_matrix = nil # invalidate cached value
       end
 
@@ -389,7 +384,7 @@ class PDF::Reader
       #
       def build_fonts(raw_fonts)
         wrapped_fonts = raw_fonts.map { |label, font|
-          [label, PDF::Reader::Font.new(@objects, @objects.deref(font))]
+          [label, PDF::Reader::Font.new(@objects, @objects.deref_hash(font) || {})]
         }
 
         ::Hash[wrapped_fonts]
diff --git a/lib/pdf/reader/page_text_receiver.rb b/lib/pdf/reader/page_text_receiver.rb
index 6d38a2d..5c2f09c 100644
--- a/lib/pdf/reader/page_text_receiver.rb
+++ b/lib/pdf/reader/page_text_receiver.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 require 'forwardable'
@@ -41,16 +42,37 @@ module PDF
       # starting a new page
       def page=(page)
         @state = PageState.new(page)
+        @page = page
         @content = []
         @characters = []
-        @mediabox = page.objects.deref(page.attributes[:MediaBox])
-        device_bl = @state.ctm_transform(@mediabox[0], @mediabox[1])
-        device_tr = @state.ctm_transform(@mediabox[2], @mediabox[3])
-        @device_mediabox = [ device_bl.first, device_bl.last, device_tr.first, device_tr.last]
       end
 
+      def runs(opts = {})
+        runs = @characters
+
+        if rect = opts.fetch(:rect, @page.rectangles[:CropBox])
+          runs = BoundingRectangleRunsFilter.runs_within_rect(runs, rect)
+        end
+
+        if opts.fetch(:skip_zero_width, true)
+          runs = ZeroWidthRunsFilter.exclude_zero_width_runs(runs)
+        end
+
+        if opts.fetch(:skip_overlapping, true)
+          runs = OverlappingRunsFilter.exclude_redundant_runs(runs)
+        end
+
+        if opts.fetch(:merge, true)
+          runs = merge_runs(runs)
+        end
+
+        runs
+      end
+
+      # deprecated
       def content
-        PageLayout.new(@characters, @device_mediabox).to_s
+        mediabox = @page.rectangles[:MediaBox]
+        PageLayout.new(runs, mediabox).to_s
       end
 
       #####################################################
@@ -65,8 +87,10 @@ module PDF
         params.each do |arg|
           if arg.is_a?(String)
             internal_show_text(arg)
-          else
+          elsif arg.is_a?(Numeric)
             @state.process_glyph_displacement(0, arg, false)
+          else
+            # skip it
           end
         end
       end
@@ -97,6 +121,7 @@ module PDF
       private
 
       def internal_show_text(string)
+        PDF::Reader::Error.validate_type_as_malformed(string, "string", String)
         if @state.current_font.nil?
           raise PDF::Reader::MalformedPDFError, "current font is invalid"
         end
@@ -104,11 +129,13 @@ module PDF
         glyphs.each_with_index do |glyph_code, index|
           # paint the current glyph
           newx, newy = @state.trm_transform(0,0)
+          newx, newy = apply_rotation(newx, newy)
+
           utf8_chars = @state.current_font.to_utf8(glyph_code)
 
           # apply to glyph displacment for the current glyph so the next
           # glyph will appear in the correct position
-          glyph_width = @state.current_font.glyph_width(glyph_code) / 1000.0
+          glyph_width = @state.current_font.glyph_width_in_text_space(glyph_code)
           th = 1
           scaled_glyph_width = glyph_width * @state.font_size * th
           unless utf8_chars == SPACE
@@ -118,6 +145,44 @@ module PDF
         end
       end
 
+      def apply_rotation(x, y)
+        if @page.rotate == 90
+          tmp = x
+          x = y
+          y = tmp * -1
+        elsif @page.rotate == 180
+          y *= -1
+          x *= -1
+        elsif @page.rotate == 270
+          tmp = y
+          y = x
+          x = tmp * -1
+        end
+        return x, y
+      end
+
+      # take a collection of TextRun objects and merge any that are in close
+      # proximity
+      def merge_runs(runs)
+        runs.group_by { |char|
+          char.y.to_i
+        }.map { |y, chars|
+          group_chars_into_runs(chars.sort)
+        }.flatten.sort
+      end
+
+      def group_chars_into_runs(chars)
+        chars.each_with_object([]) do |char, runs|
+          if runs.empty?
+            runs << char
+          elsif runs.last.mergable?(char)
+            runs[-1] = runs.last + char
+          else
+            runs << char
+          end
+        end
+      end
+
     end
   end
 end
diff --git a/lib/pdf/reader/pages_strategy.rb b/lib/pdf/reader/pages_strategy.rb
index d679b15..f06a9ed 100644
--- a/lib/pdf/reader/pages_strategy.rb
+++ b/lib/pdf/reader/pages_strategy.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 ################################################################################
diff --git a/lib/pdf/reader/parser.rb b/lib/pdf/reader/parser.rb
index 7364d97..8478334 100644
--- a/lib/pdf/reader/parser.rb
+++ b/lib/pdf/reader/parser.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 ################################################################################
@@ -79,8 +80,8 @@ class PDF::Reader
         token
       elsif operators.has_key? token
         Token.new(token)
-      elsif token.respond_to?(:to_token)
-        token.to_token
+      elsif token.frozen?
+        token
       elsif token =~ /\d*\.\d/
         token.to_f
       else
@@ -95,14 +96,20 @@ class PDF::Reader
     # id  - the object ID to return
     # gen - the object revision number to return
     def object(id, gen)
-      Error.assert_equal(parse_token, id)
+      idCheck = parse_token
+
+      # Sometimes the xref table is corrupt and points to an offset slightly too early in the file.
+      # check the next token, maybe we can find the start of the object we're looking for
+      if idCheck != id
+        Error.assert_equal(parse_token, id)
+      end
       Error.assert_equal(parse_token, gen)
       Error.str_assert(parse_token, "obj")
 
       obj = parse_token
       post_obj = parse_token
 
-      if post_obj == "stream"
+      if obj.is_a?(Hash) && post_obj == "stream"
         stream(obj)
       else
         obj
@@ -120,7 +127,7 @@ class PDF::Reader
         key = parse_token
         break if key.kind_of?(Token) and key == ">>"
         raise MalformedPDFError, "unterminated dict" if @buffer.empty?
-        raise MalformedPDFError, "Dictionary key (#{key.inspect}) is not a name" unless key.kind_of?(Symbol)
+        PDF::Reader::Error.validate_type_as_malformed(key, "Dictionary key", Symbol)
 
         value = parse_token
         value.kind_of?(Token) and Error.str_assert_not(value, ">>")
@@ -166,7 +173,9 @@ class PDF::Reader
 
       # add a missing digit if required, as required by the spec
       str << "0" unless str.size % 2 == 0
-      str.scan(/../).map {|i| i.hex.chr}.join.force_encoding("binary")
+      str.chars.each_slice(2).map { |nibbles|
+        nibbles.join("").hex.chr
+      }.join.force_encoding("binary")
     end
     ################################################################################
     # Reads a PDF String from the buffer and converts it to a Ruby String
@@ -175,15 +184,18 @@ class PDF::Reader
       return "".dup.force_encoding("binary") if str == ")"
       Error.assert_equal(parse_token, ")")
 
-      str.gsub!(/\\([nrtbf()\\\n]|\d{1,3})?|\r\n?|\n\r/m) do |match|
-        MAPPING[match] || "".dup
+      str.gsub!(/\\(\r\n|[nrtbf()\\\n\r]|([0-7]{1,3}))?|\r\n?/m) do |match|
+        if $2.nil? # not octal digits
+          MAPPING[match] || "".dup
+        else # must be octal digits
+          ($2.oct & 0xff).chr # ignore high level overflow
+        end
       end
       str.force_encoding("binary")
     end
 
     MAPPING = {
       "\r"   => "\n",
-      "\n\r" => "\n",
       "\r\n" => "\n",
       "\\n"  => "\n",
       "\\r"  => "\r",
@@ -194,24 +206,32 @@ class PDF::Reader
       "\\)"  => ")",
       "\\\\" => "\\",
       "\\\n" => "",
+      "\\\r" => "",
+      "\\\r\n" => "",
     }
-    0.upto(9)   { |n| MAPPING["\\00"+n.to_s] = ("00"+n.to_s).oct.chr }
-    0.upto(99)  { |n| MAPPING["\\0"+n.to_s]  = ("0"+n.to_s).oct.chr }
-    0.upto(377) { |n| MAPPING["\\"+n.to_s]   = n.to_s.oct.chr }
 
     ################################################################################
     # Decodes the contents of a PDF Stream and returns it as a Ruby String.
     def stream(dict)
       raise MalformedPDFError, "PDF malformed, missing stream length" unless dict.has_key?(:Length)
       if @objects
-        length = @objects.deref(dict[:Length])
+        length = @objects.deref_integer(dict[:Length])
+        if dict[:Filter]
+          dict[:Filter] = @objects.deref_name_or_array(dict[:Filter])
+        end
       else
         length = dict[:Length] || 0
       end
+
+      PDF::Reader::Error.validate_type_as_malformed(length, "length", Numeric)
+
       data = @buffer.read(length, :skip_eol => true)
 
       Error.str_assert(parse_token, "endstream")
-      Error.str_assert(parse_token, "endobj")
+
+      # We used to assert that the stream had the correct closing token, but it doesn't *really*
+      # matter if it's missing, and other readers seems to handle its absence just fine
+      # Error.str_assert(parse_token, "endobj")
 
       PDF::Reader::Stream.new(dict, data)
     end
diff --git a/lib/pdf/reader/point.rb b/lib/pdf/reader/point.rb
new file mode 100644
index 0000000..ec15f88
--- /dev/null
+++ b/lib/pdf/reader/point.rb
@@ -0,0 +1,25 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+module PDF
+  class Reader
+
+    # PDFs are all about positioning content on a page, so there's lots of need to
+    # work with a set of X,Y coordinates.
+    #
+    class Point
+
+      attr_reader :x, :y
+
+      def initialize(x, y)
+        @x, @y = x, y
+      end
+
+      def ==(other)
+        other.respond_to?(:x) && other.respond_to?(:y) && x == other.x && y == other.y
+      end
+
+    end
+  end
+end
diff --git a/lib/pdf/reader/print_receiver.rb b/lib/pdf/reader/print_receiver.rb
index 52e152e..0a0dd80 100644
--- a/lib/pdf/reader/print_receiver.rb
+++ b/lib/pdf/reader/print_receiver.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 class PDF::Reader
diff --git a/lib/pdf/reader/rc4_security_handler.rb b/lib/pdf/reader/rc4_security_handler.rb
new file mode 100644
index 0000000..20aaa33
--- /dev/null
+++ b/lib/pdf/reader/rc4_security_handler.rb
@@ -0,0 +1,38 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+require 'digest/md5'
+require 'rc4'
+
+class PDF::Reader
+
+  # Decrypts data using the RC4 algorithim defined in the PDF spec. Requires
+  # a decryption key, which is usually generated by PDF::Reader::StandardKeyBuilder
+  #
+  class Rc4SecurityHandler
+
+    def initialize(key)
+      @encrypt_key = key
+    end
+
+    ##7.6.2 General Encryption Algorithm
+    #
+    # Algorithm 1: Encryption of data using the RC4 algorithm
+    #
+    # version <=3 or (version == 4 and CFM == V2)
+    #
+    # buf - a string to decrypt
+    # ref - a PDF::Reader::Reference for the object to decrypt
+    #
+    def decrypt( buf, ref )
+      objKey = @encrypt_key.dup
+      (0..2).each { |e| objKey << (ref.id >> e*8 & 0xFF ) }
+      (0..1).each { |e| objKey << (ref.gen >> e*8 & 0xFF ) }
+      length = objKey.length < 16 ? objKey.length : 16
+      rc4 = RC4.new( Digest::MD5.digest(objKey)[0,length] )
+      rc4.decrypt(buf)
+    end
+
+  end
+end
diff --git a/lib/pdf/reader/rectangle.rb b/lib/pdf/reader/rectangle.rb
new file mode 100644
index 0000000..aca9c95
--- /dev/null
+++ b/lib/pdf/reader/rectangle.rb
@@ -0,0 +1,113 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+module PDF
+  class Reader
+
+    # PDFs represent rectangles all over the place. They're 4 element arrays, like this:
+    #
+    #     [A, B, C, D]
+    #
+    # Four element arrays are yucky to work with though, so here's a class that's better.
+    # Initialize it with the 4 elements, and get utility functions (width, height, etc)
+    # for free.
+    #
+    # By convention the first two elements are x1, y1, the co-ords for the bottom left corner
+    # of the rectangle. The third and fourth elements are x2, y2, the co-ords for the top left
+    # corner of the rectangle. It's valid for the alternative corners to be used though, so
+    # we don't assume which is which.
+    #
+    class Rectangle
+
+      attr_reader :bottom_left, :bottom_right, :top_left, :top_right
+
+      def initialize(x1, y1, x2, y2)
+        set_corners(x1, y1, x2, y2)
+      end
+
+      def self.from_array(arr)
+        if arr.size != 4
+          raise ArgumentError, "Only 4-element Arrays can be converted to a Rectangle"
+        end
+
+        PDF::Reader::Rectangle.new(
+          arr[0].to_f,
+          arr[1].to_f,
+          arr[2].to_f,
+          arr[3].to_f,
+        )
+      end
+
+      def ==(other)
+        to_a == other.to_a
+      end
+
+      def height
+        top_right.y - bottom_right.y
+      end
+
+      def width
+        bottom_right.x - bottom_left.x
+      end
+
+      def contains?(point)
+        point.x >= bottom_left.x && point.x <= top_right.x &&
+          point.y >= bottom_left.y && point.y <= top_right.y
+      end
+
+      # A pdf-style 4-number array
+      def to_a
+        [
+          bottom_left.x,
+          bottom_left.y,
+          top_right.x,
+          top_right.y,
+        ]
+      end
+
+      def apply_rotation(degrees)
+        return if degrees != 90 && degrees != 180 && degrees != 270
+
+        if degrees == 90
+          new_x1 = bottom_left.x
+          new_y1 = bottom_left.y - width
+          new_x2 = bottom_left.x + height
+          new_y2 = bottom_left.y
+        elsif degrees == 180
+          new_x1 = bottom_left.x - width
+          new_y1 = bottom_left.y - height
+          new_x2 = bottom_left.x
+          new_y2 = bottom_left.y
+        elsif degrees == 270
+          new_x1 = bottom_left.x - height
+          new_y1 = bottom_left.y
+          new_x2 = bottom_left.x
+          new_y2 = bottom_left.y + width
+        end
+        set_corners(new_x1 || 0, new_y1 || 0, new_x2 || 0, new_y2 || 0)
+      end
+
+      private
+
+      def set_corners(x1, y1, x2, y2)
+        @bottom_left = PDF::Reader::Point.new(
+          [x1, x2].min,
+          [y1, y2].min,
+        )
+        @bottom_right = PDF::Reader::Point.new(
+          [x1, x2].max,
+          [y1, y2].min,
+        )
+        @top_left = PDF::Reader::Point.new(
+          [x1, x2].min,
+          [y1, y2].max,
+        )
+        @top_right = PDF::Reader::Point.new(
+          [x1, x2].max,
+          [y1, y2].max,
+        )
+      end
+    end
+  end
+end
diff --git a/lib/pdf/reader/reference.rb b/lib/pdf/reader/reference.rb
index c31c04a..6b472b3 100644
--- a/lib/pdf/reader/reference.rb
+++ b/lib/pdf/reader/reference.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 ################################################################################
diff --git a/lib/pdf/reader/register_receiver.rb b/lib/pdf/reader/register_receiver.rb
index ab5d608..05af3c2 100644
--- a/lib/pdf/reader/register_receiver.rb
+++ b/lib/pdf/reader/register_receiver.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 # Copyright (C) 2010 James Healy (jimmy@deefa.com)
diff --git a/lib/pdf/reader/resource_methods.rb b/lib/pdf/reader/resources.rb
similarity index 81%
rename from lib/pdf/reader/resource_methods.rb
rename to lib/pdf/reader/resources.rb
index d6fb563..449eab4 100644
--- a/lib/pdf/reader/resource_methods.rb
+++ b/lib/pdf/reader/resources.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 module PDF
@@ -6,7 +7,13 @@ module PDF
 
     # mixin for common methods in Page and FormXobjects
     #
-    module ResourceMethods
+    class Resources
+
+      def initialize(objects, resources)
+        @objects = objects
+        @resources = resources
+      end
+
       # Returns a Hash of color spaces that are available to this page
       #
       # NOTE: this method de-serialise objects from the underlying PDF
@@ -14,7 +21,7 @@ module PDF
       #       of calling it over and over.
       #
       def color_spaces
-        @objects.deref!(resources[:ColorSpace]) || {}
+        @objects.deref_hash!(@resources[:ColorSpace]) || {}
       end
 
       # Returns a Hash of fonts that are available to this page
@@ -24,7 +31,7 @@ module PDF
       #       of calling it over and over.
       #
       def fonts
-        @objects.deref!(resources[:Font]) || {}
+        @objects.deref_hash!(@resources[:Font]) || {}
       end
 
       # Returns a Hash of external graphic states that are available to this
@@ -35,7 +42,7 @@ module PDF
       #       of calling it over and over.
       #
       def graphic_states
-        @objects.deref!(resources[:ExtGState]) || {}
+        @objects.deref_hash!(@resources[:ExtGState]) || {}
       end
 
       # Returns a Hash of patterns that are available to this page
@@ -45,7 +52,7 @@ module PDF
       #       of calling it over and over.
       #
       def patterns
-        @objects.deref!(resources[:Pattern]) || {}
+        @objects.deref_hash!(@resources[:Pattern]) || {}
       end
 
       # Returns an Array of procedure sets that are available to this page
@@ -55,7 +62,7 @@ module PDF
       #       of calling it over and over.
       #
       def procedure_sets
-        @objects.deref!(resources[:ProcSet]) || []
+        @objects.deref_array!(@resources[:ProcSet]) || []
       end
 
       # Returns a Hash of properties sets that are available to this page
@@ -65,7 +72,7 @@ module PDF
       #       of calling it over and over.
       #
       def properties
-        @objects.deref!(resources[:Properties]) || {}
+        @objects.deref_hash!(@resources[:Properties]) || {}
       end
 
       # Returns a Hash of shadings that are available to this page
@@ -75,7 +82,7 @@ module PDF
       #       of calling it over and over.
       #
       def shadings
-        @objects.deref!(resources[:Shading]) || {}
+        @objects.deref_hash!(@resources[:Shading]) || {}
       end
 
       # Returns a Hash of XObjects that are available to this page
@@ -85,7 +92,7 @@ module PDF
       #       of calling it over and over.
       #
       def xobjects
-        @objects.deref!(resources[:XObject]) || {}
+        @objects.deref_hash!(@resources[:XObject]) || {}
       end
 
     end
diff --git a/lib/pdf/reader/security_handler_factory.rb b/lib/pdf/reader/security_handler_factory.rb
new file mode 100644
index 0000000..30ca3e0
--- /dev/null
+++ b/lib/pdf/reader/security_handler_factory.rb
@@ -0,0 +1,79 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+class PDF::Reader
+  # Examines the Encrypt entry of a PDF trailer (if any) and returns an object that's
+  # able to decrypt the file.
+  class SecurityHandlerFactory
+
+    def self.build(encrypt, doc_id, password)
+      doc_id   ||= []
+      password ||= ""
+
+      if encrypt.nil?
+        NullSecurityHandler.new
+      elsif standard?(encrypt)
+        build_standard_handler(encrypt, doc_id, password)
+      elsif standard_v5?(encrypt)
+        build_v5_handler(encrypt, doc_id, password)
+      else
+        UnimplementedSecurityHandler.new
+      end
+    end
+
+    def self.build_standard_handler(encrypt, doc_id, password)
+      encmeta = !encrypt.has_key?(:EncryptMetadata) || encrypt[:EncryptMetadata].to_s == "true"
+      key_builder = StandardKeyBuilder.new(
+        key_length: (encrypt[:Length] || 40).to_i,
+        revision: encrypt[:R],
+        owner_key: encrypt[:O],
+        user_key: encrypt[:U],
+        permissions: encrypt[:P].to_i,
+        encrypted_metadata: encmeta,
+        file_id: doc_id.first,
+      )
+      cfm = encrypt.fetch(:CF, {}).fetch(encrypt[:StmF], {}).fetch(:CFM, nil)
+      if cfm == :AESV2
+        AesV2SecurityHandler.new(key_builder.key(password))
+      else
+        Rc4SecurityHandler.new(key_builder.key(password))
+      end
+    end
+
+    def self.build_v5_handler(encrypt, doc_id, password)
+      key_builder = KeyBuilderV5.new(
+        owner_key: encrypt[:O],
+        user_key: encrypt[:U],
+        owner_encryption_key: encrypt[:OE],
+        user_encryption_key: encrypt[:UE],
+      )
+      AesV3SecurityHandler.new(key_builder.key(password))
+    end
+
+    # This handler supports all encryption that follows upto PDF 1.5 spec (revision 4)
+    def self.standard?(encrypt)
+      return false if encrypt.nil?
+
+      filter = encrypt.fetch(:Filter, :Standard)
+      version = encrypt.fetch(:V, 0)
+      algorithm = encrypt.fetch(:CF, {}).fetch(encrypt[:StmF], {}).fetch(:CFM, nil)
+      (filter == :Standard) && (encrypt[:StmF] == encrypt[:StrF]) &&
+        (version <= 3 || (version == 4 && ((algorithm == :V2) || (algorithm == :AESV2))))
+    end
+
+    # This handler supports both
+    # - AES-256 encryption defined in PDF 1.7 Extension Level 3 ('revision 5')
+    # - AES-256 encryption defined in PDF 2.0 ('revision 6')
+    def self.standard_v5?(encrypt)
+      return false if encrypt.nil?
+
+      filter = encrypt.fetch(:Filter, :Standard)
+      version = encrypt.fetch(:V, 0)
+      revision = encrypt.fetch(:R, 0)
+      algorithm = encrypt.fetch(:CF, {}).fetch(encrypt[:StmF], {}).fetch(:CFM, nil)
+      (filter == :Standard) && (encrypt[:StmF] == encrypt[:StrF]) &&
+          ((version == 5) && (revision == 5 || revision == 6) && (algorithm == :AESV3))
+    end
+  end
+end
diff --git a/lib/pdf/reader/standard_security_handler.rb b/lib/pdf/reader/standard_key_builder.rb
similarity index 53%
rename from lib/pdf/reader/standard_security_handler.rb
rename to lib/pdf/reader/standard_key_builder.rb
index 695ba42..5ba0516 100644
--- a/lib/pdf/reader/standard_security_handler.rb
+++ b/lib/pdf/reader/standard_key_builder.rb
@@ -1,38 +1,19 @@
 # coding: utf-8
-# frozen_string_literal: true
 
-################################################################################
-#
-# Copyright (C) 2011 Evan J Brunner (ejbrun@appittome.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.
-#
-################################################################################
 require 'digest/md5'
-require 'openssl'
 require 'rc4'
 
 class PDF::Reader
 
-  # class creates interface to encrypt dictionary for use in Decrypt
-  class StandardSecurityHandler
+  # Processes the Encrypt dict from an encrypted PDF and a user provided
+  # password and returns a key that can decrypt the file.
+  #
+  # This can generate a key compatible with the following standard encryption algorithms:
+  #
+  # * Version 1-3, all variants
+  # * Version 4, V2 (RC4) and AESV2
+  #
+  class StandardKeyBuilder
 
     ## 7.6.3.3 Encryption Key Algorithm (pp61)
     #
@@ -44,9 +25,6 @@ class PDF::Reader
                      0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,
                      0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a ]
 
-    attr_reader :key_length, :revision, :encrypt_key
-    attr_reader :owner_key, :user_key, :permissions, :file_id, :password
-
     def initialize(opts = {})
       @key_length    = opts[:key_length].to_i/8
       @revision      = opts[:revision].to_i
@@ -55,72 +33,30 @@ class PDF::Reader
       @permissions   = opts[:permissions].to_i
       @encryptMeta   = opts.fetch(:encrypted_metadata, true)
       @file_id       = opts[:file_id] || ""
-      @encrypt_key   = build_standard_key(opts[:password] || "")
-      @cfm           = opts[:cfm]
 
       if @key_length != 5 && @key_length != 16
-        msg = "StandardSecurityHandler only supports 40 and 128 bit\
+        msg = "StandardKeyBuilder only supports 40 and 128 bit\
                encryption (#{@key_length * 8}bit)"
-        raise ArgumentError, msg
+        raise UnsupportedFeatureError, msg
       end
     end
 
-    # This handler supports all encryption that follows upto PDF 1.5 spec (revision 4)
-    def self.supports?(encrypt)
-      return false if encrypt.nil?
-
-      filter = encrypt.fetch(:Filter, :Standard)
-      version = encrypt.fetch(:V, 0)
-      algorithm = encrypt.fetch(:CF, {}).fetch(encrypt[:StmF], {}).fetch(:CFM, nil)
-      (filter == :Standard) && (encrypt[:StmF] == encrypt[:StrF]) &&
-        (version <= 3 || (version == 4 && ((algorithm == :V2) || (algorithm == :AESV2))))
-    end
-
-    ##7.6.2 General Encryption Algorithm
-    #
-    # Algorithm 1: Encryption of data using the RC4 or AES algorithms
-    #
-    # used to decrypt RC4/AES encrypted PDF streams (buf)
+    # Takes a string containing a user provided password.
     #
-    # buf - a string to decrypt
-    # ref - a PDF::Reader::Reference for the object to decrypt
+    # If the password matches the file, then a string containing a key suitable for
+    # decrypting the file will be returned. If the password doesn't match the file,
+    # and exception will be raised.
     #
-    def decrypt( buf, ref )
-      case @cfm
-        when :AESV2
-          decrypt_aes128(buf, ref)
-        else
-          decrypt_rc4(buf, ref)
-      end
-    end
-
-    private
+    def key(pass)
+      pass ||= ""
+      encrypt_key   = auth_owner_pass(pass)
+      encrypt_key ||= auth_user_pass(pass)
 
-    # decrypt with RC4 algorithm
-    # version <=3 or (version == 4 and CFM == V2)
-    def decrypt_rc4( buf, ref )
-      objKey = @encrypt_key.dup
-      (0..2).each { |e| objKey << (ref.id >> e*8 & 0xFF ) }
-      (0..1).each { |e| objKey << (ref.gen >> e*8 & 0xFF ) }
-      length = objKey.length < 16 ? objKey.length : 16
-      rc4 = RC4.new( Digest::MD5.digest(objKey)[0,length] )
-      rc4.decrypt(buf)
+      raise PDF::Reader::EncryptedPDFError, "Invalid password (#{pass})" if encrypt_key.nil?
+      encrypt_key
     end
 
-    # decrypt with AES-128-CBC algorithm
-    # when (version == 4 and CFM == AESV2)
-    def decrypt_aes128( buf, ref )
-      objKey = @encrypt_key.dup
-      (0..2).each { |e| objKey << (ref.id >> e*8 & 0xFF ) }
-      (0..1).each { |e| objKey << (ref.gen >> e*8 & 0xFF ) }
-      objKey << 'sAlT'  # Algorithm 1, b)
-      length = objKey.length < 16 ? objKey.length : 16
-      cipher = OpenSSL::Cipher.new("AES-#{length << 3}-CBC")
-      cipher.decrypt
-      cipher.key = Digest::MD5.digest(objKey)[0,length]
-      cipher.iv = buf[0..15]
-      cipher.update(buf[16..-1]) + cipher.final
-    end
+    private
 
     # Pads supplied password to 32bytes using PassPadBytes as specified on
     # pp61 of spec
@@ -152,7 +88,7 @@ class PDF::Reader
       md5 = Digest::MD5.digest(pad_pass(pass))
       if @revision > 2 then
         50.times { md5 = Digest::MD5.digest(md5) }
-        keyBegins = md5[0, key_length]
+        keyBegins = md5[0, @key_length]
         #first iteration decrypt owner_key
         out = @owner_key
         #RC4 keyed with (keyBegins XOR with iteration #) to decrypt previous out
@@ -217,12 +153,5 @@ class PDF::Reader
       end
     end
 
-    def build_standard_key(pass)
-      encrypt_key   = auth_owner_pass(pass)
-      encrypt_key ||= auth_user_pass(pass)
-
-      raise PDF::Reader::EncryptedPDFError, "Invalid password (#{pass})" if encrypt_key.nil?
-      encrypt_key
-    end
   end
 end
diff --git a/lib/pdf/reader/standard_security_handler_v5.rb b/lib/pdf/reader/standard_security_handler_v5.rb
deleted file mode 100644
index 89360af..0000000
--- a/lib/pdf/reader/standard_security_handler_v5.rb
+++ /dev/null
@@ -1,91 +0,0 @@
-# coding: utf-8
-# frozen_string_literal: true
-
-require 'digest'
-require 'openssl'
-
-class PDF::Reader
-
-  # class creates interface to encrypt dictionary for use in Decrypt
-  class StandardSecurityHandlerV5
-
-    attr_reader :key_length, :encrypt_key
-
-    def initialize(opts = {})
-      @key_length   = 256
-      @O            = opts[:O]   # hash(32B) + validation salt(8B) + key salt(8B)
-      @U            = opts[:U]   # hash(32B) + validation salt(8B) + key salt(8B)
-      @OE           = opts[:OE]  # decryption key, encrypted w/ owner password
-      @UE           = opts[:UE]  # decryption key, encrypted w/ user password
-      @encrypt_key  = build_standard_key(opts[:password] || '')
-    end
-
-    # This handler supports AES-256 encryption defined in PDF 1.7 Extension Level 3
-    def self.supports?(encrypt)
-      return false if encrypt.nil?
-
-      filter = encrypt.fetch(:Filter, :Standard)
-      version = encrypt.fetch(:V, 0)
-      revision = encrypt.fetch(:R, 0)
-      algorithm = encrypt.fetch(:CF, {}).fetch(encrypt[:StmF], {}).fetch(:CFM, nil)
-      (filter == :Standard) && (encrypt[:StmF] == encrypt[:StrF]) &&
-          ((version == 5) && (revision == 5) && (algorithm == :AESV3))
-    end
-
-    ##7.6.2 General Encryption Algorithm
-    #
-    # Algorithm 1: Encryption of data using the RC4 or AES algorithms
-    #
-    # used to decrypt RC4/AES encrypted PDF streams (buf)
-    #
-    # buf - a string to decrypt
-    # ref - a PDF::Reader::Reference for the object to decrypt
-    #
-    def decrypt( buf, ref )
-      cipher = OpenSSL::Cipher.new("AES-#{@key_length}-CBC")
-      cipher.decrypt
-      cipher.key = @encrypt_key.dup
-      cipher.iv = buf[0..15]
-      cipher.update(buf[16..-1]) + cipher.final
-    end
-
-    private
-    # Algorithm 3.2a - Computing an encryption key
-    #
-    # Defined in PDF 1.7 Extension Level 3
-    #
-    # if the string is a valid user/owner password, this will return the decryption key
-    #
-    def auth_owner_pass(password)
-      if Digest::SHA256.digest(password + @O[32..39] + @U) == @O[0..31]
-        cipher = OpenSSL::Cipher.new('AES-256-CBC')
-        cipher.decrypt
-        cipher.key = Digest::SHA256.digest(password + @O[40..-1] + @U)
-        cipher.iv = "\x00" * 16
-        cipher.padding = 0
-        cipher.update(@OE) + cipher.final
-      end
-    end
-
-    def auth_user_pass(password)
-      if Digest::SHA256.digest(password + @U[32..39]) == @U[0..31]
-        cipher = OpenSSL::Cipher.new('AES-256-CBC')
-        cipher.decrypt
-        cipher.key = Digest::SHA256.digest(password + @U[40..-1])
-        cipher.iv = "\x00" * 16
-        cipher.padding = 0
-        cipher.update(@UE) + cipher.final
-      end
-    end
-
-    def build_standard_key(pass)
-      pass = pass.byteslice(0...127)   # UTF-8 encoded password. first 127 bytes
-
-      encrypt_key   = auth_owner_pass(pass)
-      encrypt_key ||= auth_user_pass(pass)
-
-      raise PDF::Reader::EncryptedPDFError, "Invalid password (#{pass})" if encrypt_key.nil?
-      encrypt_key
-    end
-  end
-end
diff --git a/lib/pdf/reader/stream.rb b/lib/pdf/reader/stream.rb
index d01f4b0..92eb604 100644
--- a/lib/pdf/reader/stream.rb
+++ b/lib/pdf/reader/stream.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 ################################################################################
@@ -61,7 +62,7 @@ class PDF::Reader
         end
 
         Array(hash[:Filter]).each_with_index do |filter, index|
-          @udata = Filter.with(filter, options[index]).filter(@udata)
+          @udata = Filter.with(filter, options[index] || {}).filter(@udata)
         end
       end
       @udata
diff --git a/lib/pdf/reader/synchronized_cache.rb b/lib/pdf/reader/synchronized_cache.rb
index b741f79..e869da1 100644
--- a/lib/pdf/reader/synchronized_cache.rb
+++ b/lib/pdf/reader/synchronized_cache.rb
@@ -1,4 +1,5 @@
 # encoding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 # utilities.rb : General-purpose utility classes which don't fit anywhere else
diff --git a/lib/pdf/reader/text_run.rb b/lib/pdf/reader/text_run.rb
index f78edd8..e47311a 100644
--- a/lib/pdf/reader/text_run.rb
+++ b/lib/pdf/reader/text_run.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 class PDF::Reader
@@ -6,15 +7,14 @@ class PDF::Reader
   class TextRun
     include Comparable
 
-    attr_reader :x, :y, :width, :font_size, :text
+    attr_reader :origin, :width, :font_size, :text
 
     alias :to_s :text
 
     def initialize(x, y, width, font_size, text)
-      @x = x
-      @y = y
+      @origin = PDF::Reader::Point.new(x, y)
       @width = width
-      @font_size = font_size.floor
+      @font_size = font_size
       @text = text
     end
 
@@ -34,12 +34,20 @@ class PDF::Reader
       end
     end
 
+    def x
+      @origin.x
+    end
+
+    def y
+      @origin.y
+    end
+
     def endx
-      @endx ||= x + width
+      @endx ||= @origin.x + width
     end
 
     def endy
-      @endy ||= y + font_size
+      @endy ||= @origin.y + font_size
     end
 
     def mean_character_width
diff --git a/lib/pdf/reader/token.rb b/lib/pdf/reader/token.rb
index 3e056df..c2b7bdc 100644
--- a/lib/pdf/reader/token.rb
+++ b/lib/pdf/reader/token.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 ################################################################################
diff --git a/lib/pdf/reader/transformation_matrix.rb b/lib/pdf/reader/transformation_matrix.rb
index db24a33..a649260 100644
--- a/lib/pdf/reader/transformation_matrix.rb
+++ b/lib/pdf/reader/transformation_matrix.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 class PDF::Reader
diff --git a/lib/pdf/reader/type_check.rb b/lib/pdf/reader/type_check.rb
new file mode 100644
index 0000000..6f0a9e7
--- /dev/null
+++ b/lib/pdf/reader/type_check.rb
@@ -0,0 +1,52 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+module PDF
+  class Reader
+
+    # Cast untrusted input (usually parsed out of a PDF file) to a known type
+    #
+    class TypeCheck
+
+      def self.cast_to_numeric!(obj)
+        if obj.is_a?(Numeric)
+          obj
+        elsif obj.nil?
+          0
+        elsif obj.respond_to?(:to_f)
+          obj.to_f
+        elsif obj.respond_to?(:to_i)
+          obj.to_i
+        else
+          raise MalformedPDFError, "Unable to cast to numeric"
+        end
+      end
+
+      def self.cast_to_string!(string)
+        if string.is_a?(String)
+          string
+        elsif string.nil?
+          ""
+        elsif string.respond_to?(:to_s)
+          string.to_s
+        else
+          raise MalformedPDFError, "Unable to cast to string"
+        end
+      end
+
+      def self.cast_to_symbol(obj)
+        if obj.is_a?(Symbol)
+          obj
+        elsif obj.nil?
+          nil
+        elsif obj.respond_to?(:to_sym)
+          obj.to_sym
+        else
+          raise MalformedPDFError, "Unable to cast to symbol"
+        end
+      end
+    end
+  end
+end
+
diff --git a/lib/pdf/reader/unimplemented_security_handler.rb b/lib/pdf/reader/unimplemented_security_handler.rb
index 3fb1505..265b799 100644
--- a/lib/pdf/reader/unimplemented_security_handler.rb
+++ b/lib/pdf/reader/unimplemented_security_handler.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 class PDF::Reader
diff --git a/lib/pdf/reader/validating_receiver.rb b/lib/pdf/reader/validating_receiver.rb
new file mode 100644
index 0000000..c9c4464
--- /dev/null
+++ b/lib/pdf/reader/validating_receiver.rb
@@ -0,0 +1,262 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+module PDF
+  class Reader
+
+    # Page#walk will execute the content stream of a page, calling methods on a receiver class
+    # provided by the user. Each operator has a specific set of parameters it expects, and we
+    # wrap the users receiver class in this one to verify the PDF uses valid parameters.
+    #
+    # Without these checks, users can't be confident about the number of parameters they'll receive
+    # for an operator, or what the type of those parameters will be. Everyone ends up building their
+    # own type safety guard clauses and it's tedious.
+    #
+    # Not all operators have type safety implemented yet, but we can expand the number over time.
+    class ValidatingReceiver
+
+      def initialize(wrapped)
+        @wrapped = wrapped
+      end
+
+      def page=(page)
+        call_wrapped(:page=, page)
+      end
+
+      #####################################################
+      # Graphics State Operators
+      #####################################################
+      def save_graphics_state(*args)
+        call_wrapped(:save_graphics_state)
+      end
+
+      def restore_graphics_state(*args)
+        call_wrapped(:restore_graphics_state)
+      end
+
+      #####################################################
+      # Matrix Operators
+      #####################################################
+
+      def concatenate_matrix(*args)
+        a, b, c, d, e, f = *args
+        call_wrapped(
+          :concatenate_matrix,
+          TypeCheck.cast_to_numeric!(a),
+          TypeCheck.cast_to_numeric!(b),
+          TypeCheck.cast_to_numeric!(c),
+          TypeCheck.cast_to_numeric!(d),
+          TypeCheck.cast_to_numeric!(e),
+          TypeCheck.cast_to_numeric!(f),
+        )
+      end
+
+      #####################################################
+      # Text Object Operators
+      #####################################################
+
+      def begin_text_object(*args)
+        call_wrapped(:begin_text_object)
+      end
+
+      def end_text_object(*args)
+        call_wrapped(:end_text_object)
+      end
+
+      #####################################################
+      # Text State Operators
+      #####################################################
+      def set_character_spacing(*args)
+        char_spacing, _ = *args
+        call_wrapped(
+          :set_character_spacing,
+          TypeCheck.cast_to_numeric!(char_spacing)
+        )
+      end
+
+      def set_horizontal_text_scaling(*args)
+        h_scaling, _ = *args
+        call_wrapped(
+          :set_horizontal_text_scaling,
+          TypeCheck.cast_to_numeric!(h_scaling)
+        )
+      end
+
+      def set_text_font_and_size(*args)
+        label, size, _ = *args
+        call_wrapped(
+          :set_text_font_and_size,
+          TypeCheck.cast_to_symbol(label),
+          TypeCheck.cast_to_numeric!(size)
+        )
+      end
+
+      def set_text_leading(*args)
+        leading, _ = *args
+        call_wrapped(
+          :set_text_leading,
+          TypeCheck.cast_to_numeric!(leading)
+        )
+      end
+
+      def set_text_rendering_mode(*args)
+        mode, _ = *args
+        call_wrapped(
+          :set_text_rendering_mode,
+          TypeCheck.cast_to_numeric!(mode)
+        )
+      end
+
+      def set_text_rise(*args)
+        rise, _ = *args
+        call_wrapped(
+          :set_text_rise,
+          TypeCheck.cast_to_numeric!(rise)
+        )
+      end
+
+      def set_word_spacing(*args)
+        word_spacing, _ = *args
+        call_wrapped(
+          :set_word_spacing,
+          TypeCheck.cast_to_numeric!(word_spacing)
+        )
+      end
+
+      #####################################################
+      # Text Positioning Operators
+      #####################################################
+
+      def move_text_position(*args) # Td
+        x, y, _ = *args
+        call_wrapped(
+          :move_text_position,
+          TypeCheck.cast_to_numeric!(x),
+          TypeCheck.cast_to_numeric!(y)
+        )
+      end
+
+      def move_text_position_and_set_leading(*args) # TD
+        x, y, _ = *args
+        call_wrapped(
+          :move_text_position_and_set_leading,
+          TypeCheck.cast_to_numeric!(x),
+          TypeCheck.cast_to_numeric!(y)
+        )
+      end
+
+      def set_text_matrix_and_text_line_matrix(*args) # Tm
+        a, b, c, d, e, f = *args
+        call_wrapped(
+          :set_text_matrix_and_text_line_matrix,
+          TypeCheck.cast_to_numeric!(a),
+          TypeCheck.cast_to_numeric!(b),
+          TypeCheck.cast_to_numeric!(c),
+          TypeCheck.cast_to_numeric!(d),
+          TypeCheck.cast_to_numeric!(e),
+          TypeCheck.cast_to_numeric!(f),
+        )
+      end
+
+      def move_to_start_of_next_line(*args) # T*
+        call_wrapped(:move_to_start_of_next_line)
+      end
+
+      #####################################################
+      # Text Showing Operators
+      #####################################################
+      def show_text(*args) # Tj (AWAY)
+        string, _ = *args
+        call_wrapped(
+          :show_text,
+          TypeCheck.cast_to_string!(string)
+        )
+      end
+
+      def show_text_with_positioning(*args) # TJ [(A) 120 (WA) 20 (Y)]
+        params, _ = *args
+        unless params.is_a?(Array)
+          raise MalformedPDFError, "TJ operator expects a single Array argument"
+        end
+
+        call_wrapped(
+          :show_text_with_positioning,
+          params
+        )
+      end
+
+      def move_to_next_line_and_show_text(*args) # '
+        string, _ = *args
+        call_wrapped(
+          :move_to_next_line_and_show_text,
+          TypeCheck.cast_to_string!(string)
+        )
+      end
+
+      def set_spacing_next_line_show_text(*args) # "
+        aw, ac, string = *args
+        call_wrapped(
+          :set_spacing_next_line_show_text,
+          TypeCheck.cast_to_numeric!(aw),
+          TypeCheck.cast_to_numeric!(ac),
+          TypeCheck.cast_to_string!(string)
+        )
+      end
+
+      #####################################################
+      # Form XObject Operators
+      #####################################################
+
+      def invoke_xobject(*args)
+        label, _ = *args
+
+        call_wrapped(
+          :invoke_xobject,
+          TypeCheck.cast_to_symbol(label)
+        )
+      end
+
+      #####################################################
+      # Inline Image Operators
+      #####################################################
+
+      def begin_inline_image(*args)
+        call_wrapped(:begin_inline_image)
+      end
+
+      def begin_inline_image_data(*args)
+        # We can't use call_wrapped() here because sorbet won't allow splat args with a dynamic
+        # number of elements
+        @wrapped.begin_inline_image_data(*args) if @wrapped.respond_to?(:begin_inline_image_data)
+      end
+
+      def end_inline_image(*args)
+        data, _ = *args
+
+        call_wrapped(
+          :end_inline_image,
+          TypeCheck.cast_to_string!(data)
+        )
+      end
+
+      #####################################################
+      # Final safety net for any operators that don't have type checking enabled yet
+      #####################################################
+
+      def respond_to?(meth)
+        @wrapped.respond_to?(meth)
+      end
+
+      def method_missing(methodname, *args)
+        @wrapped.send(methodname, *args)
+      end
+
+      private
+
+      def call_wrapped(methodname, *args)
+        @wrapped.send(methodname, *args) if @wrapped.respond_to?(methodname)
+      end
+    end
+  end
+end
diff --git a/lib/pdf/reader/width_calculator.rb b/lib/pdf/reader/width_calculator.rb
index 6d3f0da..3874ae9 100644
--- a/lib/pdf/reader/width_calculator.rb
+++ b/lib/pdf/reader/width_calculator.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: strict
 # frozen_string_literal: true
 
 # PDF files may define fonts in a number of ways. Each approach means we must
diff --git a/lib/pdf/reader/width_calculator/built_in.rb b/lib/pdf/reader/width_calculator/built_in.rb
index 8ae3fb4..0f7d6bb 100644
--- a/lib/pdf/reader/width_calculator/built_in.rb
+++ b/lib/pdf/reader/width_calculator/built_in.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 require 'afm'
@@ -37,23 +38,15 @@ class PDF::Reader
       def glyph_width(code_point)
         return 0 if code_point.nil? || code_point < 0
 
-        m = @metrics.char_metrics_by_code[code_point]
-        if m.nil?
-          names = @font.encoding.int_to_name(code_point)
+        names = @font.encoding.int_to_name(code_point)
+        metrics = names.map { |name|
+          @metrics.char_metrics[name.to_s]
+        }.compact.first
 
-          m = names.map { |name|
-            @metrics.char_metrics[name.to_s]
-          }.compact.first
-        end
-
-        if m
-          m[:wx]
-        elsif @font.widths[code_point - 1]
-          @font.widths[code_point - 1]
-        elsif control_character?(code_point)
-          0
+        if metrics
+          metrics[:wx]
         else
-          0
+          @font.widths[code_point - 1] || 0
         end
       end
 
diff --git a/lib/pdf/reader/width_calculator/composite.rb b/lib/pdf/reader/width_calculator/composite.rb
index 52e0c20..ea0a2df 100644
--- a/lib/pdf/reader/width_calculator/composite.rb
+++ b/lib/pdf/reader/width_calculator/composite.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 class PDF::Reader
diff --git a/lib/pdf/reader/width_calculator/true_type.rb b/lib/pdf/reader/width_calculator/true_type.rb
index eb0250f..d2e2e56 100644
--- a/lib/pdf/reader/width_calculator/true_type.rb
+++ b/lib/pdf/reader/width_calculator/true_type.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 class PDF::Reader
@@ -29,7 +30,7 @@ class PDF::Reader
 
         # in ruby a negative index is valid, and will go from the end of the array
         # which is undesireable in this case.
-        if @font.first_char <= code_point
+        if @font.first_char && @font.first_char <= code_point
           @font.widths.fetch(code_point - @font.first_char, @missing_width).to_f
         else
           @missing_width.to_f
diff --git a/lib/pdf/reader/width_calculator/type_one_or_three.rb b/lib/pdf/reader/width_calculator/type_one_or_three.rb
index e432300..fa9979b 100644
--- a/lib/pdf/reader/width_calculator/type_one_or_three.rb
+++ b/lib/pdf/reader/width_calculator/type_one_or_three.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 class PDF::Reader
diff --git a/lib/pdf/reader/width_calculator/type_zero.rb b/lib/pdf/reader/width_calculator/type_zero.rb
index 0818726..8a79657 100644
--- a/lib/pdf/reader/width_calculator/type_zero.rb
+++ b/lib/pdf/reader/width_calculator/type_zero.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 class PDF::Reader
diff --git a/lib/pdf/reader/xref.rb b/lib/pdf/reader/xref.rb
index 4f15da2..888f7d9 100644
--- a/lib/pdf/reader/xref.rb
+++ b/lib/pdf/reader/xref.rb
@@ -1,4 +1,5 @@
 # coding: utf-8
+# typed: true
 # frozen_string_literal: true
 
 ################################################################################
@@ -103,13 +104,18 @@ class PDF::Reader
       buf = new_buffer(offset)
       tok_one = buf.token
 
+      # we have a traditional xref table
       return load_xref_table(buf) if tok_one == "xref" || tok_one == "ref"
 
       tok_two   = buf.token
       tok_three = buf.token
 
+      # we have an XRef stream
       if tok_one.to_i >= 0 && tok_two.to_i >= 0 && tok_three == "obj"
         buf = new_buffer(offset)
+        # Maybe we should be parsing the ObjectHash second argument to the Parser here,
+        # to handle the case where an XRef Stream has the Length specified via an
+        # indirect object
         stream = PDF::Reader::Parser.new(buf).object(tok_one.to_i, tok_two.to_i)
         return load_xref_stream(stream)
       end
@@ -125,12 +131,19 @@ class PDF::Reader
 
       while !params.include?("trailer") && !params.include?(nil)
         if params.size == 2
+          unless params[0].to_s.match(/\A\d+\z/)
+            raise MalformedPDFError, "invalid xref table, expected object ID"
+          end
+
           objid, count = params[0].to_i, params[1].to_i
           count.times do
             offset = buf.token.to_i
             generation = buf.token.to_i
             state = buf.token
 
+            # Some PDF writers start numbering at 1 instead of 0. Fix up the number.
+            # TODO should this fix be logged?
+            objid = 0 if objid == 1 and offset == 0 and generation == 65535 and state == 'f'
             store(objid, generation, offset + @junk_offset) if state == "n" && offset > 0
             objid += 1
             params.clear
@@ -139,14 +152,16 @@ class PDF::Reader
         params << buf.token
       end
 
-      trailer = Parser.new(buf, self).parse_token
+      trailer = Parser.new(buf).parse_token
 
       unless trailer.kind_of?(Hash)
         raise MalformedPDFError, "PDF malformed, trailer should be a dictionary"
       end
 
       load_offsets(trailer[:XRefStm])   if trailer.has_key?(:XRefStm)
-      load_offsets(trailer[:Prev].to_i) if trailer.has_key?(:Prev)
+      # Some PDF creators seem to use '/Prev 0' in trailer if there is no previous xref
+      # It's not possible for an xref to appear at offset 0, so can safely skip the ref
+      load_offsets(trailer[:Prev].to_i) if trailer.has_key?(:Prev) and trailer[:Prev].to_i != 0
 
       trailer
     end
@@ -162,8 +177,16 @@ class PDF::Reader
         [:Size, :Prev, :Root, :Encrypt, :Info, :ID].include?(key)
       }]
 
-      widths       = stream.hash[:W]
-      entry_length = widths.inject(0) { |s, w| s + w }
+      widths = stream.hash[:W]
+
+      PDF::Reader::Error.validate_type_as_malformed(widths, "xref stream widths", Array)
+
+      entry_length = widths.inject(0) { |s, w|
+        unless w.is_a?(Integer)
+          w = 0
+        end
+        s + w
+      }
       raw_data     = StringIO.new(stream.unfiltered_data)
       if stream.hash[:Index]
         index = stream.hash[:Index]
diff --git a/lib/pdf/reader/zero_width_runs_filter.rb b/lib/pdf/reader/zero_width_runs_filter.rb
new file mode 100644
index 0000000..efe236f
--- /dev/null
+++ b/lib/pdf/reader/zero_width_runs_filter.rb
@@ -0,0 +1,13 @@
+# coding: utf-8
+# typed: strict
+# frozen_string_literal: true
+
+class PDF::Reader
+  # There's no point rendering zero-width characters
+  class ZeroWidthRunsFilter
+
+    def self.exclude_zero_width_runs(runs)
+      runs.reject { |run| run.width == 0 }
+    end
+  end
+end
diff --git a/pdf-reader.gemspec b/pdf-reader.gemspec
index c10c136..0a1e4de 100644
--- a/pdf-reader.gemspec
+++ b/pdf-reader.gemspec
@@ -2,11 +2,11 @@
 # which will make the gem filesize irritatingly large
 Gem::Specification.new do |spec|
   spec.name = "pdf-reader"
-  spec.version = "2.4.1"
+  spec.version = "2.9.1"
   spec.summary = "A library for accessing the content of PDF files"
   spec.description = "The PDF::Reader library implements a PDF parser conforming as much as possible to the PDF specification from Adobe"
   spec.license = "MIT"
-  spec.files =  Dir.glob("{examples,lib}/**/**/*") + ["Rakefile"]
+  spec.files =  Dir.glob("{examples,lib,rbi}/**/**/*") + ["Rakefile"]
   spec.executables << "pdf_object"
   spec.executables << "pdf_text"
   spec.executables << "pdf_callbacks"
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
   spec.authors = ["James Healy"]
   spec.email   = ["james@yob.id.au"]
   spec.homepage = "https://github.com/yob/pdf-reader"
-  spec.required_ruby_version = ">=1.9.3"
+  spec.required_ruby_version = ">=2.0"
 
   if spec.respond_to?(:metadata)
     spec.metadata = {
@@ -34,7 +34,7 @@ Gem::Specification.new do |spec|
   spec.add_development_dependency("pry")
   spec.add_development_dependency("rdoc")
 
-  spec.add_dependency('Ascii85', '~> 1.0.0')
+  spec.add_dependency('Ascii85', '~> 1.0')
   spec.add_dependency('ruby-rc4')
   spec.add_dependency('hashery', '~> 2.0')
   spec.add_dependency('ttfunk')
diff --git a/rbi/pdf-reader.rbi b/rbi/pdf-reader.rbi
new file mode 100644
index 0000000..87b8627
--- /dev/null
+++ b/rbi/pdf-reader.rbi
@@ -0,0 +1,1978 @@
+# typed: strong
+module PDF
+  class Reader
+    sig { returns(T.untyped) }
+    attr_reader :objects
+
+    sig { params(input: T.any(String, IO), opts: T::Hash[T.untyped, T.untyped]).void }
+    def initialize(input, opts = {}); end
+
+    sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
+    def info; end
+
+    sig { returns(T.nilable(T::Hash[T.untyped, T.untyped])) }
+    def metadata; end
+
+    sig { returns(Integer) }
+    def page_count; end
+
+    sig { returns(Float) }
+    def pdf_version; end
+
+    sig { params(input: T.any(String, IO), opts: T::Hash[T.untyped, T.untyped], block: T.proc.params(arg0: PDF::Reader).void).returns(T.untyped) }
+    def self.open(input, opts = {}, &block); end
+
+    sig { returns(T::Array[PDF::Reader::Page]) }
+    def pages; end
+
+    sig { params(num: Integer).returns(PDF::Reader::Page) }
+    def page(num); end
+
+    sig { params(obj: T.untyped).returns(T.untyped) }
+    def doc_strings_to_utf8(obj); end
+
+    sig { params(str: String).returns(T::Boolean)}
+    def has_utf16_bom?(str); end
+
+    sig { params(obj: String).returns(String) }
+    def pdfdoc_to_utf8(obj); end
+
+    sig { params(obj: String).returns(String) }
+    def utf16_to_utf8(obj); end
+
+    sig { returns(T::Hash[Symbol, T.untyped]) }
+    def root; end
+
+    class AesV2SecurityHandler
+      sig { params(key: String).void }
+      def initialize(key)
+        @encrypt_key = T.let(T.unsafe(nil), String)
+      end
+
+      sig { params(buf: String, ref: PDF::Reader::Reference).returns(String) }
+      def decrypt(buf, ref); end
+    end
+
+    class AesV3SecurityHandler
+      sig { params(key: String).void }
+      def initialize(key)
+        @encrypt_key = T.let(T.unsafe(nil), String)
+        @cipher = T.let(T.unsafe(nil), String)
+      end
+
+      sig { params(buf: String, ref: PDF::Reader::Reference).returns(String) }
+      def decrypt(buf, ref); end
+    end
+
+    class BoundingRectangleRunsFilter
+      sig { params(runs: T::Array[PDF::Reader::TextRun], rect: PDF::Reader::Rectangle).returns(T::Array[PDF::Reader::TextRun]) }
+      def self.runs_within_rect(runs, rect); end
+    end
+
+    class Buffer
+      TOKEN_WHITESPACE = [0x00, 0x09, 0x0A, 0x0C, 0x0D, 0x20]
+      TOKEN_DELIMITER = [0x25, 0x3C, 0x3E, 0x28, 0x5B, 0x7B, 0x29, 0x5D, 0x7D, 0x2F]
+      LEFT_PAREN = "("
+      LESS_THAN = "<"
+      STREAM = "stream"
+      ID = "ID"
+      FWD_SLASH = "/"
+      NULL_BYTE = "\x00"
+      CR = "\r"
+      LF = "\n"
+      CRLF = "\r\n"
+      WHITE_SPACE = [LF, CR, ' ']
+      TRAILING_BYTECOUNT = 5000
+
+      sig { returns(Integer) }
+      attr_reader :pos
+
+      sig { params(io: T.any(StringIO, File), opts: T::Hash[Symbol, T.untyped]).void }
+      def initialize(io, opts = {})
+        @pos = T.let(T.unsafe(nil), Integer)
+        @tokens = T.let(T.unsafe(nil), T::Array[T.any(String, PDF::Reader::Reference)])
+        @io = T.let(T.unsafe(nil), T.any(StringIO, File))
+        @in_content_stream = T.let(T.unsafe(nil), T::Boolean)
+      end
+
+      sig { returns(T::Boolean) }
+      def empty?; end
+
+      sig { params(bytes: Integer, opts: T::Hash[Symbol, T.untyped]).returns(T.nilable(String)) }
+      def read(bytes, opts = {}); end
+
+      sig { returns(T.any(NilClass, String, PDF::Reader::Reference)) }
+      def token; end
+
+      sig { returns(Integer) }
+      def find_first_xref_offset; end
+
+      sig { void }
+      def check_size_is_non_zero; end
+
+      sig { returns(T::Boolean) }
+      def in_content_stream?; end
+
+      sig { void }
+      def reset_pos; end
+
+      sig { void }
+      def save_pos; end
+
+      sig { void }
+      def prepare_tokens; end
+
+      sig { returns(Symbol) }
+      def state; end
+
+      sig { void }
+      def merge_indirect_reference; end
+
+      sig { void }
+      def prepare_inline_token; end
+
+      sig { void }
+      def prepare_hex_token; end
+
+      sig { void }
+      def prepare_literal_token; end
+
+      sig { void }
+      def prepare_regular_token; end
+
+      sig { returns(T.nilable(Integer)) }
+      def peek_byte; end
+    end
+
+    class CidWidths
+      sig { params(default: T.untyped, array: T.untyped).void }
+      def initialize(default, array); end
+
+      sig { params(default: T.untyped, array: T.untyped).returns(T.untyped) }
+      def parse_array(default, array); end
+
+      sig { params(first: T.untyped, widths: T.untyped).returns(T.untyped) }
+      def parse_first_form(first, widths); end
+
+      sig { params(first: T.untyped, final: T.untyped, width: T.untyped).returns(T.untyped) }
+      def parse_second_form(first, final, width); end
+    end
+
+    class CMap
+      CMAP_KEYWORDS = {
+      "begincodespacerange" => 1,
+      "endcodespacerange" => 1,
+      "beginbfchar" => 1,
+      "endbfchar" => 1,
+      "beginbfrange" => 1,
+      "endbfrange" => 1,
+      "begin" => 1,
+      "begincmap" => 1,
+      "def" => 1
+    }
+
+      sig { returns(T.untyped) }
+      attr_reader :map
+
+      sig { params(data: String).void }
+      def initialize(data)
+        @map = T.let(T.unsafe(nil), T::Hash[Integer, T::Array[Integer]])
+      end
+
+      sig { params(data: String, initial_mode: Symbol).void }
+      def process_data(data, initial_mode = :none); end
+
+      sig { returns(Integer) }
+      def size; end
+
+      sig { params(c: Integer).returns(T::Array[Integer]) }
+      def decode(c); end
+
+      sig { params(instructions: String).returns(PDF::Reader::Parser) }
+      def build_parser(instructions); end
+
+      sig { params(str: String).returns(T::Array[Integer]) }
+      def str_to_int(str); end
+
+      sig { params(instructions: T::Array[String]).void }
+      def process_bfchar_instructions(instructions); end
+
+      sig { params(instructions: T::Array[T.any(T::Array[String], String)]).void }
+      def process_bfrange_instructions(instructions); end
+
+      sig { params(start_code: String, end_code: String, dst: String).void }
+      def bfrange_type_one(start_code, end_code, dst); end
+
+      sig { params(start_code: String, end_code: String, dst: T::Array[String]).void }
+      def bfrange_type_two(start_code, end_code, dst); end
+    end
+
+    class Encoding
+      CONTROL_CHARS = [0,1,2,3,4,5,6,7,8,11,12,14,15,16,17,18,19,20,21,22,23,
+                     24,25,26,27,28,29,30,31]
+      UNKNOWN_CHAR = 0x25AF
+
+      sig { returns(T.untyped) }
+      attr_reader :unpack
+
+      sig { params(enc: T.untyped).void }
+      def initialize(enc); end
+
+      sig { params(diff: T.untyped).returns(T.untyped) }
+      def differences=(diff); end
+
+      sig { returns(T.untyped) }
+      def differences; end
+
+      sig { params(str: String).returns(String) }
+      def to_utf8(str); end
+
+      sig { params(glyph_code: Integer).returns(String) }
+      def int_to_utf8_string(glyph_code); end
+
+      sig { params(glyph_code: Integer).returns(T::Array[Symbol]) }
+      def int_to_name(glyph_code); end
+
+      sig { returns(T.untyped) }
+      def default_mapping; end
+
+      sig { params(glyph_code: T.untyped).returns(T.untyped) }
+      def internal_int_to_utf8_string(glyph_code); end
+
+      sig { returns(T.untyped) }
+      def utf8_conversion_impossible?; end
+
+      sig { params(times: T.untyped).returns(T.untyped) }
+      def little_boxes(times); end
+
+      sig { params(str: T.untyped).returns(T.untyped) }
+      def convert_to_utf8(str); end
+
+      sig { params(enc: T.untyped).returns(T.untyped) }
+      def get_unpack(enc); end
+
+      sig { params(enc: T.untyped).returns(T.untyped) }
+      def get_mapping_file(enc); end
+
+      sig { returns(T.untyped) }
+      def glyphlist; end
+
+      sig { params(file: T.untyped).returns(T.untyped) }
+      def load_mapping(file); end
+    end
+
+    class Error
+      sig { params(lvalue: T.untyped, rvalue: T.untyped, chars: T.untyped).returns(T.untyped) }
+      def self.str_assert(lvalue, rvalue, chars = nil); end
+
+      sig { params(lvalue: T.untyped, rvalue: T.untyped, chars: T.untyped).returns(T.untyped) }
+      def self.str_assert_not(lvalue, rvalue, chars = nil); end
+
+      sig { params(lvalue: T.untyped, rvalue: T.untyped).returns(T.untyped) }
+      def self.assert_equal(lvalue, rvalue); end
+
+      sig { params(object: Object, name: String, klass: Module).void }
+      def self.validate_type(object, name, klass); end
+
+      sig { params(object: Object, name: String, klass: Module).void }
+      def self.validate_type_as_malformed(object, name, klass); end
+
+      sig { params(object: Object, name: String).void }
+		  def self.validate_not_nil(object, name); end
+
+      sig { params(object: Object, name: String).void }
+		  def self.validate_not_nil_as_malformed(object, name); end
+    end
+
+    class MalformedPDFError < RuntimeError
+    end
+
+    class InvalidPageError < ArgumentError
+    end
+
+    class InvalidObjectError < MalformedPDFError
+    end
+
+    class UnsupportedFeatureError < RuntimeError
+    end
+
+    class EncryptedPDFError < UnsupportedFeatureError
+    end
+
+    class Font
+      sig { returns(T.untyped) }
+      attr_accessor :subtype
+
+      sig { returns(T.untyped) }
+      attr_accessor :encoding
+
+      sig { returns(T.untyped) }
+      attr_accessor :descendantfonts
+
+      sig { returns(T.untyped) }
+      attr_accessor :tounicode
+
+      sig { returns(T.untyped) }
+      attr_reader :widths
+
+      sig { returns(T.untyped) }
+      attr_reader :first_char
+
+      sig { returns(T.untyped) }
+      attr_reader :last_char
+
+      sig { returns(T.untyped) }
+      attr_reader :basefont
+
+      sig { returns(T.untyped) }
+      attr_reader :font_descriptor
+
+      sig { returns(T.untyped) }
+      attr_reader :cid_widths
+
+      sig { returns(T.untyped) }
+      attr_reader :cid_default_width
+
+      sig { params(ohash: T.untyped, obj: T.untyped).void }
+      def initialize(ohash, obj); end
+
+      sig { params(params: T.untyped).returns(T.untyped) }
+      def to_utf8(params); end
+
+      sig { params(data: T.untyped).returns(T.untyped) }
+      def unpack(data); end
+
+      sig { params(code_point: T.untyped).returns(T.untyped) }
+      def glyph_width(code_point); end
+
+      sig { params(font_name: T.untyped).returns(T.untyped) }
+      def default_encoding(font_name); end
+
+      sig { returns(T.untyped) }
+      def build_width_calculator; end
+
+      sig { params(obj: T.untyped).returns(T.untyped) }
+      def extract_base_info(obj); end
+
+      sig { params(obj: T.untyped).returns(T.untyped) }
+      def extract_descriptor(obj); end
+
+      sig { params(obj: T.untyped).returns(T.untyped) }
+      def extract_descendants(obj); end
+
+      sig { params(params: T.untyped).returns(T.untyped) }
+      def to_utf8_via_cmap(params); end
+
+      sig { params(params: T.untyped).returns(T.untyped) }
+      def to_utf8_via_encoding(params); end
+    end
+
+    class FontDescriptor
+      sig { returns(T.untyped) }
+      attr_reader :font_name
+
+      sig { returns(T.untyped) }
+      attr_reader :font_family
+
+      sig { returns(T.untyped) }
+      attr_reader :font_stretch
+
+      sig { returns(T.untyped) }
+      attr_reader :font_weight
+
+      sig { returns(T.untyped) }
+      attr_reader :font_bounding_box
+
+      sig { returns(T.untyped) }
+      attr_reader :cap_height
+
+      sig { returns(T.untyped) }
+      attr_reader :ascent
+
+      sig { returns(T.untyped) }
+      attr_reader :descent
+
+      sig { returns(T.untyped) }
+      attr_reader :leading
+
+      sig { returns(T.untyped) }
+      attr_reader :avg_width
+
+      sig { returns(T.untyped) }
+      attr_reader :max_width
+
+      sig { returns(T.untyped) }
+      attr_reader :missing_width
+
+      sig { returns(T.untyped) }
+      attr_reader :italic_angle
+
+      sig { returns(T.untyped) }
+      attr_reader :stem_v
+
+      sig { returns(T.untyped) }
+      attr_reader :x_height
+
+      sig { returns(T.untyped) }
+      attr_reader :font_flags
+
+      sig { params(ohash: PDF::Reader::ObjectHash, fd_hash: T::Hash[T.untyped, T.untyped]).void }
+      def initialize(ohash, fd_hash); end
+
+      sig { params(char_code: T.untyped).returns(T.untyped) }
+      def glyph_width(char_code); end
+
+      sig { returns(T.untyped) }
+      def glyph_to_pdf_scale_factor; end
+
+      sig { returns(T.untyped) }
+      def ttf_program_stream; end
+    end
+
+    class FormXObject
+      include ResourceMethods
+
+      sig { returns(T.untyped) }
+      attr_reader :xobject
+
+      sig { params(page: T.untyped, xobject: T.untyped, options: T.untyped).void }
+      def initialize(page, xobject, options = {}); end
+
+      sig { returns(T.untyped) }
+      def font_objects; end
+
+      sig { params(receivers: T.untyped).returns(T.untyped) }
+      def walk(*receivers); end
+
+      sig { returns(T.untyped) }
+      def raw_content; end
+
+      sig { returns(T.untyped) }
+      def resources; end
+
+      sig { params(receivers: T.untyped, name: T.untyped, params: T.untyped).returns(T.untyped) }
+      def callback(receivers, name, params = []); end
+
+      sig { returns(T.untyped) }
+      def content_stream_md5; end
+
+      sig { returns(T.untyped) }
+      def cached_tokens_key; end
+
+      sig { returns(T.untyped) }
+      def tokens; end
+
+      sig { params(receivers: T.untyped, instructions: T.untyped).returns(T.untyped) }
+      def content_stream(receivers, instructions); end
+    end
+
+    class GlyphHash
+      sig { void }
+      def initialize; end
+
+      sig { params(name: T.untyped).returns(T.untyped) }
+      def name_to_unicode(name); end
+
+      sig { params(codepoint: T.untyped).returns(T.untyped) }
+      def unicode_to_name(codepoint); end
+
+      sig { returns(T.untyped) }
+      def load_adobe_glyph_mapping; end
+    end
+
+    class KeyBuilderV5
+      sig { params(opts: T::Hash[Symbol, String]).void }
+      def initialize(opts = {})
+        @key_length = T.let(T.unsafe(nil), Integer)
+        @owner_key = T.let(T.unsafe(nil), String)
+        @user_key = T.let(T.unsafe(nil), String)
+        @owner_encryption_key = T.let(T.unsafe(nil), String)
+        @user_encryption_key = T.let(T.unsafe(nil), String)
+      end
+
+      sig { params(pass: String).returns(String) }
+      def key(pass); end
+
+      sig { params(password: T.untyped).returns(T.untyped) }
+      def auth_owner_pass(password); end
+
+      sig { params(password: T.untyped).returns(T.untyped) }
+      def auth_user_pass(password); end
+
+      sig { params(password: String).returns(T.nilable(String)) }
+      def auth_owner_pass_r6(password); end
+
+      sig { params(password: String).returns(T.nilable(String)) }
+      def auth_user_pass_r6(password); end
+
+      sig { params(password: String, salt: String, user_key: String).returns(String)}
+      def r6_digest(password, salt, user_key = ''); end
+
+      sig { params(str: String).returns(Integer)}
+      def unpack_128bit_bigendian_int(str); end
+    end
+
+    class LZW
+      CODE_EOD = 257
+      CODE_CLEAR_TABLE = 256
+
+      class BitStream
+        sig { params(data: T.untyped, bits_in_chunk: T.untyped).void }
+        def initialize(data, bits_in_chunk); end
+
+        sig { params(bits_in_chunk: T.untyped).returns(T.untyped) }
+        def set_bits_in_chunk(bits_in_chunk); end
+
+        sig { returns(T.untyped) }
+        def read; end
+      end
+
+      class StringTable < Hash
+        sig { returns(T.untyped) }
+        attr_reader :string_table_pos
+
+        sig { void }
+        def initialize; end
+
+        sig { params(key: T.untyped).returns(T.untyped) }
+        def [](key); end
+
+        sig { params(string: T.untyped).returns(T.untyped) }
+        def add(string); end
+      end
+
+      sig { params(data: T.untyped).returns(T.untyped) }
+      def self.decode(data); end
+
+      sig { params(string_table: T.untyped, some_code: T.untyped, other_code: T.untyped).returns(T.untyped) }
+      def self.create_new_string(string_table, some_code, other_code); end
+    end
+
+    class NullSecurityHandler
+      sig { params(buf: T.untyped, _ref: T.untyped).returns(T.untyped) }
+      def decrypt(buf, _ref); end
+    end
+
+    class ObjectCache
+      CACHEABLE_TYPES = [:Catalog, :Page, :Pages]
+
+      sig { returns(T.untyped) }
+      attr_reader :hits
+
+      sig { returns(T.untyped) }
+      attr_reader :misses
+
+      sig { params(lru_size: T.untyped).void }
+      def initialize(lru_size = 1000); end
+
+      sig { params(key: T.untyped).returns(T.untyped) }
+      def [](key); end
+
+      sig { params(key: T.untyped, value: T.untyped).returns(T.untyped) }
+      def []=(key, value); end
+
+      sig { params(key: T.untyped, local_default: T.untyped).returns(T.untyped) }
+      def fetch(key, local_default = nil); end
+
+      sig { params(block: T.untyped).returns(T.untyped) }
+      def each(&block); end
+
+      sig { params(block: T.untyped).returns(T.untyped) }
+      def each_key(&block); end
+
+      sig { params(block: T.untyped).returns(T.untyped) }
+      def each_value(&block); end
+
+      sig { returns(T.untyped) }
+      def size; end
+
+      sig { returns(T.untyped) }
+      def empty?; end
+
+      sig { params(key: T.untyped).returns(T.untyped) }
+      def include?(key); end
+
+      sig { params(value: T.untyped).returns(T.untyped) }
+      def has_value?(value); end
+
+      sig { returns(T.untyped) }
+      def to_s; end
+
+      sig { returns(T.untyped) }
+      def keys; end
+
+      sig { returns(T.untyped) }
+      def values; end
+
+      sig { params(key: T.untyped).returns(T.untyped) }
+      def update_stats(key); end
+
+      sig { params(obj: T.untyped).returns(T.untyped) }
+      def cacheable?(obj); end
+    end
+
+    class ObjectHash
+      include Enumerable
+
+      sig { returns(T.untyped) }
+      attr_accessor :default
+
+      sig { returns(T.untyped) }
+      attr_reader :trailer
+
+      sig { returns(T.untyped) }
+      attr_reader :pdf_version
+
+      sig { returns(T.untyped) }
+      attr_reader :sec_handler
+
+      sig { params(input: T.untyped, opts: T.untyped).void }
+      def initialize(input, opts = {}); end
+
+      sig { params(ref: T.untyped).returns(T.untyped) }
+      def obj_type(ref); end
+
+      sig { params(ref: T.untyped).returns(T.untyped) }
+      def stream?(ref); end
+
+      sig { params(key: T.untyped).returns(T.untyped) }
+      def [](key); end
+
+      sig { params(key: T.untyped).returns(T.untyped) }
+      def object(key); end
+
+      sig { params(key: T.untyped).returns(T.nilable(T::Array[T.untyped])) }
+      def deref_array(key); end
+
+      sig { params(key: T.untyped).returns(T.nilable(T::Array[Numeric])) }
+      def deref_array_of_numbers(key); end
+
+      sig { params(key: T.untyped).returns(T.nilable(T:Hash[Symbol, T.untyped])) }
+      def deref_hash(key); end
+
+      sig { params(key: T.untyped).returns(T.nilable(Symbol)) }
+      def deref_name(key); end
+
+      sig { params(key: T.untyped).returns(T.any(Symbol, T::Array[T.untyped], NilClass)) }
+      def deref_name_or_array(key); end
+
+      sig { params(key: T.untyped).returns(T.nilable(Integer)) }
+      def deref_integer(key); end
+
+      sig { params(key: T.untyped).returns(T.nilable(Numeric)) }
+      def deref_number(key); end
+
+      sig { params(key: T.untyped).returns(T.nilable(PDF::Reader::Stream)) }
+      def deref_stream(key); end
+
+      sig { params(key: T.untyped).returns(T.nilable(String)) }
+      def deref_string(key); end
+
+      sig { params(key: T.untyped).returns(T.any(PDF::Reader::Stream, T::Array[T.untyped], NilClass)) }
+      def deref_stream_or_array(key); end
+
+      sig { params(key: T.untyped).returns(T.untyped) }
+      def deref!(key); end
+
+      sig { params(key: T.untyped).returns(T::Array[T.untyped]) }
+      def deref_array!(key); end
+
+      sig { params(key: T.untyped).returns(T::Hash[Symbol, T.untyped]) }
+      def deref_hash!(key); end
+
+      sig { params(key: T.untyped, local_default: T.untyped).returns(T.untyped) }
+      def fetch(key, local_default = nil); end
+
+      sig { params(block: T.untyped).returns(T.untyped) }
+      def each(&block); end
+
+      sig { params(block: T.untyped).returns(T.untyped) }
+      def each_key(&block); end
+
+      sig { params(block: T.untyped).returns(T.untyped) }
+      def each_value(&block); end
+
+      sig { returns(Integer) }
+      def size; end
+
+      sig { returns(T::Boolean) }
+      def empty?; end
+
+      sig { params(check_key: T.untyped).returns(T::Boolean) }
+      def has_key?(check_key); end
+
+      sig { params(value: T.untyped).returns(T::Boolean) }
+      def has_value?(value); end
+
+      sig { returns(String) }
+      def to_s; end
+
+      sig { returns(T::Array[PDF::Reader::Reference]) }
+      def keys; end
+
+      sig { returns(T.untyped) }
+      def values; end
+
+      sig { params(ids: T.untyped).returns(T.untyped) }
+      def values_at(*ids); end
+
+      sig { returns(T.untyped) }
+      def to_a; end
+
+      sig { returns(T::Array[PDF::Reader::Reference]) }
+      def page_references; end
+
+      sig { returns(T::Boolean) }
+      def encrypted?; end
+
+      sig { returns(T::Boolean) }
+      def sec_handler?; end
+
+      sig { params(key: T.untyped).returns(T.untyped) }
+      def fetch_object(key); end
+
+      sig { params(key: T.untyped).returns(T.untyped) }
+      def fetch_object_stream(key); end
+
+      sig { params(key: T.untyped, seen: T.untyped).returns(T.untyped) }
+      def deref_internal!(key, seen); end
+
+      sig { params(ref: T.untyped, obj: T.untyped).returns(T.untyped) }
+      def decrypt(ref, obj); end
+
+      sig { params(offset: Integer).returns(PDF::Reader::Buffer) }
+      def new_buffer(offset = 0); end
+
+      sig { returns(T.untyped) }
+      def xref; end
+
+      sig { returns(T.untyped) }
+      def object_streams; end
+
+      sig { params(obj: T::Hash[T.untyped, T.untyped]).returns(T::Array[T::Hash[T.untyped, T.untyped]]) }
+      def get_page_objects(obj); end
+
+      sig { returns(Float) }
+      def read_version; end
+
+      sig { params(input: T.untyped).returns(IO) }
+      def extract_io_from(input); end
+
+      sig { params(input: T.untyped).returns(T.untyped) }
+      def read_as_binary(input); end
+    end
+
+    class ObjectStream
+      sig { params(stream: T.untyped).void }
+      def initialize(stream); end
+
+      sig { params(objid: T.untyped).returns(T.untyped) }
+      def [](objid); end
+
+      sig { returns(T.untyped) }
+      def size; end
+
+      sig { returns(T.untyped) }
+      def offsets; end
+
+      sig { returns(T.untyped) }
+      def first; end
+
+      sig { returns(T.untyped) }
+      def buffer; end
+    end
+
+    class OverlappingRunsFilter
+      OVERLAPPING_THRESHOLD = 0.5
+
+      sig { params(runs: T::Array[PDF::Reader::TextRun]).returns(T::Array[PDF::Reader::TextRun]) }
+      def self.exclude_redundant_runs(runs); end
+
+      sig { params(sweep_line_status: T::Array[PDF::Reader::TextRun], event_point: EventPoint).returns(T::Boolean) }
+      def self.detect_intersection(sweep_line_status, event_point); end
+    end
+
+    class EventPoint
+      sig { returns(Numeric) }
+      attr_reader :x
+
+      sig { returns(PDF::Reader::TextRun) }
+      attr_reader :run
+
+      sig { params(x: Numeric, run: PDF::Reader::TextRun).void }
+      def initialize(x, run); end
+
+      sig { returns(T::Boolean) }
+      def start?; end
+    end
+
+    class Page
+      include ResourceMethods
+
+      sig { returns(PDF::Reader::ObjectHash) }
+      attr_reader :objects
+
+      sig { returns(T.untyped) }
+      attr_reader :page_object
+
+      sig { returns(T.untyped) }
+      attr_reader :cache
+
+      sig { params(objects: PDF::Reader::ObjectHash, pagenum: Integer, options: T::Hash[Symbol, T.untyped]).void }
+      def initialize(objects, pagenum, options = {}); end
+
+      sig { returns(Integer) }
+      def number; end
+
+      sig { returns(String) }
+      def inspect; end
+
+      sig { returns(T::Hash[Symbol, T.untyped]) }
+      def attributes; end
+
+      sig { returns(Numeric) }
+      def height; end
+
+      sig { returns(Numeric) }
+      def width; end
+
+      sig { returns(String) }
+      def orientation; end
+
+      sig { returns(T::Array[Numeric]) }
+      def origin; end
+
+      sig { params(opts: T::Hash[Symbol, T.untyped]).returns(T::Array[PDF::Reader::TextRun]) }
+      def runs(opts = {}); end
+
+      sig { params(opts: T::Hash[Symbol, T.untyped]).returns(String) }
+      def text(opts = {}); end
+
+      sig { params(receivers: T.untyped).void }
+      def walk(*receivers); end
+
+      sig { returns(String) }
+      def raw_content; end
+
+      sig { returns(Integer) }
+      def rotate; end
+
+      sig { returns(T::Hash[Symbol, T::Array[Numeric]]) }
+      def boxes; end
+
+      sig { returns(T::Hash[Symbol, PDF::Reader::Rectangle]) }
+      def rectangles; end
+
+      sig { returns(T::Hash[Symbol, T.untyped]) }
+      def root; end
+
+      sig { returns(PDF::Reader::Resources) }
+      def resources; end
+
+      sig { params(receivers: T.untyped, instructions: T.untyped).returns(T.untyped) }
+      def content_stream(receivers, instructions); end
+
+      sig { params(receivers: T.untyped, name: T.untyped, params: T.untyped).returns(T.untyped) }
+      def callback(receivers, name, params = []); end
+
+      sig { returns(T.untyped) }
+      def page_with_ancestors; end
+
+      sig { params(origin: T.untyped).returns(T.untyped) }
+      def ancestors(origin = @page_object[:Parent]); end
+
+      sig { params(obj: T::Hash[T.untyped, T.untyped]).returns(T::Hash[Symbol, T.untyped]) }
+      def select_inheritable(obj); end
+    end
+
+    class PageLayout
+      DEFAULT_FONT_SIZE = 12
+
+      sig { params(runs: T::Array[PDF::Reader::TextRun], mediabox: T.any(T::Array[Numeric], PDF::Reader::Rectangle)).void }
+      def initialize(runs, mediabox); end
+
+      sig { returns(String) }
+      def to_s; end
+
+      sig { params(rows: T.untyped).returns(T.untyped) }
+      def interesting_rows(rows); end
+
+      sig { returns(T.untyped) }
+      def row_count; end
+
+      sig { returns(T.untyped) }
+      def col_count; end
+
+      sig { returns(T.untyped) }
+      def row_multiplier; end
+
+      sig { returns(T.untyped) }
+      def col_multiplier; end
+
+      sig { params(collection: T.untyped).returns(T.untyped) }
+      def mean(collection); end
+
+      sig { params(collection: T.untyped).returns(T.untyped) }
+      def median(collection); end
+
+      sig { params(runs: T.untyped).returns(T.untyped) }
+      def merge_runs(runs); end
+
+      sig { params(chars: T::Array[PDF::Reader::TextRun]).returns(T::Array[PDF::Reader::TextRun]) }
+      def group_chars_into_runs(chars); end
+
+      sig { params(haystack: T.untyped, needle: T.untyped, index: T.untyped).returns(T.untyped) }
+      def local_string_insert(haystack, needle, index); end
+
+      sig { params(mediabox: T.untyped).returns(T.untyped) }
+      def process_mediabox(mediabox); end
+    end
+
+    class PageState
+      DEFAULT_GRAPHICS_STATE = {
+        :char_spacing   => 0,
+        :word_spacing   => 0,
+        :h_scaling      => 1.0,
+        :text_leading   => 0,
+        :text_font      => nil,
+        :text_font_size => nil,
+        :text_mode      => 0,
+        :text_rise      => 0,
+        :text_knockout  => 0
+      }
+
+      sig { params(page: T.untyped).void }
+      def initialize(page); end
+
+      sig { returns(T.untyped) }
+      def save_graphics_state; end
+
+      sig { returns(T.untyped) }
+      def restore_graphics_state; end
+
+      sig do
+        params(
+          a: T.untyped,
+          b: T.untyped,
+          c: T.untyped,
+          d: T.untyped,
+          e: T.untyped,
+          f: T.untyped
+        ).returns(T.untyped)
+      end
+      def concatenate_matrix(a, b, c, d, e, f); end
+
+      sig { returns(T.untyped) }
+      def begin_text_object; end
+
+      sig { returns(T.untyped) }
+      def end_text_object; end
+
+      sig { params(char_spacing: T.untyped).returns(T.untyped) }
+      def set_character_spacing(char_spacing); end
+
+      sig { params(h_scaling: T.untyped).returns(T.untyped) }
+      def set_horizontal_text_scaling(h_scaling); end
+
+      sig { params(label: T.untyped, size: T.untyped).returns(T.untyped) }
+      def set_text_font_and_size(label, size); end
+
+      sig { returns(T.untyped) }
+      def font_size; end
+
+      sig { params(leading: T.untyped).returns(T.untyped) }
+      def set_text_leading(leading); end
+
+      sig { params(mode: T.untyped).returns(T.untyped) }
+      def set_text_rendering_mode(mode); end
+
+      sig { params(rise: T.untyped).returns(T.untyped) }
+      def set_text_rise(rise); end
+
+      sig { params(word_spacing: T.untyped).returns(T.untyped) }
+      def set_word_spacing(word_spacing); end
+
+      sig { params(x: T.untyped, y: T.untyped).returns(T.untyped) }
+      def move_text_position(x, y); end
+
+      sig { params(x: T.untyped, y: T.untyped).returns(T.untyped) }
+      def move_text_position_and_set_leading(x, y); end
+
+      sig do
+        params(
+          a: T.untyped,
+          b: T.untyped,
+          c: T.untyped,
+          d: T.untyped,
+          e: T.untyped,
+          f: T.untyped
+        ).returns(T.untyped)
+      end
+      def set_text_matrix_and_text_line_matrix(a, b, c, d, e, f); end
+
+      sig { returns(T.untyped) }
+      def move_to_start_of_next_line; end
+
+      sig { params(params: T.untyped).returns(T.untyped) }
+      def show_text_with_positioning(params); end
+
+      sig { params(str: T.untyped).returns(T.untyped) }
+      def move_to_next_line_and_show_text(str); end
+
+      sig { params(aw: T.untyped, ac: T.untyped, string: T.untyped).returns(T.untyped) }
+      def set_spacing_next_line_show_text(aw, ac, string); end
+
+      sig { params(label: T.untyped).returns(T.untyped) }
+      def invoke_xobject(label); end
+
+      sig { params(x: T.untyped, y: T.untyped).returns(T.untyped) }
+      def ctm_transform(x, y); end
+
+      sig { params(x: T.untyped, y: T.untyped).returns(T.untyped) }
+      def trm_transform(x, y); end
+
+      sig { returns(T.untyped) }
+      def current_font; end
+
+      sig { params(label: T.untyped).returns(T.untyped) }
+      def find_font(label); end
+
+      sig { params(label: T.untyped).returns(T.untyped) }
+      def find_color_space(label); end
+
+      sig { params(label: T.untyped).returns(T.untyped) }
+      def find_xobject(label); end
+
+      sig { returns(T.untyped) }
+      def stack_depth; end
+
+      sig { returns(T.untyped) }
+      def clone_state; end
+
+      sig { params(w0: T.untyped, tj: T.untyped, word_boundary: T.untyped).returns(T.untyped) }
+      def process_glyph_displacement(w0, tj, word_boundary); end
+
+      sig { returns(T.untyped) }
+      def text_rendering_matrix; end
+
+      sig { returns(T.untyped) }
+      def ctm; end
+
+      sig { returns(T.untyped) }
+      def state; end
+
+      sig { params(raw_fonts: T.untyped).returns(T.untyped) }
+      def build_fonts(raw_fonts); end
+
+      sig { returns(T.untyped) }
+      def identity_matrix; end
+    end
+
+    class PageTextReceiver
+      extend Forwardable
+      SPACE = " "
+
+      sig { returns(T.untyped) }
+      attr_reader :state
+
+      sig { returns(T.untyped) }
+      attr_reader :options
+
+      sig { params(page: T.untyped).returns(T.untyped) }
+      def page=(page); end
+
+      sig { returns(T.untyped) }
+      def content; end
+
+      sig { params(string: String).void }
+      def show_text(string); end
+
+      sig { params(params: T::Array[T.untyped]).void }
+      def show_text_with_positioning(params); end
+
+      sig { params(str: String).void }
+      def move_to_next_line_and_show_text(str); end
+
+      sig { params(opts: T::Hash[Symbol, T.untyped]).returns(T::Array[PDF::Reader::TextRun]) }
+      def runs(opts = {}); end
+
+      sig { params(aw: Numeric, ac: Numeric, string: String).void }
+      def set_spacing_next_line_show_text(aw, ac, string); end
+
+      sig { params(label: T.untyped).returns(T.untyped) }
+      def invoke_xobject(label); end
+
+      sig { params(string: String).void }
+      def internal_show_text(string); end
+
+      sig { params(x: T.untyped, y: T.untyped).returns(T.untyped) }
+      def apply_rotation(x, y); end
+    end
+
+    class PagesStrategy
+      OPERATORS = {
+      'b'   => :close_fill_stroke,
+      'B'   => :fill_stroke,
+      'b*'  => :close_fill_stroke_with_even_odd,
+      'B*'  => :fill_stroke_with_even_odd,
+      'BDC' => :begin_marked_content_with_pl,
+      'BI'  => :begin_inline_image,
+      'BMC' => :begin_marked_content,
+      'BT'  => :begin_text_object,
+      'BX'  => :begin_compatibility_section,
+      'c'   => :append_curved_segment,
+      'cm'  => :concatenate_matrix,
+      'CS'  => :set_stroke_color_space,
+      'cs'  => :set_nonstroke_color_space,
+      'd'   => :set_line_dash,
+      'd0'  => :set_glyph_width,
+      'd1'  => :set_glyph_width_and_bounding_box,
+      'Do'  => :invoke_xobject,
+      'DP'  => :define_marked_content_with_pl,
+      'EI'  => :end_inline_image,
+      'EMC' => :end_marked_content,
+      'ET'  => :end_text_object,
+      'EX'  => :end_compatibility_section,
+      'f'   => :fill_path_with_nonzero,
+      'F'   => :fill_path_with_nonzero,
+      'f*'  => :fill_path_with_even_odd,
+      'G'   => :set_gray_for_stroking,
+      'g'   => :set_gray_for_nonstroking,
+      'gs'  => :set_graphics_state_parameters,
+      'h'   => :close_subpath,
+      'i'   => :set_flatness_tolerance,
+      'ID'  => :begin_inline_image_data,
+      'j'   => :set_line_join_style,
+      'J'   => :set_line_cap_style,
+      'K'   => :set_cmyk_color_for_stroking,
+      'k'   => :set_cmyk_color_for_nonstroking,
+      'l'   => :append_line,
+      'm'   => :begin_new_subpath,
+      'M'   => :set_miter_limit,
+      'MP'  => :define_marked_content_point,
+      'n'   => :end_path,
+      'q'   => :save_graphics_state,
+      'Q'   => :restore_graphics_state,
+      're'  => :append_rectangle,
+      'RG'  => :set_rgb_color_for_stroking,
+      'rg'  => :set_rgb_color_for_nonstroking,
+      'ri'  => :set_color_rendering_intent,
+      's'   => :close_and_stroke_path,
+      'S'   => :stroke_path,
+      'SC'  => :set_color_for_stroking,
+      'sc'  => :set_color_for_nonstroking,
+      'SCN' => :set_color_for_stroking_and_special,
+      'scn' => :set_color_for_nonstroking_and_special,
+      'sh'  => :paint_area_with_shading_pattern,
+      'T*'  => :move_to_start_of_next_line,
+      'Tc'  => :set_character_spacing,
+      'Td'  => :move_text_position,
+      'TD'  => :move_text_position_and_set_leading,
+      'Tf'  => :set_text_font_and_size,
+      'Tj'  => :show_text,
+      'TJ'  => :show_text_with_positioning,
+      'TL'  => :set_text_leading,
+      'Tm'  => :set_text_matrix_and_text_line_matrix,
+      'Tr'  => :set_text_rendering_mode,
+      'Ts'  => :set_text_rise,
+      'Tw'  => :set_word_spacing,
+      'Tz'  => :set_horizontal_text_scaling,
+      'v'   => :append_curved_segment_initial_point_replicated,
+      'w'   => :set_line_width,
+      'W'   => :set_clipping_path_with_nonzero,
+      'W*'  => :set_clipping_path_with_even_odd,
+      'y'   => :append_curved_segment_final_point_replicated,
+      '\''  => :move_to_next_line_and_show_text,
+      '"'   => :set_spacing_next_line_show_text,
+    }
+    end
+
+    class Parser
+      sig { params(buffer: PDF::Reader::Buffer, objects: T.nilable(PDF::Reader::ObjectHash)).void }
+      def initialize(buffer, objects=nil); end
+
+      sig {
+        params(
+          operators: T::Hash[T.any(String, PDF::Reader::Token), Symbol]
+        ).returns(
+          T.any(PDF::Reader::Reference, PDF::Reader::Token, Numeric, String, Symbol, T::Array[T.untyped], T::Hash[T.untyped, T.untyped], NilClass)
+        )
+      }
+      def parse_token(operators={}); end
+
+      sig {
+        params(
+         id: Integer,
+         gen: Integer
+        ).returns(
+          T.any(PDF::Reader::Reference, PDF::Reader::Token, PDF::Reader::Stream, Numeric, String, Symbol, T::Array[T.untyped], T::Hash[T.untyped, T.untyped], NilClass)
+        )
+      }
+      def object(id, gen); end
+
+      sig { returns(T::Hash[Symbol, T.untyped]) }
+      def dictionary; end
+
+      sig { returns(Symbol) }
+      def pdf_name; end
+
+      sig { returns(T::Array[T.untyped]) }
+      def array; end
+
+      sig { returns(String) }
+      def hex_string; end
+
+      sig { returns(String) }
+      def string; end
+
+      sig { params(dict: T::Hash[Symbol, T.untyped]).returns(PDF::Reader::Stream) }
+      def stream(dict); end
+    end
+
+    class Point
+      sig do
+        params(
+          x: Numeric,
+          y: Numeric,
+        ).void
+      end
+      def initialize(x, y)
+        @x = T.let(T.unsafe(nil), Numeric)
+        @y = T.let(T.unsafe(nil), Numeric)
+      end
+
+      sig { returns(Numeric) }
+      def x; end
+
+      sig { returns(Numeric) }
+      def y; end
+
+      sig { params(other: PDF::Reader::Point).returns(T::Boolean) }
+      def ==(other); end
+
+    end
+
+    class PrintReceiver
+      sig { returns(T.untyped) }
+      attr_accessor :callbacks
+
+      sig { void }
+      def initialize; end
+
+      sig { params(meth: T.untyped).returns(T.untyped) }
+      def respond_to?(meth); end
+
+      sig { params(methodname: T.untyped, args: T.untyped).returns(T.untyped) }
+      def method_missing(methodname, *args); end
+    end
+
+    class Rc4SecurityHandler
+      sig { params(key: String).void }
+      def initialize(key)
+        @encrypt_key = T.let(T.unsafe(nil), String)
+      end
+
+      sig { params(buf: T.untyped, ref: T.untyped).returns(T.untyped) }
+      def decrypt(buf, ref); end
+    end
+
+    class Rectangle
+
+      sig { params(arr: T::Array[Numeric]).returns(PDF::Reader::Rectangle) }
+      def self.from_array(arr); end
+
+      sig do
+        params(
+          x1: Numeric,
+          y1: Numeric,
+          x2: Numeric,
+          y2: Numeric
+        ).void
+      end
+
+      def initialize(x1, y1, x2, y2)
+        @bottom_left = T.let(T.unsafe(nil), PDF::Reader::Point)
+        @bottom_right = T.let(T.unsafe(nil), PDF::Reader::Point)
+        @top_left = T.let(T.unsafe(nil), PDF::Reader::Point)
+        @top_right = T.let(T.unsafe(nil), PDF::Reader::Point)
+      end
+
+      sig { returns(PDF::Reader::Point) }
+      def bottom_left; end
+
+      sig { returns(PDF::Reader::Point) }
+      def bottom_right; end
+
+      sig { returns(PDF::Reader::Point) }
+      def top_left; end
+
+      sig { returns(PDF::Reader::Point) }
+      def top_right; end
+
+      sig { returns(Numeric) }
+      def height; end
+
+      sig { returns(Numeric) }
+      def width; end
+
+      sig { returns(T::Array[Numeric]) }
+      def to_a; end
+
+      sig { params(degrees: Integer).void }
+      def apply_rotation(degrees); end
+
+      sig { params(point: PDF::Reader::Point).void }
+      def contains?(point); end
+
+      sig { params(other: PDF::Reader::Rectangle).void }
+      def ==(other); end
+
+      sig { params(x1: Numeric, y1: Numeric, x2: Numeric, y2: Numeric).void }
+      def set_corners(x1, y1, x2, y2); end
+    end
+
+    class Reference
+      sig { returns(T.untyped) }
+      attr_reader :id
+
+      sig { returns(T.untyped) }
+      attr_reader :gen
+
+      sig { params(id: T.untyped, gen: T.untyped).void }
+      def initialize(id, gen); end
+
+      sig { returns(T.untyped) }
+      def to_a; end
+
+      sig { returns(T.untyped) }
+      def to_i; end
+
+      sig { params(obj: T.untyped).returns(T.untyped) }
+      def ==(obj); end
+
+      sig { returns(T.untyped) }
+      def hash; end
+    end
+
+    class RegisterReceiver
+      sig { returns(T.untyped) }
+      attr_accessor :callbacks
+
+      sig { void }
+      def initialize; end
+
+      sig { params(meth: T.untyped).returns(T.untyped) }
+      def respond_to?(meth); end
+
+      sig { params(methodname: T.untyped, args: T.untyped).returns(T.untyped) }
+      def method_missing(methodname, *args); end
+
+      sig { params(methodname: T.untyped).returns(T.untyped) }
+      def count(methodname); end
+
+      sig { params(methodname: T.untyped).returns(T.untyped) }
+      def all(methodname); end
+
+      sig { params(methodname: T.untyped).returns(T.untyped) }
+      def all_args(methodname); end
+
+      sig { params(methodname: T.untyped).returns(T.untyped) }
+      def first_occurance_of(methodname); end
+
+      sig { params(methodname: T.untyped).returns(T.untyped) }
+      def final_occurance_of(methodname); end
+
+      sig { params(methods: T.untyped).returns(T.untyped) }
+      def series(*methods); end
+    end
+
+    module ResourceMethods
+      extend T::Helpers
+
+      sig { returns(T.untyped) }
+      def color_spaces; end
+
+      sig { returns(T::Hash[T.untyped, T.untyped]) }
+      def fonts; end
+
+      sig { returns(T.untyped) }
+      def graphic_states; end
+
+      sig { returns(T.untyped) }
+      def patterns; end
+
+      sig { returns(T.untyped) }
+      def procedure_sets; end
+
+      sig { returns(T.untyped) }
+      def properties; end
+
+      sig { returns(T.untyped) }
+      def shadings; end
+
+      sig { returns(T.untyped) }
+      def xobjects; end
+    end
+
+    class SecurityHandlerFactory
+      sig { params(encrypt: T.untyped, doc_id: T.untyped, password: T.untyped).returns(T.untyped) }
+      def self.build(encrypt, doc_id, password); end
+
+      sig { params(encrypt: T.untyped, doc_id: T.untyped, password: T.untyped).returns(T.untyped) }
+      def self.build_standard_handler(encrypt, doc_id, password); end
+
+      sig { params(encrypt: T.untyped, doc_id: T.untyped, password: T.untyped).returns(T.untyped) }
+      def self.build_v5_handler(encrypt, doc_id, password); end
+
+      sig { params(encrypt: T.untyped).returns(T.untyped) }
+      def self.standard?(encrypt); end
+
+      sig { params(encrypt: T.untyped).returns(T.untyped) }
+      def self.standard_v5?(encrypt); end
+    end
+
+    class StandardKeyBuilder
+      PassPadBytes = [ 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41,
+                     0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08,
+                     0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,
+                     0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a ]
+
+      sig { params(opts: T::Hash[Symbol, T.untyped]).void }
+      def initialize(opts = {}); end
+
+      sig { params(pass: String).returns(String) }
+      def key(pass); end
+
+      sig { params(p: T.untyped).returns(T.untyped) }
+      def pad_pass(p = ""); end
+
+      sig { params(buf: T.untyped, int: T.untyped).returns(T.untyped) }
+      def xor_each_byte(buf, int); end
+
+      sig { params(pass: T.untyped).returns(T.untyped) }
+      def auth_owner_pass(pass); end
+
+      sig { params(pass: T.untyped).returns(T.untyped) }
+      def auth_user_pass(pass); end
+
+      sig { params(user_pass: T.untyped).returns(T.untyped) }
+      def make_file_key(user_pass); end
+    end
+
+    class Stream
+      sig { returns(T::Hash[Symbol, T.untyped]) }
+      attr_accessor :hash
+
+      sig { returns(String) }
+      attr_accessor :data
+
+      sig { params(hash: T::Hash[Symbol, T.untyped], data: String).void }
+      def initialize(hash, data)
+        @hash = T.let(T.unsafe(nil), T::Hash[Symbol, T.untyped])
+        @data = T.let(T.unsafe(nil), String)
+        @udata = T.let(T.unsafe(nil), T.nilable(String))
+      end
+
+      sig { returns(String) }
+      def unfiltered_data; end
+    end
+
+    class SynchronizedCache
+      sig { void }
+      def initialize; end
+
+      sig { params(key: T.untyped).returns(T.untyped) }
+      def [](key); end
+
+      sig { params(key: T.untyped, value: T.untyped).returns(T.untyped) }
+      def []=(key, value); end
+    end
+
+    class TextRun
+      include Comparable
+
+      sig { returns(T.untyped) }
+      attr_reader :x
+
+      sig { returns(T.untyped) }
+      attr_reader :y
+
+      sig { returns(T.untyped) }
+      attr_reader :width
+
+      sig { returns(T.untyped) }
+      attr_reader :font_size
+
+      sig { returns(T.untyped) }
+      attr_reader :text
+
+      sig do
+        params(
+          x: T.untyped,
+          y: T.untyped,
+          width: T.untyped,
+          font_size: T.untyped,
+          text: T.untyped
+        ).void
+      end
+      def initialize(x, y, width, font_size, text); end
+
+      sig { params(other: T.untyped).returns(T.untyped) }
+      def <=>(other); end
+
+      sig { returns(T.untyped) }
+      def endx; end
+
+      sig { returns(T.untyped) }
+      def endy; end
+
+      sig { returns(T.untyped) }
+      def mean_character_width; end
+
+      sig { params(other: PDF::Reader::TextRun).returns(T::Boolean) }
+      def mergable?(other); end
+
+      sig { params(other: PDF::Reader::TextRun).returns(PDF::Reader::TextRun) }
+      def +(other); end
+
+      sig { returns(T.untyped) }
+      def inspect; end
+
+      sig { params(other_run: T.untyped).returns(T.untyped) }
+      def intersect?(other_run); end
+
+      sig { params(other_run: T.untyped).returns(T.untyped) }
+      def intersection_area_percent(other_run); end
+
+      sig { returns(T.untyped) }
+      def area; end
+
+      sig { returns(T.untyped) }
+      def mergable_range; end
+
+      sig { returns(T.untyped) }
+      def character_count; end
+    end
+
+    class Token < String
+      sig { params(val: T.untyped).void }
+      def initialize(val); end
+    end
+
+    class TransformationMatrix
+      sig { returns(T.untyped) }
+      attr_reader :a
+
+      sig { returns(T.untyped) }
+      attr_reader :b
+
+      sig { returns(T.untyped) }
+      attr_reader :c
+
+      sig { returns(T.untyped) }
+      attr_reader :d
+
+      sig { returns(T.untyped) }
+      attr_reader :e
+
+      sig { returns(T.untyped) }
+      attr_reader :f
+
+      sig do
+        params(
+          a: T.untyped,
+          b: T.untyped,
+          c: T.untyped,
+          d: T.untyped,
+          e: T.untyped,
+          f: T.untyped
+        ).void
+      end
+      def initialize(a, b, c, d, e, f); end
+
+      sig { returns(T.untyped) }
+      def inspect; end
+
+      sig { returns(T.untyped) }
+      def to_a; end
+
+      sig do
+        params(
+          a: T.untyped,
+          b: T.untyped,
+          c: T.untyped,
+          d: T.untyped,
+          e: T.untyped,
+          f: T.untyped
+        ).returns(T.untyped)
+      end
+      def multiply!(a, b = nil, c = nil, d = nil, e = nil, f = nil); end
+
+      sig { params(e2: T.untyped).returns(T.untyped) }
+      def horizontal_displacement_multiply!(e2); end
+
+      sig do
+        params(
+          a2: T.untyped,
+          b2: T.untyped,
+          c2: T.untyped,
+          d2: T.untyped,
+          e2: T.untyped,
+          f2: T.untyped
+        ).returns(T.untyped)
+      end
+      def horizontal_displacement_multiply_reversed!(a2, b2, c2, d2, e2, f2); end
+
+      sig do
+        params(
+          a2: T.untyped,
+          b2: T.untyped,
+          c2: T.untyped,
+          d2: T.untyped,
+          e2: T.untyped,
+          f2: T.untyped
+        ).returns(T.untyped)
+      end
+      def xy_scaling_multiply!(a2, b2, c2, d2, e2, f2); end
+
+      sig do
+        params(
+          a2: T.untyped,
+          b2: T.untyped,
+          c2: T.untyped,
+          d2: T.untyped,
+          e2: T.untyped,
+          f2: T.untyped
+        ).returns(T.untyped)
+      end
+      def xy_scaling_multiply_reversed!(a2, b2, c2, d2, e2, f2); end
+
+      sig do
+        params(
+          a2: T.untyped,
+          b2: T.untyped,
+          c2: T.untyped,
+          d2: T.untyped,
+          e2: T.untyped,
+          f2: T.untyped
+        ).returns(T.untyped)
+      end
+      def regular_multiply!(a2, b2, c2, d2, e2, f2); end
+
+      sig do
+        params(
+          a2: T.untyped,
+          b2: T.untyped,
+          c2: T.untyped,
+          d2: T.untyped,
+          e2: T.untyped,
+          f2: T.untyped
+        ).returns(T.untyped)
+      end
+      def faster_multiply!(a2, b2, c2, d2, e2, f2); end
+    end
+
+    class TypeCheck
+
+      sig { params(obj: T.untyped).returns(Numeric) }
+      def self.cast_to_numeric!(obj); end
+
+      sig { params(string: T.untyped).returns(String) }
+      def self.cast_to_string!(string); end
+
+      sig { params(obj: T.untyped).returns(T.nilable(Symbol)) }
+      def self.cast_to_symbol(obj); end
+    end
+
+    class ValidatingReceiver
+      sig { params(wrapped: T.untyped).void }
+      def initialize(wrapped)
+        @wrapped = T.let(T.unsafe(nil), T.untyped)
+      end
+
+      sig { params(page: PDF::Reader::Page).void }
+      def page=(page); end
+
+      sig { params(args: T.untyped).void }
+      def save_graphics_state(*args); end
+
+      sig { params(args: T.untyped).void }
+      def restore_graphics_state(*args); end
+
+      sig { params(args: T.untyped).void }
+      def concatenate_matrix(*args); end
+
+      sig { params(args: T.untyped).void }
+      def begin_text_object(*args); end
+
+      sig { params(args: T.untyped).void }
+      def end_text_object(*args); end
+
+      sig { params(args: T.untyped).void }
+      def set_character_spacing(*args); end
+
+      sig { params(args: T.untyped).void }
+      def set_horizontal_text_scaling(*args); end
+
+      sig { params(args: T.untyped).void }
+      def set_text_font_and_size(*args); end
+
+      sig { params(args: T.untyped).void }
+      def set_text_leading(*args); end
+
+      sig { params(args: T.untyped).void }
+      def set_text_rendering_mode(*args); end
+
+      sig { params(args: T.untyped).void }
+      def set_text_rise(*args); end
+
+      sig { params(args: T.untyped).void }
+      def set_word_spacing(*args); end
+
+      sig { params(args: T.untyped).void }
+      def move_text_position(*args); end
+
+      sig { params(args: T.untyped).void }
+      def move_text_position_and_set_leading(*args); end
+
+      sig { params(args: T.untyped).void }
+      def set_text_matrix_and_text_line_matrix(*args); end
+
+      sig { params(args: T.untyped).void }
+      def move_to_start_of_next_line(*args); end
+
+      sig { params(args: T.untyped).void }
+      def show_text(*args); end
+
+      sig { params(args: T.untyped).void }
+      def show_text_with_positioning(*args); end
+
+      sig { params(args: T.untyped).void }
+      def move_to_next_line_and_show_text(*args); end
+
+      sig { params(args: T.untyped).void }
+      def set_spacing_next_line_show_text(*args); end
+
+      sig { params(args: T.untyped).void }
+      def invoke_xobject(*args); end
+
+      sig { params(args: T.untyped).void }
+      def begin_inline_image(*args); end
+
+      sig { params(args: T.untyped).void }
+      def begin_inline_image_data(*args); end
+
+      sig { params(args: T.untyped).void }
+      def end_inline_image(*args); end
+
+      sig { params(meth: T.untyped).returns(T::Boolean) }
+      def respond_to?(meth); end
+
+      sig { params(methodname: Symbol, args: T.untyped).void }
+      def method_missing(methodname, *args); end
+
+      sig { params(methodname: T.untyped, args: T.untyped).void }
+      def call_wrapped(methodname, *args); end
+    end
+
+    class UnimplementedSecurityHandler
+      sig { params(encrypt: T.untyped).returns(T.untyped) }
+      def self.supports?(encrypt); end
+
+      sig { params(buf: T.untyped, ref: T.untyped).returns(T.untyped) }
+      def decrypt(buf, ref); end
+    end
+
+    class XRef
+      include Enumerable
+
+      sig { returns(T.untyped) }
+      attr_reader :trailer
+
+      sig { params(io: T.untyped).void }
+      def initialize(io); end
+
+      sig { returns(T.untyped) }
+      def size; end
+
+      sig { params(ref: T.untyped).returns(T.untyped) }
+      def [](ref); end
+
+      sig { params(block: T.untyped).returns(T.untyped) }
+      def each(&block); end
+
+      sig { params(offset: T.untyped).returns(T.untyped) }
+      def load_offsets(offset = nil); end
+
+      sig { params(buf: T.untyped).returns(T.untyped) }
+      def load_xref_table(buf); end
+
+      sig { params(stream: T.untyped).returns(T.untyped) }
+      def load_xref_stream(stream); end
+
+      sig { params(bytes: T.untyped).returns(T.untyped) }
+      def unpack_bytes(bytes); end
+
+      sig { params(offset: T.untyped).returns(T.untyped) }
+      def new_buffer(offset = 0); end
+
+      sig { params(id: T.untyped, gen: T.untyped, offset: T.untyped).returns(T.untyped) }
+      def store(id, gen, offset); end
+
+      sig { params(io: T.untyped).returns(T.untyped) }
+      def calc_junk_offset(io); end
+    end
+
+    class ZeroWidthRunsFilter
+      sig { params(runs: T::Array[PDF::Reader::TextRun]).returns(T::Array[PDF::Reader::TextRun]) }
+      def self.exclude_zero_width_runs(runs); end
+    end
+
+    module Filter
+      sig { params(name: Symbol, options: T::Hash[T.untyped, T.untyped]).returns(T.untyped) }
+      def self.with(name, options = {}); end
+
+      class Ascii85
+        sig { params(options: T::Hash[T.untyped, T.untyped]).void }
+        def initialize(options = {})
+          @options = T.let(T.unsafe(nil), T::Hash[T.untyped, T.untyped])
+        end
+
+        sig { params(data: String).returns(String) }
+        def filter(data); end
+      end
+
+      class AsciiHex
+        sig { params(options: T::Hash[T.untyped, T.untyped]).void }
+        def initialize(options = {})
+          @options = T.let(T.unsafe(nil), T::Hash[T.untyped, T.untyped])
+        end
+
+        sig { params(data: String).returns(String) }
+        def filter(data); end
+      end
+
+      class Depredict
+        sig { params(options: T::Hash[T.untyped, T.untyped]).void }
+        def initialize(options = {}); end
+
+        sig { params(data: String).returns(String) }
+        def filter(data); end
+
+        sig { params(data: T.untyped).returns(T.untyped) }
+        def tiff_depredict(data); end
+
+        sig { params(data: T.untyped).returns(T.untyped) }
+        def png_depredict(data); end
+      end
+
+      class Flate
+        ZLIB_AUTO_DETECT_ZLIB_OR_GZIP = 47
+        ZLIB_RAW_DEFLATE = -15
+
+        sig { params(options: T::Hash[T.untyped, T.untyped]).void }
+        def initialize(options = {})
+          @options = T.let(T.unsafe(nil), T::Hash[T.untyped, T.untyped])
+        end
+
+        sig { params(data: String).returns(String) }
+        def filter(data); end
+
+        sig { params(data: T.untyped).returns(T.untyped) }
+        def zlib_inflate(data); end
+      end
+
+      class Lzw
+        sig { params(options: T::Hash[T.untyped, T.untyped]).void }
+        def initialize(options = {})
+          @options = T.let(T.unsafe(nil), T::Hash[T.untyped, T.untyped])
+        end
+
+        sig { params(data: String).returns(String) }
+        def filter(data); end
+      end
+
+      class Null
+        sig { params(options: T::Hash[T.untyped, T.untyped]).void }
+        def initialize(options = {})
+          @options = T.let(T.unsafe(nil), T::Hash[T.untyped, T.untyped])
+        end
+
+        sig { params(data: T.untyped).returns(T.untyped) }
+        def filter(data); end
+      end
+
+      class RunLength
+        sig { params(options: T::Hash[T.untyped, T.untyped]).void }
+        def initialize(options = {})
+          @options = T.let(T.unsafe(nil), T::Hash[T.untyped, T.untyped])
+        end
+
+        sig { params(data: String).returns(String) }
+        def filter(data); end
+      end
+    end
+
+    module WidthCalculator
+      class BuiltIn
+        BUILTINS = [
+        :Courier, :"Courier-Bold", :"Courier-BoldOblique", :"Courier-Oblique",
+        :Helvetica, :"Helvetica-Bold", :"Helvetica-BoldOblique", :"Helvetica-Oblique",
+        :Symbol,
+        :"Times-Roman", :"Times-Bold", :"Times-BoldItalic", :"Times-Italic",
+        :ZapfDingbats
+      ]
+
+        sig { params(font: T.untyped).void }
+        def initialize(font); end
+
+        sig { params(code_point: T.untyped).returns(T.untyped) }
+        def glyph_width(code_point); end
+
+        sig { params(code_point: T.untyped).returns(T.untyped) }
+        def control_character?(code_point); end
+
+        sig { params(font_name: T.untyped).returns(T.untyped) }
+        def extract_basefont(font_name); end
+      end
+
+      class Composite
+        sig { params(font: T.untyped).void }
+        def initialize(font); end
+
+        sig { params(code_point: T.untyped).returns(T.untyped) }
+        def glyph_width(code_point); end
+      end
+
+      class TrueType
+        sig { params(font: T.untyped).void }
+        def initialize(font); end
+
+        sig { params(code_point: T.untyped).returns(T.untyped) }
+        def glyph_width(code_point); end
+
+        sig { params(code_point: T.untyped).returns(T.untyped) }
+        def glyph_width_from_font(code_point); end
+
+        sig { params(code_point: T.untyped).returns(T.untyped) }
+        def glyph_width_from_descriptor(code_point); end
+      end
+
+      class TypeOneOrThree
+        sig { params(font: T.untyped).void }
+        def initialize(font); end
+
+        sig { params(code_point: T.untyped).returns(T.untyped) }
+        def glyph_width(code_point); end
+      end
+
+      class TypeZero
+        sig { params(font: T.untyped).void }
+        def initialize(font); end
+
+        sig { params(code_point: T.untyped).returns(T.untyped) }
+        def glyph_width(code_point); end
+      end
+    end
+  end
+end
diff --git a/scripts/require-strict-typing b/scripts/require-strict-typing
new file mode 100755
index 0000000..317f4a9
--- /dev/null
+++ b/scripts/require-strict-typing
@@ -0,0 +1,23 @@
+#!/usr/bin/env ruby
+
+sha_that_introduced_sorbet = 'feb9203'
+
+raw_files_added = `git diff --numstat --diff-filter=A #{sha_that_introduced_sorbet} HEAD -- lib/`
+
+just_files_added = raw_files_added.split("\n").map { |line|
+  line.split(/\s+/).last
+}
+
+files_added_without_strict_typing = just_files_added.reject { |path|
+  File.read(path).include?("typed: strict")
+}
+
+if files_added_without_strict_typing.any?
+  $stderr.puts "The following source files added since #{sha_that_introduced_sorbet} need 'typed: strict' added:'"
+  files_added_without_strict_typing.each do |path|
+    $stderr.puts "- #{path}"
+  end
+  exit 1
+else
+  puts "All source files added since #{sha_that_introduced_sorbet} have strict typing"
+end
diff --git a/sorbet/config b/sorbet/config
new file mode 100644
index 0000000..534118e
--- /dev/null
+++ b/sorbet/config
@@ -0,0 +1,3 @@
+--dir
+.
+--ignore=/vendor/bundle
diff --git a/sorbet/rbi/gems/Ascii85.rbi b/sorbet/rbi/gems/Ascii85.rbi
new file mode 100644
index 0000000..bce9957
--- /dev/null
+++ b/sorbet/rbi/gems/Ascii85.rbi
@@ -0,0 +1,17 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/Ascii85/all/Ascii85.rbi
+#
+# Ascii85-1.1.0
+
+module Ascii85
+  def self.decode(str); end
+  def self.encode(str, wrap_lines = nil); end
+end
+class Ascii85::DecodingError < StandardError
+end
diff --git a/sorbet/rbi/gems/afm.rbi b/sorbet/rbi/gems/afm.rbi
new file mode 100644
index 0000000..d8b62a9
--- /dev/null
+++ b/sorbet/rbi/gems/afm.rbi
@@ -0,0 +1,23 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/afm/all/afm.rbi
+#
+# afm-0.2.2
+
+module AFM
+end
+class AFM::Font
+  def [](key); end
+  def char_metrics; end
+  def char_metrics_by_code; end
+  def initialize(filename); end
+  def kern_pairs; end
+  def metadata; end
+  def metrics_for(char); end
+  def self.from_file(file); end
+end
diff --git a/sorbet/rbi/gems/ascii85_native.rbi b/sorbet/rbi/gems/ascii85_native.rbi
new file mode 100644
index 0000000..bc14924
--- /dev/null
+++ b/sorbet/rbi/gems/ascii85_native.rbi
@@ -0,0 +1,26 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/ascii85_native/all/ascii85_native.rbi
+#
+# ascii85_native-1.0.3
+
+module Ascii85Native
+  def a85_decode(*arg0); end
+  def a85_decoded_size(*arg0); end
+  def a85_encode(*arg0); end
+  def a85_encoded_size(*arg0); end
+  def self.a85_decode(*arg0); end
+  def self.a85_decoded_size(*arg0); end
+  def self.a85_encode(*arg0); end
+  def self.a85_encoded_size(*arg0); end
+  def self.decode(input, force_delimiter = nil); end
+  def self.encode(input, include_delimiter = nil); end
+  def self.find_stream_end(input); end
+  def self.find_stream_start(input); end
+  extend FFI::Library
+end
diff --git a/sorbet/rbi/gems/ast.rbi b/sorbet/rbi/gems/ast.rbi
new file mode 100644
index 0000000..2b18c4a
--- /dev/null
+++ b/sorbet/rbi/gems/ast.rbi
@@ -0,0 +1,49 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/ast/all/ast.rbi
+#
+# ast-2.4.2
+
+module AST
+end
+class AST::Node
+  def +(array); end
+  def <<(element); end
+  def ==(other); end
+  def append(element); end
+  def assign_properties(properties); end
+  def children; end
+  def clone; end
+  def concat(array); end
+  def deconstruct; end
+  def dup; end
+  def eql?(other); end
+  def fancy_type; end
+  def hash; end
+  def initialize(type, children = nil, properties = nil); end
+  def inspect(indent = nil); end
+  def original_dup; end
+  def to_a; end
+  def to_ast; end
+  def to_s(indent = nil); end
+  def to_sexp(indent = nil); end
+  def to_sexp_array; end
+  def type; end
+  def updated(type = nil, children = nil, properties = nil); end
+end
+class AST::Processor
+  include AST::Processor::Mixin
+end
+module AST::Processor::Mixin
+  def handler_missing(node); end
+  def process(node); end
+  def process_all(nodes); end
+end
+module AST::Sexp
+  def s(type, *children); end
+end
diff --git a/sorbet/rbi/gems/cane.rbi b/sorbet/rbi/gems/cane.rbi
new file mode 100644
index 0000000..abf50af
--- /dev/null
+++ b/sorbet/rbi/gems/cane.rbi
@@ -0,0 +1,233 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/cane/all/cane.rbi
+#
+# cane-3.0.0
+
+module Cane
+  def default_checks; end
+  def run(*args); end
+  def self.default_checks; end
+  def self.run(*args); end
+  def self.task_runner(opts); end
+  def task_runner(opts); end
+end
+class Cane::ViolationFormatter
+  def colorize(string); end
+  def column_widths(violations, columns); end
+  def format_group_header(description, violations); end
+  def format_violation(v, column_widths); end
+  def format_violations(violations); end
+  def initialize(violations, options = nil); end
+  def options; end
+  def to_s; end
+  def totals; end
+  def violations; end
+end
+class Cane::JsonFormatter
+  def initialize(violations, options = nil); end
+  def to_s; end
+end
+class Cane::Runner
+  def checks; end
+  def formatter; end
+  def initialize(spec); end
+  def opts; end
+  def outputter; end
+  def run; end
+  def violations; end
+end
+class Cane::EncodingAwareIterator
+  def each(&block); end
+  def initialize(lines); end
+  def lines; end
+  include Enumerable
+end
+class Cane::File
+  def self.case_insensitive_glob(glob); end
+  def self.contents(path); end
+  def self.exists?(path); end
+  def self.iterator(path); end
+  def self.open(path); end
+end
+class Cane::SimpleTaskRunner
+  def self.map(enumerable, &block); end
+end
+class Anonymous_Struct_1 < Struct
+  def opts; end
+  def opts=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class Cane::AbcCheck < Anonymous_Struct_1
+  def exclusions; end
+  def file_names; end
+  def find_violations(file_name); end
+  def max_allowed_complexity; end
+  def order(result); end
+  def self.key; end
+  def self.name; end
+  def self.options; end
+  def violations; end
+  def worker; end
+end
+class Anonymous_Struct_2 < Struct
+  def file_name; end
+  def file_name=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class Cane::AbcCheck::InvalidAst < Anonymous_Struct_2
+  def violations; end
+end
+class Anonymous_Struct_3 < Struct
+  def exclusions; end
+  def exclusions=(_); end
+  def file_name; end
+  def file_name=(_); end
+  def max_allowed_complexity; end
+  def max_allowed_complexity=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def sexps; end
+  def sexps=(_); end
+end
+class Cane::AbcCheck::RubyAst < Anonymous_Struct_3
+  def anon_method_add; end
+  def anon_method_add=(arg0); end
+  def assignment_nodes; end
+  def branch_nodes; end
+  def calculate_abc(method_node); end
+  def condition_nodes; end
+  def container_label(node); end
+  def container_nodes; end
+  def count_nodes(node, types); end
+  def excluded?(method_description); end
+  def initialize(*args); end
+  def label_for(node); end
+  def method_description(node, *modules, meth_name); end
+  def method_nodes; end
+  def process_ast(node, complexity = nil, nesting = nil); end
+  def violations; end
+end
+class Anonymous_Struct_4 < Struct
+  def opts; end
+  def opts=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class Cane::StyleCheck < Anonymous_Struct_4
+  def excluded?(file); end
+  def exclusions; end
+  def file_list; end
+  def map_lines(file_path, &block); end
+  def measure; end
+  def self.key; end
+  def self.name; end
+  def self.options; end
+  def violations; end
+  def violations_for_line(line); end
+  def worker; end
+end
+class Anonymous_Struct_5 < Struct
+  def opts; end
+  def opts=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class Cane::DocCheck < Anonymous_Struct_5
+  def class_definition(number, line, last_line); end
+  def class_definition?(line); end
+  def class_definitions_in(file_name); end
+  def comment?(line); end
+  def excluded?(file); end
+  def exclusions; end
+  def extract_class_name(line); end
+  def file_names; end
+  def find_violations(file_name); end
+  def method_definition?(line); end
+  def missing_file_violations; end
+  def self.key; end
+  def self.name; end
+  def self.options; end
+  def single_line_class_definition?(line); end
+  def violations; end
+  def worker; end
+end
+class Cane::DocCheck::ClassDefinition < Struct
+  def label; end
+  def line; end
+  def missing_doc?; end
+  def requires_doc=(value); end
+  def requires_doc?; end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def values; end
+  def values=(_); end
+end
+class Anonymous_Struct_6 < Struct
+  def opts; end
+  def opts=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class Cane::ThresholdCheck < Anonymous_Struct_6
+  def normalized_limit(limit); end
+  def self.key; end
+  def self.options; end
+  def thresholds; end
+  def value_from_file(file); end
+  def violations; end
+end
+class Cane::ThresholdCheck::UnavailableValue
+  def >=(_); end
+  def real?; end
+  def to_s; end
+end
+module Cane::CLI
+  def default_options; end
+  def defaults(check); end
+  def run(args); end
+  def self.default_options; end
+  def self.defaults(check); end
+  def self.run(args); end
+end
+class Cane::CLI::Parser
+  def add_banner; end
+  def add_cane_options; end
+  def add_check_options(check); end
+  def add_checks_shortcut; end
+  def add_help; end
+  def add_option(option, description, opts = nil); end
+  def add_user_defined_checks; end
+  def add_version; end
+  def get_default_options; end
+  def initialize(stdout = nil); end
+  def options; end
+  def parse(args, ret = nil); end
+  def parser; end
+  def read_options_from_file(file); end
+  def self.parse(*args); end
+  def stdout; end
+end
+class Cane::CLI::Parser::OptionsHandled < RuntimeError
+end
diff --git a/sorbet/rbi/gems/coderay.rbi b/sorbet/rbi/gems/coderay.rbi
new file mode 100644
index 0000000..539972f
--- /dev/null
+++ b/sorbet/rbi/gems/coderay.rbi
@@ -0,0 +1,285 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/coderay/all/coderay.rbi
+#
+# coderay-1.1.3
+
+module CodeRay
+  def self.coderay_path(*path); end
+  def self.encode(code, lang, format, options = nil); end
+  def self.encode_file(filename, format, options = nil); end
+  def self.encode_tokens(tokens, format, options = nil); end
+  def self.encoder(format, options = nil); end
+  def self.get_scanner_options(options); end
+  def self.highlight(code, lang, options = nil, format = nil); end
+  def self.highlight_file(filename, options = nil, format = nil); end
+  def self.scan(code, lang, options = nil, &block); end
+  def self.scan_file(filename, lang = nil, options = nil, &block); end
+  def self.scanner(lang, options = nil, &block); end
+end
+module CodeRay::FileType
+  def self.[](filename, read_shebang = nil); end
+  def self.fetch(filename, default = nil, read_shebang = nil); end
+  def self.type_from_shebang(filename); end
+end
+class CodeRay::FileType::UnknownFileType < Exception
+end
+class CodeRay::Tokens < Array
+  def begin_group(kind); end
+  def begin_line(kind); end
+  def count; end
+  def encode(encoder, options = nil); end
+  def end_group(kind); end
+  def end_line(kind); end
+  def method_missing(meth, options = nil); end
+  def scanner; end
+  def scanner=(arg0); end
+  def split_into_parts(*sizes); end
+  def text_token(*arg0); end
+  def to_s; end
+  def tokens(*arg0); end
+end
+class CodeRay::TokensProxy
+  def block; end
+  def block=(arg0); end
+  def each(*args, &blk); end
+  def encode(encoder, options = nil); end
+  def initialize(input, lang, options = nil, block = nil); end
+  def input; end
+  def input=(arg0); end
+  def lang; end
+  def lang=(arg0); end
+  def method_missing(method, *args, &blk); end
+  def options; end
+  def options=(arg0); end
+  def scanner; end
+  def tokens; end
+end
+module CodeRay::PluginHost
+  def [](id, *args, &blk); end
+  def all_plugins; end
+  def const_missing(const); end
+  def default(id = nil); end
+  def list; end
+  def load(id, *args, &blk); end
+  def load_all; end
+  def load_plugin_map; end
+  def make_plugin_hash; end
+  def map(hash); end
+  def path_to(plugin_id); end
+  def plugin_hash; end
+  def plugin_path(*args); end
+  def register(plugin, id); end
+  def self.extended(mod); end
+  def validate_id(id); end
+end
+class CodeRay::PluginHost::PluginNotFound < LoadError
+end
+class CodeRay::PluginHost::HostNotFound < LoadError
+end
+module CodeRay::Plugin
+  def aliases; end
+  def plugin_host(host = nil); end
+  def plugin_id; end
+  def register_for(id); end
+  def title(title = nil); end
+end
+module CodeRay::Scanners
+  extend CodeRay::PluginHost
+end
+class CodeRay::Scanners::Scanner < StringScanner
+  def binary_string; end
+  def column(pos = nil); end
+  def each(&block); end
+  def file_extension; end
+  def initialize(code = nil, options = nil); end
+  def lang; end
+  def line(pos = nil); end
+  def raise_inspect(message, tokens, state = nil, ambit = nil, backtrace = nil); end
+  def raise_inspect_arguments(message, tokens, state, ambit); end
+  def reset; end
+  def reset_instance; end
+  def scan_rest; end
+  def scan_tokens(tokens, options); end
+  def scanner_state_info(state); end
+  def self.encode_with_encoding(code, target_encoding); end
+  def self.encoding(name = nil); end
+  def self.file_extension(extension = nil); end
+  def self.guess_encoding(s); end
+  def self.lang; end
+  def self.normalize(code); end
+  def self.to_unix(code); end
+  def set_string_from_source(source); end
+  def set_tokens_from_options(options); end
+  def setup; end
+  def state; end
+  def state=(arg0); end
+  def string=(code); end
+  def tokenize(source = nil, options = nil); end
+  def tokens; end
+  def tokens_last(tokens, n); end
+  def tokens_size(tokens); end
+  extend CodeRay::Plugin
+  include Enumerable
+end
+class CodeRay::Scanners::Scanner::ScanError < StandardError
+end
+class CodeRay::WordList < Hash
+  def add(words, value = nil); end
+  def initialize(default = nil); end
+end
+class CodeRay::WordList::CaseIgnoring < CodeRay::WordList
+  def [](key); end
+  def []=(key, value); end
+end
+module CodeRay::Scanners::Java::BuiltinTypes
+end
+class CodeRay::Scanners::Java < CodeRay::Scanners::Scanner
+  def scan_tokens(encoder, options); end
+end
+class CodeRay::Scanners::Ruby < CodeRay::Scanners::Scanner
+  def interpreted_string_state; end
+  def scan_tokens(encoder, options); end
+  def setup; end
+end
+module CodeRay::Scanners::Ruby::Patterns
+end
+class Anonymous_Struct_7 < Struct
+  def delim; end
+  def delim=(_); end
+  def heredoc; end
+  def heredoc=(_); end
+  def interpreted; end
+  def interpreted=(_); end
+  def next_state; end
+  def next_state=(_); end
+  def opening_paren; end
+  def opening_paren=(_); end
+  def paren_depth; end
+  def paren_depth=(_); end
+  def pattern; end
+  def pattern=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def type; end
+  def type=(_); end
+end
+class CodeRay::Scanners::Ruby::StringState < Anonymous_Struct_7
+  def heredoc_pattern(delim, interpreted, indented); end
+  def initialize(kind, interpreted, delim, heredoc = nil); end
+  def self.simple_key_pattern(delim); end
+end
+module CodeRay::Encoders
+  extend CodeRay::PluginHost
+end
+class CodeRay::Encoders::Encoder
+  def <<(token); end
+  def begin_group(kind); end
+  def begin_line(kind); end
+  def compile(tokens, options = nil); end
+  def encode(code, lang, options = nil); end
+  def encode_tokens(tokens, options = nil); end
+  def end_group(kind); end
+  def end_line(kind); end
+  def file_extension; end
+  def finish(options); end
+  def get_output(options); end
+  def highlight(code, lang, options = nil); end
+  def initialize(options = nil); end
+  def options; end
+  def options=(arg0); end
+  def output(data); end
+  def scanner; end
+  def scanner=(arg0); end
+  def self.const_missing(sym); end
+  def self.file_extension; end
+  def setup(options); end
+  def text_token(text, kind); end
+  def token(content, kind); end
+  def tokens(tokens, options = nil); end
+  extend CodeRay::Plugin
+end
+class CodeRay::Encoders::HTML < CodeRay::Encoders::Encoder
+  def begin_group(kind); end
+  def begin_line(kind); end
+  def break_lines(text, style); end
+  def check_group_nesting(name, kind); end
+  def check_options!(options); end
+  def close_span; end
+  def css; end
+  def css_class_for_kinds(kinds); end
+  def end_group(kind); end
+  def end_line(kind); end
+  def finish(options); end
+  def make_span_for_kinds(method, hint); end
+  def self.make_html_escape_hash; end
+  def self.token_path_to_hint(hint, kinds); end
+  def setup(options); end
+  def style_for_kinds(kinds); end
+  def text_token(text, kind); end
+end
+module CodeRay::Encoders::HTML::Output
+  def apply_title!(title); end
+  def css; end
+  def css=(arg0); end
+  def self.extended(o); end
+  def self.make_stylesheet(css, in_tag = nil); end
+  def self.page_template_for_css(css); end
+  def stylesheet(in_tag = nil); end
+  def wrap!(element, *args); end
+  def wrap_in!(template); end
+  def wrapped_in; end
+  def wrapped_in=(arg0); end
+  def wrapped_in?(element); end
+end
+class CodeRay::Encoders::HTML::Output::Template < String
+  def apply(target, replacement); end
+  def self.wrap!(str, template, target); end
+end
+class CodeRay::Encoders::HTML::CSS
+  def get_style_for_css_classes(css_classes); end
+  def initialize(style = nil); end
+  def parse(stylesheet); end
+  def self.load_stylesheet(style = nil); end
+  def stylesheet; end
+end
+module CodeRay::Encoders::HTML::Numbering
+  def self.number!(output, mode = nil, options = nil); end
+end
+module CodeRay::Styles
+  extend CodeRay::PluginHost
+end
+class CodeRay::Styles::Style
+  extend CodeRay::Plugin
+end
+class CodeRay::Duo
+  def call(code, options = nil); end
+  def encode(code, options = nil); end
+  def encoder; end
+  def format; end
+  def format=(arg0); end
+  def highlight(code, options = nil); end
+  def initialize(lang = nil, format = nil, options = nil); end
+  def lang; end
+  def lang=(arg0); end
+  def options; end
+  def options=(arg0); end
+  def scanner; end
+  def self.[](*arg0); end
+end
+class CodeRay::Encoders::Terminal < CodeRay::Encoders::Encoder
+  def begin_group(kind); end
+  def begin_line(kind); end
+  def end_group(kind); end
+  def end_line(kind); end
+  def open_token(kind); end
+  def setup(options); end
+  def text_token(text, kind); end
+end
diff --git a/sorbet/rbi/gems/commander.rbi b/sorbet/rbi/gems/commander.rbi
new file mode 100644
index 0000000..d357100
--- /dev/null
+++ b/sorbet/rbi/gems/commander.rbi
@@ -0,0 +1,197 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/commander/all/commander.rbi
+#
+# commander-4.6.0
+
+module Commander
+  def configure(*configuration_opts, &configuration_block); end
+  def self.configure(*configuration_opts, &configuration_block); end
+end
+module Blank
+  def self.included(base); end
+end
+module Commander::UI
+  def applescript(script); end
+  def ask_editor(input = nil, preferred_editor = nil); end
+  def available_editor(preferred = nil); end
+  def choose(message = nil, *choices, &block); end
+  def color(*args); end
+  def converse(prompt, responses = nil); end
+  def enable_paging; end
+  def io(input = nil, output = nil, &block); end
+  def log(action, *args); end
+  def password(message = nil, mask = nil); end
+  def progress(arr, options = nil); end
+  def replace_tokens(str, hash); end
+  def say_error(*args); end
+  def say_ok(*args); end
+  def say_warning(*args); end
+  def self.applescript(script); end
+  def self.ask_editor(input = nil, preferred_editor = nil); end
+  def self.available_editor(preferred = nil); end
+  def self.choose(message = nil, *choices, &block); end
+  def self.color(*args); end
+  def self.converse(prompt, responses = nil); end
+  def self.enable_paging; end
+  def self.io(input = nil, output = nil, &block); end
+  def self.log(action, *args); end
+  def self.password(message = nil, mask = nil); end
+  def self.progress(arr, options = nil); end
+  def self.replace_tokens(str, hash); end
+  def self.say_error(*args); end
+  def self.say_ok(*args); end
+  def self.say_warning(*args); end
+  def self.speak(message, voice = nil, rate = nil); end
+  def speak(message, voice = nil, rate = nil); end
+end
+module Commander::UI::AskForClass
+  def ask_for_array(prompt); end
+  def ask_for_file(prompt); end
+  def ask_for_float(prompt); end
+  def ask_for_integer(prompt); end
+  def ask_for_pathname(prompt); end
+  def ask_for_regexp(prompt); end
+  def ask_for_string(prompt); end
+  def ask_for_symbol(prompt); end
+  def method_missing(method_name, *arguments, &block); end
+  def respond_to_missing?(method_name, include_private = nil); end
+end
+class Commander::UI::ProgressBar
+  def completed?; end
+  def erase_line; end
+  def finished?; end
+  def generate_tokens; end
+  def increment(tokens = nil); end
+  def initialize(total, options = nil); end
+  def percent_complete; end
+  def progress_bar; end
+  def show; end
+  def steps_remaining; end
+  def time_elapsed; end
+  def time_remaining; end
+end
+class Array
+  def self.parse(string); end
+end
+class Object < BasicObject
+  def get_binding; end
+end
+class Commander::Runner
+  def active_command; end
+  def add_command(command); end
+  def alias?(name); end
+  def alias_command(alias_name, name, *args); end
+  def always_trace!; end
+  def args_without_command_name; end
+  def command(name, &block); end
+  def command_exists?(name); end
+  def command_name_from_args; end
+  def commands; end
+  def create_default_commands; end
+  def default_command(name); end
+  def expand_optionally_negative_switches(switches); end
+  def global_option(*args, &block); end
+  def global_option_proc(switches, &block); end
+  def help_formatter; end
+  def help_formatter_alias_defaults; end
+  def help_formatter_aliases; end
+  def initialize(args = nil); end
+  def longest_valid_command_name_from(args); end
+  def never_trace!; end
+  def options; end
+  def parse_global_options; end
+  def program(key, *args, &block); end
+  def program_defaults; end
+  def remove_global_options(options, args); end
+  def require_program(*keys); end
+  def require_valid_command(command = nil); end
+  def run!; end
+  def run_active_command; end
+  def say(*args); end
+  def self.instance; end
+  def self.separate_switches_from_description(*args); end
+  def self.switch_to_sym(switch); end
+  def valid_command_names_from(*args); end
+  def version; end
+end
+class Commander::Runner::CommandError < StandardError
+end
+class Commander::Runner::InvalidCommandError < Commander::Runner::CommandError
+end
+class Commander::Command
+  def action(*args, &block); end
+  def call(args = nil); end
+  def description; end
+  def description=(arg0); end
+  def example(description, command); end
+  def examples; end
+  def examples=(arg0); end
+  def global_options; end
+  def initialize(name); end
+  def inspect; end
+  def name; end
+  def name=(arg0); end
+  def option(*args, &block); end
+  def option_proc(switches); end
+  def options; end
+  def options=(arg0); end
+  def parse_options_and_call_procs(*args); end
+  def proxy_option_struct; end
+  def proxy_options; end
+  def proxy_options=(arg0); end
+  def run(*args); end
+  def summary; end
+  def summary=(arg0); end
+  def syntax; end
+  def syntax=(arg0); end
+  def when_called(*args, &block); end
+end
+class Commander::Command::Options
+  def __hash__; end
+  def default(defaults = nil); end
+  def initialize; end
+  def inspect; end
+  def method_missing(meth, *args); end
+  include Blank
+end
+module Commander::HelpFormatter
+  def indent(amount, text); end
+  def self.indent(amount, text); end
+end
+class Commander::HelpFormatter::Context
+  def decorate_binding(_bind); end
+  def get_binding; end
+  def initialize(target); end
+end
+class Commander::HelpFormatter::ProgramContext < Commander::HelpFormatter::Context
+  def decorate_binding(bind); end
+  def max_aliases_length(bind); end
+  def max_command_length(bind); end
+  def max_key_length(hash, default = nil); end
+end
+module Commander::Platform
+  def self.jruby?; end
+end
+module Commander::Delegates
+  def add_command(*args, &block); end
+  def alias_command(*args, &block); end
+  def always_trace!(*args, &block); end
+  def command(*args, &block); end
+  def default_command(*args, &block); end
+  def defined_commands(*args, &block); end
+  def global_option(*args, &block); end
+  def never_trace!(*args, &block); end
+  def program(*args, &block); end
+  def run!(*args, &block); end
+end
+module Commander::Methods
+  include Commander::Delegates
+  include Commander::UI
+  include Commander::UI::AskForClass
+end
diff --git a/sorbet/rbi/gems/ffi.rbi b/sorbet/rbi/gems/ffi.rbi
new file mode 100644
index 0000000..00ce137
--- /dev/null
+++ b/sorbet/rbi/gems/ffi.rbi
@@ -0,0 +1,560 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/ffi/all/ffi.rbi
+#
+# ffi-1.15.4
+
+class FFI::Type
+  def alignment; end
+  def initialize(arg0); end
+  def inspect; end
+  def size; end
+end
+class FFI::Type::Builtin < FFI::Type
+  def inspect; end
+end
+class FFI::ArrayType < FFI::Type
+  def elem_type; end
+  def initialize(arg0, arg1); end
+  def length; end
+end
+module FFI::LastError
+  def error; end
+  def error=(arg0); end
+  def self.error; end
+  def self.error=(arg0); end
+end
+class FFI::AbstractMemory
+  def [](arg0); end
+  def __copy_from__(arg0, arg1); end
+  def clear; end
+  def get(arg0, arg1); end
+  def get_array_of_char(arg0, arg1); end
+  def get_array_of_double(arg0, arg1); end
+  def get_array_of_float(arg0, arg1); end
+  def get_array_of_float32(arg0, arg1); end
+  def get_array_of_float64(arg0, arg1); end
+  def get_array_of_int(arg0, arg1); end
+  def get_array_of_int16(arg0, arg1); end
+  def get_array_of_int32(arg0, arg1); end
+  def get_array_of_int64(arg0, arg1); end
+  def get_array_of_int8(arg0, arg1); end
+  def get_array_of_long(arg0, arg1); end
+  def get_array_of_long_long(arg0, arg1); end
+  def get_array_of_pointer(arg0, arg1); end
+  def get_array_of_short(arg0, arg1); end
+  def get_array_of_string(*arg0); end
+  def get_array_of_uchar(arg0, arg1); end
+  def get_array_of_uint(arg0, arg1); end
+  def get_array_of_uint16(arg0, arg1); end
+  def get_array_of_uint32(arg0, arg1); end
+  def get_array_of_uint64(arg0, arg1); end
+  def get_array_of_uint8(arg0, arg1); end
+  def get_array_of_ulong(arg0, arg1); end
+  def get_array_of_ulong_long(arg0, arg1); end
+  def get_array_of_ushort(arg0, arg1); end
+  def get_bytes(arg0, arg1); end
+  def get_char(arg0); end
+  def get_double(arg0); end
+  def get_float(arg0); end
+  def get_float32(arg0); end
+  def get_float64(arg0); end
+  def get_int(arg0); end
+  def get_int16(arg0); end
+  def get_int32(arg0); end
+  def get_int64(arg0); end
+  def get_int8(arg0); end
+  def get_long(arg0); end
+  def get_long_long(arg0); end
+  def get_pointer(arg0); end
+  def get_short(arg0); end
+  def get_string(*arg0); end
+  def get_uchar(arg0); end
+  def get_uint(arg0); end
+  def get_uint16(arg0); end
+  def get_uint32(arg0); end
+  def get_uint64(arg0); end
+  def get_uint8(arg0); end
+  def get_ulong(arg0); end
+  def get_ulong_long(arg0); end
+  def get_ushort(arg0); end
+  def put(arg0, arg1, arg2); end
+  def put_array_of_char(arg0, arg1); end
+  def put_array_of_double(arg0, arg1); end
+  def put_array_of_float(arg0, arg1); end
+  def put_array_of_float32(arg0, arg1); end
+  def put_array_of_float64(arg0, arg1); end
+  def put_array_of_int(arg0, arg1); end
+  def put_array_of_int16(arg0, arg1); end
+  def put_array_of_int32(arg0, arg1); end
+  def put_array_of_int64(arg0, arg1); end
+  def put_array_of_int8(arg0, arg1); end
+  def put_array_of_long(arg0, arg1); end
+  def put_array_of_long_long(arg0, arg1); end
+  def put_array_of_pointer(arg0, arg1); end
+  def put_array_of_short(arg0, arg1); end
+  def put_array_of_uchar(arg0, arg1); end
+  def put_array_of_uint(arg0, arg1); end
+  def put_array_of_uint16(arg0, arg1); end
+  def put_array_of_uint32(arg0, arg1); end
+  def put_array_of_uint64(arg0, arg1); end
+  def put_array_of_uint8(arg0, arg1); end
+  def put_array_of_ulong(arg0, arg1); end
+  def put_array_of_ulong_long(arg0, arg1); end
+  def put_array_of_ushort(arg0, arg1); end
+  def put_bytes(*arg0); end
+  def put_char(arg0, arg1); end
+  def put_double(arg0, arg1); end
+  def put_float(arg0, arg1); end
+  def put_float32(arg0, arg1); end
+  def put_float64(arg0, arg1); end
+  def put_int(arg0, arg1); end
+  def put_int16(arg0, arg1); end
+  def put_int32(arg0, arg1); end
+  def put_int64(arg0, arg1); end
+  def put_int8(arg0, arg1); end
+  def put_long(arg0, arg1); end
+  def put_long_long(arg0, arg1); end
+  def put_pointer(arg0, arg1); end
+  def put_short(arg0, arg1); end
+  def put_string(arg0, arg1); end
+  def put_uchar(arg0, arg1); end
+  def put_uint(arg0, arg1); end
+  def put_uint16(arg0, arg1); end
+  def put_uint32(arg0, arg1); end
+  def put_uint64(arg0, arg1); end
+  def put_uint8(arg0, arg1); end
+  def put_ulong(arg0, arg1); end
+  def put_ulong_long(arg0, arg1); end
+  def put_ushort(arg0, arg1); end
+  def read_array_of_char(arg0); end
+  def read_array_of_double(arg0); end
+  def read_array_of_float(arg0); end
+  def read_array_of_int(arg0); end
+  def read_array_of_int16(arg0); end
+  def read_array_of_int32(arg0); end
+  def read_array_of_int64(arg0); end
+  def read_array_of_int8(arg0); end
+  def read_array_of_long(arg0); end
+  def read_array_of_long_long(arg0); end
+  def read_array_of_pointer(arg0); end
+  def read_array_of_short(arg0); end
+  def read_array_of_uchar(arg0); end
+  def read_array_of_uint(arg0); end
+  def read_array_of_uint16(arg0); end
+  def read_array_of_uint32(arg0); end
+  def read_array_of_uint64(arg0); end
+  def read_array_of_uint8(arg0); end
+  def read_array_of_ulong(arg0); end
+  def read_array_of_ulong_long(arg0); end
+  def read_array_of_ushort(arg0); end
+  def read_bytes(arg0); end
+  def read_char; end
+  def read_double; end
+  def read_float; end
+  def read_int16; end
+  def read_int32; end
+  def read_int64; end
+  def read_int8; end
+  def read_int; end
+  def read_long; end
+  def read_long_long; end
+  def read_pointer; end
+  def read_short; end
+  def read_uchar; end
+  def read_uint16; end
+  def read_uint32; end
+  def read_uint64; end
+  def read_uint8; end
+  def read_uint; end
+  def read_ulong; end
+  def read_ulong_long; end
+  def read_ushort; end
+  def size; end
+  def size_limit?; end
+  def total; end
+  def type_size; end
+  def write_array_of_char(arg0); end
+  def write_array_of_double(arg0); end
+  def write_array_of_float(arg0); end
+  def write_array_of_int(arg0); end
+  def write_array_of_int16(arg0); end
+  def write_array_of_int32(arg0); end
+  def write_array_of_int64(arg0); end
+  def write_array_of_int8(arg0); end
+  def write_array_of_long(arg0); end
+  def write_array_of_long_long(arg0); end
+  def write_array_of_pointer(arg0); end
+  def write_array_of_short(arg0); end
+  def write_array_of_uchar(arg0); end
+  def write_array_of_uint(arg0); end
+  def write_array_of_uint16(arg0); end
+  def write_array_of_uint32(arg0); end
+  def write_array_of_uint64(arg0); end
+  def write_array_of_uint8(arg0); end
+  def write_array_of_ulong(arg0); end
+  def write_array_of_ulong_long(arg0); end
+  def write_array_of_ushort(arg0); end
+  def write_bytes(*arg0); end
+  def write_char(arg0); end
+  def write_double(arg0); end
+  def write_float(arg0); end
+  def write_int(arg0); end
+  def write_int16(arg0); end
+  def write_int32(arg0); end
+  def write_int64(arg0); end
+  def write_int8(arg0); end
+  def write_long(arg0); end
+  def write_long_long(arg0); end
+  def write_pointer(arg0); end
+  def write_short(arg0); end
+  def write_uchar(arg0); end
+  def write_uint(arg0); end
+  def write_uint16(arg0); end
+  def write_uint32(arg0); end
+  def write_uint64(arg0); end
+  def write_uint8(arg0); end
+  def write_ulong(arg0); end
+  def write_ulong_long(arg0); end
+  def write_ushort(arg0); end
+end
+class FFI::Pointer < FFI::AbstractMemory
+  def +(arg0); end
+  def ==(arg0); end
+  def address; end
+  def autorelease=(arg0); end
+  def autorelease?; end
+  def free; end
+  def initialize(*arg0); end
+  def initialize_copy(arg0); end
+  def inspect; end
+  def null?; end
+  def order(*arg0); end
+  def read(type); end
+  def read_array_of_type(type, reader, length); end
+  def read_string(len = nil); end
+  def read_string_length(len); end
+  def read_string_to_null; end
+  def self.size; end
+  def slice(arg0, arg1); end
+  def to_i; end
+  def to_ptr; end
+  def to_s; end
+  def type_size; end
+  def write(type, value); end
+  def write_array_of_type(type, writer, ary); end
+  def write_string(str, len = nil); end
+  def write_string_length(str, len); end
+end
+class FFI::FunctionType < FFI::Type
+  def initialize(*arg0); end
+  def param_types; end
+  def result_type; end
+end
+class FFI::Function < FFI::Pointer
+  def attach(arg0, arg1); end
+  def autorelease; end
+  def autorelease=(arg0); end
+  def autorelease?; end
+  def call(*arg0); end
+  def free; end
+  def initialize(*arg0); end
+  def initialize_copy(arg0); end
+end
+class FFI::MemoryPointer < FFI::Pointer
+  def initialize(*arg0); end
+  def self.from_string(arg0); end
+end
+class FFI::Buffer < FFI::AbstractMemory
+  def +(arg0); end
+  def initialize(*arg0); end
+  def initialize_copy(arg0); end
+  def inspect; end
+  def length; end
+  def order(*arg0); end
+  def self.alloc_in(*arg0); end
+  def self.alloc_inout(*arg0); end
+  def self.alloc_out(*arg0); end
+  def self.new_in(*arg0); end
+  def self.new_inout(*arg0); end
+  def self.new_out(*arg0); end
+  def slice(arg0, arg1); end
+end
+class FFI::StructByValue < FFI::Type
+  def initialize(arg0); end
+  def layout; end
+  def struct_class; end
+end
+class FFI::StructLayout::Field
+  def alignment; end
+  def get(arg0); end
+  def initialize(*arg0); end
+  def name; end
+  def offset; end
+  def put(arg0, arg1); end
+  def size; end
+  def type; end
+end
+class FFI::StructLayout::Function < FFI::StructLayout::Field
+  def get(arg0); end
+  def put(arg0, arg1); end
+end
+class FFI::StructLayout::Array < FFI::StructLayout::Field
+  def get(arg0); end
+  def put(arg0, arg1); end
+end
+class FFI::StructLayout < FFI::Type
+  def [](arg0); end
+  def __union!; end
+  def fields; end
+  def initialize(arg0, arg1, arg2); end
+  def members; end
+  def offset_of(field_name); end
+  def offsets; end
+  def to_a; end
+end
+class FFI::Struct
+  def [](arg0); end
+  def []=(arg0, arg1); end
+  def align; end
+  def alignment; end
+  def clear; end
+  def initialize(*arg0); end
+  def initialize_copy(arg0); end
+  def layout; end
+  def layout=(arg0); end
+  def members; end
+  def null?; end
+  def offset_of(name); end
+  def offsets; end
+  def order(*arg0); end
+  def pointer; end
+  def pointer=(arg0); end
+  def self.align(alignment = nil); end
+  def self.aligned(alignment = nil); end
+  def self.alignment; end
+  def self.alloc_in(*arg0); end
+  def self.alloc_inout(*arg0); end
+  def self.alloc_out(*arg0); end
+  def self.array_layout(builder, spec); end
+  def self.auto_ptr; end
+  def self.by_ref(flags = nil); end
+  def self.by_value; end
+  def self.callback(params, ret); end
+  def self.enclosing_module; end
+  def self.find_field_type(type, mod = nil); end
+  def self.find_type(type, mod = nil); end
+  def self.hash_layout(builder, spec); end
+  def self.in; end
+  def self.layout(*spec); end
+  def self.members; end
+  def self.new_in(*arg0); end
+  def self.new_inout(*arg0); end
+  def self.new_out(*arg0); end
+  def self.offset_of(name); end
+  def self.offsets; end
+  def self.out; end
+  def self.pack(packed = nil); end
+  def self.packed(packed = nil); end
+  def self.ptr(flags = nil); end
+  def self.size; end
+  def self.size=(size); end
+  def self.val; end
+  def size; end
+  def to_ptr; end
+  def values; end
+end
+class FFI::Struct::InlineArray
+  def [](arg0); end
+  def []=(arg0, arg1); end
+  def each; end
+  def initialize(arg0, arg1); end
+  def size; end
+  def to_a; end
+  def to_ptr; end
+end
+class FFI::StructLayout::CharArray < FFI::Struct::InlineArray
+  def to_s; end
+  def to_str; end
+end
+class FFI::DynamicLibrary
+  def find_function(arg0); end
+  def find_symbol(arg0); end
+  def find_variable(arg0); end
+  def initialize(arg0, arg1); end
+  def last_error; end
+  def name; end
+  def self.last_error; end
+  def self.open(arg0, arg1); end
+end
+class FFI::DynamicLibrary::Symbol < FFI::Pointer
+  def initialize_copy(arg0); end
+  def inspect; end
+end
+class FFI::VariadicInvoker
+  def attach(mod, mname); end
+  def call(*args, &block); end
+  def initialize(arg0, arg1, arg2, arg3); end
+  def invoke(arg0, arg1); end
+end
+class FFI::Type::Mapped < FFI::Type
+  def from_native(*arg0); end
+  def initialize(arg0); end
+  def native_type; end
+  def to_native(*arg0); end
+  def type; end
+end
+module FFI
+  def self.add_typedef(old, add); end
+  def self.errno; end
+  def self.errno=(error); end
+  def self.find_type(name, type_map = nil); end
+  def self.map_library_name(lib); end
+  def self.type_size(type); end
+  def self.typedef(old, add); end
+end
+class FFI::PlatformError < LoadError
+end
+module FFI::Platform
+  def self.bsd?; end
+  def self.is_os(os); end
+  def self.mac?; end
+  def self.solaris?; end
+  def self.unix?; end
+  def self.windows?; end
+end
+module FFI::DataConverter
+  def from_native(value, ctx); end
+  def native_type(type = nil); end
+  def to_native(value, ctx); end
+end
+class FFI::StrPtrConverter
+  def self.from_native(val, ctx); end
+  extend FFI::DataConverter
+end
+class FFI::NotFoundError < LoadError
+  def initialize(function, *libraries); end
+end
+module FFI::Library
+  def attach_function(name, func, args, returns = nil, options = nil); end
+  def attach_variable(mname, a1, a2 = nil); end
+  def bitmask(*args); end
+  def callback(*args); end
+  def enum(*args); end
+  def enum_type(name); end
+  def enum_value(symbol); end
+  def ffi_convention(convention = nil); end
+  def ffi_lib(*names); end
+  def ffi_lib_flags(*flags); end
+  def ffi_libraries; end
+  def find_type(t); end
+  def function_names(name, arg_types); end
+  def generic_enum(klass, *args); end
+  def self.extended(mod); end
+  def typedef(old, add, info = nil); end
+end
+class FFI::StructLayout::Enum < FFI::StructLayout::Field
+  def get(ptr); end
+  def put(ptr, value); end
+end
+class FFI::StructLayout::InnerStruct < FFI::StructLayout::Field
+  def get(ptr); end
+  def put(ptr, value); end
+end
+class FFI::StructLayout::Mapped < FFI::StructLayout::Field
+  def get(ptr); end
+  def initialize(name, offset, type, orig_field); end
+  def put(ptr, value); end
+end
+class FFI::StructLayoutBuilder
+  def add(name, type, offset = nil); end
+  def add_array(name, type, count, offset = nil); end
+  def add_field(name, type, offset = nil); end
+  def add_struct(name, type, offset = nil); end
+  def align(offset, align); end
+  def alignment; end
+  def alignment=(align); end
+  def build; end
+  def field_for_type(name, offset, type); end
+  def initialize; end
+  def packed=(packed); end
+  def size; end
+  def size=(size); end
+  def union=(is_union); end
+  def union?; end
+end
+class FFI::StructByReference
+  def from_native(value, ctx); end
+  def initialize(struct_class); end
+  def native_type; end
+  def struct_class; end
+  def to_native(value, ctx); end
+  include FFI::DataConverter
+end
+class FFI::Struct::ManagedStructConverter < FFI::StructByReference
+  def from_native(ptr, ctx); end
+  def initialize(struct_class); end
+end
+class FFI::Union < FFI::Struct
+  def self.builder; end
+end
+class FFI::ManagedStruct < FFI::Struct
+  def initialize(pointer = nil); end
+end
+module FFI::IO
+  def self.for_fd(fd, mode = nil); end
+  def self.native_read(io, buf, len); end
+end
+class FFI::AutoPointer < FFI::Pointer
+  def autorelease=(autorelease); end
+  def autorelease?; end
+  def free; end
+  def initialize(ptr, proc = nil, &block); end
+  def self.from_native(val, ctx); end
+  def self.native_type; end
+  extend FFI::DataConverter
+end
+class FFI::AutoPointer::Releaser
+  def autorelease; end
+  def autorelease=(arg0); end
+  def call(*args); end
+  def free; end
+  def initialize(ptr, proc); end
+end
+class FFI::AutoPointer::DefaultReleaser < FFI::AutoPointer::Releaser
+  def release(ptr); end
+end
+class FFI::AutoPointer::CallableReleaser < FFI::AutoPointer::Releaser
+  def release(ptr); end
+end
+class FFI::Enums
+  def <<(enum); end
+  def __map_symbol(symbol); end
+  def find(query); end
+  def initialize; end
+end
+class FFI::Enum
+  def [](query); end
+  def find(query); end
+  def from_native(val, ctx); end
+  def initialize(*args); end
+  def native_type; end
+  def symbol_map; end
+  def symbols; end
+  def tag; end
+  def to_h; end
+  def to_hash; end
+  def to_native(val, ctx); end
+  include FFI::DataConverter
+end
+class FFI::Bitmask < FFI::Enum
+  def [](*query); end
+  def from_native(val, ctx); end
+  def initialize(*args); end
+  def to_native(query, ctx); end
+end
diff --git a/sorbet/rbi/gems/hashery.rbi b/sorbet/rbi/gems/hashery.rbi
new file mode 100644
index 0000000..76e92b7
--- /dev/null
+++ b/sorbet/rbi/gems/hashery.rbi
@@ -0,0 +1,301 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/hashery/all/hashery.rbi
+#
+# hashery-2.1.2
+
+class Hash
+  def rekey!(key_map = nil, &block); end
+  def rekey(key_map = nil, &block); end
+  def retrieve(key); end
+  def self.[](*arg0); end
+end
+module Hashery
+end
+class Hashery::CRUDHash < Hash
+  def <<(assoc); end
+  def [](key); end
+  def []=(key, value); end
+  def cast(hash); end
+  def cast_key(key); end
+  def default_proc(&block); end
+  def delete(key); end
+  def each; end
+  def each_pair; end
+  def fetch(key, *default); end
+  def has_key?(key); end
+  def include?(key); end
+  def key?(key); end
+  def key_proc(&block); end
+  def key_proc=(proc); end
+  def member?(key); end
+  def merge!(other); end
+  def merge(other); end
+  def read(key); end
+  def replace(other); end
+  def retrieve(key); end
+  def self.[](*hash); end
+  def self.auto(*args, &block); end
+  def store(key, value); end
+  def to_h; end
+  def to_hash; end
+  def update(other); end
+  def values_at(*keys); end
+end
+class Hashery::CastingHash < Hashery::CRUDHash
+  def cast(hash); end
+  def cast_pair(key, value); end
+  def cast_proc(&proc); end
+  def cast_proc=(proc); end
+  def initialize(default = nil, &cast_proc); end
+  def recast!; end
+  def replace(other); end
+  def self.[](hash); end
+  def store(key, value); end
+  def to_h; end
+  def to_hash; end
+end
+class Hashery::Dictionary
+  def <<(kv); end
+  def ==(hsh2); end
+  def [](key); end
+  def []=(k, i = nil, v = nil); end
+  def clear; end
+  def delete(key); end
+  def delete_if; end
+  def dup; end
+  def each; end
+  def each_key; end
+  def each_pair; end
+  def each_value; end
+  def empty?; end
+  def fetch(key, *a, &b); end
+  def first(x = nil); end
+  def has_key?(key); end
+  def hash_table; end
+  def initialize(*args, &blk); end
+  def insert(index, key, value); end
+  def inspect; end
+  def invert; end
+  def key?(key); end
+  def keys; end
+  def last(x = nil); end
+  def length; end
+  def merge!(hsh2); end
+  def merge(hsh2); end
+  def order; end
+  def order_by(&block); end
+  def order_by_key; end
+  def order_by_value; end
+  def pop; end
+  def push(k, v); end
+  def reject!(&block); end
+  def reject(&block); end
+  def reorder; end
+  def replace(hsh2); end
+  def reverse!; end
+  def reverse; end
+  def select; end
+  def self.[](*args); end
+  def self.alpha(*args, &block); end
+  def self.alphabetic(*args, &block); end
+  def self.auto(*args); end
+  def self.new_by(*args, &blk); end
+  def shift; end
+  def size; end
+  def store(key, value); end
+  def to_a; end
+  def to_h; end
+  def to_hash; end
+  def to_s; end
+  def unshift(k, v); end
+  def update(hsh2); end
+  def values; end
+  include Enumerable
+end
+class Hashery::FuzzyHash
+  def ==(o); end
+  def [](key); end
+  def []=(key, value); end
+  def clear; end
+  def count; end
+  def delete_value(value); end
+  def each; end
+  def empty?; end
+  def fuzz_test; end
+  def fuzz_test=(arg0); end
+  def fuzzies; end
+  def fuzzies_reverse; end
+  def fuzzy_hash; end
+  def fuzzy_lookup(key); end
+  def hash; end
+  def hash_reverse; end
+  def initialize(init_hash = nil); end
+  def keys; end
+  def match_with_result(key); end
+  def replace(src, dest); end
+  def reset_fuzz_test!; end
+  def size; end
+  def values; end
+end
+class Hashery::IniHash
+  def [](key); end
+  def []=(key, value); end
+  def comment; end
+  def comment=(arg0); end
+  def inihash; end
+  def inihash=(arg0); end
+  def initialize(path, load = nil); end
+  def inspect; end
+  def method_missing(s, *a, &b); end
+  def restore; end
+  def save; end
+  def self.load(path, load = nil); end
+  def self.read_comment_from_file(path); end
+  def self.read_from_file(path); end
+  def self.text(inihash = nil); end
+  def self.to_s(inihash = nil); end
+  def self.write_to_file(path, inihash = nil, comment = nil); end
+  def to_h; end
+  def to_s; end
+  def update; end
+end
+class Hashery::LinkedList
+  def <<(v); end
+  def [](key); end
+  def []=(k, v); end
+  def delete(key); end
+  def each; end
+  def empty?; end
+  def first; end
+  def initialize; end
+  def last; end
+  def length; end
+  def node_delete(n); end
+  def node_join(a, b); end
+  def node_purge(n); end
+  def pop; end
+  def push(v); end
+  def queue; end
+  def shift; end
+  def size; end
+  def to_a; end
+  def unshift(v); end
+  include Enumerable
+end
+class Hashery::LinkedList::Node
+  def initialize(key = nil, value = nil, prev_node = nil, next_node = nil); end
+  def key; end
+  def key=(arg0); end
+  def next_node; end
+  def next_node=(arg0); end
+  def prev_node; end
+  def prev_node=(arg0); end
+  def value; end
+  def value=(arg0); end
+end
+class Hashery::LRUHash
+  def [](key); end
+  def []=(key, value); end
+  def assoc(key); end
+  def clear; end
+  def default; end
+  def default=(arg0); end
+  def default_proc; end
+  def default_proc=(arg0); end
+  def delete(key); end
+  def delete_if; end
+  def delete_oldest; end
+  def each; end
+  def each_key; end
+  def each_node; end
+  def each_pair; end
+  def each_value; end
+  def empty?; end
+  def fetch(key, &b); end
+  def front(node); end
+  def has_key?(key); end
+  def has_value?(value); end
+  def include?(key); end
+  def initialize(max_size, default_value = nil, &block); end
+  def inspect; end
+  def key(value); end
+  def key?(key); end
+  def keys; end
+  def max_size; end
+  def max_size=(limit); end
+  def member?(key); end
+  def normalize_max(n); end
+  def rassoc(value); end
+  def release_proc; end
+  def release_proc=(arg0); end
+  def remove_node(node); end
+  def size; end
+  def store(key, value); end
+  def to_s; end
+  def value?(value); end
+  def values; end
+  def values_at(*key_list); end
+  include Enumerable
+end
+class Hashery::LRUHash::Node < Struct
+  def insert_after(node); end
+  def key; end
+  def key=(_); end
+  def pred; end
+  def pred=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def succ; end
+  def succ=(_); end
+  def unlink; end
+  def value; end
+  def value=(_); end
+end
+class Hashery::KeyHash < Hashery::CRUDHash
+  def initialize(*default, &block); end
+end
+class Hashery::OpenHash < Hashery::CRUDHash
+  def close!(*methods); end
+  def initialize(default = nil, safe = nil, &block); end
+  def method_missing(s, *a, &b); end
+  def object_class; end
+  def omit!(*methods); end
+  def open!(*methods); end
+  def open?(method); end
+  def safe; end
+  def safe=(arg0); end
+  def store(key, value); end
+end
+class Hashery::OpenCascade < Hashery::OpenHash
+  def cast_value(entry); end
+  def initialize(*default); end
+  def method_missing(sym, *args, &blk); end
+  def respond_to?(sym, include_private = nil); end
+  def retrieve!(key); end
+  def retrieve(key); end
+end
+class Hashery::PropertyHash < Hashery::CRUDHash
+  def assert_key!(key); end
+  def initialize(properties = nil, &default_proc); end
+  def property(key, opts = nil); end
+  def self.properties; end
+  def self.property(key, opts = nil); end
+  def store!(key, value); end
+  def store(key, value); end
+end
+class Hashery::QueryHash < Hashery::CRUDHash
+  def initialize(*default, &default_proc); end
+  def method_missing(s, *a, &b); end
+  def respond_to?(name); end
+end
+class Hashery::StaticHash < Hashery::CRUDHash
+  def store(key, value); end
+end
diff --git a/sorbet/rbi/gems/highline.rbi b/sorbet/rbi/gems/highline.rbi
new file mode 100644
index 0000000..f7caec4
--- /dev/null
+++ b/sorbet/rbi/gems/highline.rbi
@@ -0,0 +1,577 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/highline/all/highline.rbi
+#
+# highline-2.0.3
+
+class HighLine
+  def actual_length(text); end
+  def agree(yes_or_no_question, character = nil); end
+  def ask(template_or_question, answer_type = nil, &details); end
+  def choose(*items, &details); end
+  def color(string, *colors); end
+  def color_code(*colors); end
+  def confirm(question); end
+  def default_use_color; end
+  def erase_current_line; end
+  def get_line(question); end
+  def get_line_raw_no_echo_mode(question); end
+  def get_response_character_mode(question); end
+  def get_response_getc_mode(question); end
+  def get_response_line_mode(question); end
+  def ignore_arrow_key; end
+  def indent(increase = nil, statement = nil, multiline = nil); end
+  def indent_level; end
+  def indent_level=(arg0); end
+  def indent_size; end
+  def indent_size=(arg0); end
+  def indentation; end
+  def initialize(input = nil, output = nil, wrap_at = nil, page_at = nil, indent_size = nil, indent_level = nil); end
+  def input; end
+  def key; end
+  def key=(arg0); end
+  def last_answer(answers); end
+  def line_overflow_for_question?(line, question); end
+  def list(items, mode = nil, option = nil); end
+  def multi_indent; end
+  def multi_indent=(arg0); end
+  def new_scope; end
+  def newline; end
+  def output; end
+  def output_cols; end
+  def output_erase_char; end
+  def output_rows; end
+  def page_at; end
+  def page_at=(setting); end
+  def puts(*args); end
+  def render_statement(statement); end
+  def reset_use_color; end
+  def say(statement); end
+  def say_last_char_or_echo_char(line, question); end
+  def say_new_line_or_overwrite(question); end
+  def self.String(s); end
+  def self.Style(*args); end
+  def self.agree(*args, &block); end
+  def self.ask(*args, &block); end
+  def self.choose(*args, &block); end
+  def self.color(*args, &block); end
+  def self.color_code(*args, &block); end
+  def self.color_scheme; end
+  def self.color_scheme=(arg0); end
+  def self.colorize_strings; end
+  def self.default_instance; end
+  def self.default_instance=(arg0); end
+  def self.find_or_create_style(arg); end
+  def self.find_or_create_style_list(*args); end
+  def self.reset; end
+  def self.reset_color_scheme; end
+  def self.reset_use_color(*args, &block); end
+  def self.say(*args, &block); end
+  def self.supports_rgb_color?; end
+  def self.track_eof=(*args, &block); end
+  def self.track_eof?(*args, &block); end
+  def self.uncolor(*args, &block); end
+  def self.use_color=(*args, &block); end
+  def self.use_color?(*args, &block); end
+  def self.using_color_scheme?; end
+  def shell_style_lambda(menu); end
+  def terminal; end
+  def track_eof; end
+  def track_eof=(arg0); end
+  def track_eof?; end
+  def uncolor(string); end
+  def unique_answers(list); end
+  def use_color; end
+  def use_color=(arg0); end
+  def use_color?; end
+  def wrap_at; end
+  def wrap_at=(setting); end
+  extend HighLine::BuiltinStyles::ClassMethods
+  extend SingleForwardable
+  include HighLine::BuiltinStyles
+  include HighLine::CustomErrors
+end
+class HighLine::Terminal
+  def character_mode; end
+  def get_character; end
+  def get_line(question, highline); end
+  def get_line_default(highline); end
+  def get_line_with_readline(question, highline); end
+  def initialize(input, output); end
+  def initialize_system_extensions; end
+  def input; end
+  def jruby?; end
+  def output; end
+  def raw_no_echo_mode; end
+  def raw_no_echo_mode_exec; end
+  def readline_read(question); end
+  def restore_mode; end
+  def restore_stty; end
+  def rubinius?; end
+  def run_preserving_stty; end
+  def save_stty; end
+  def self.get_terminal(input, output); end
+  def terminal_size; end
+  def windows?; end
+end
+module HighLine::CustomErrors
+end
+class HighLine::CustomErrors::ExplainableError < StandardError
+  def explanation_key; end
+end
+class HighLine::CustomErrors::QuestionError < HighLine::CustomErrors::ExplainableError
+  def explanation_key; end
+end
+class HighLine::CustomErrors::NotValidQuestionError < HighLine::CustomErrors::ExplainableError
+  def explanation_key; end
+end
+class HighLine::CustomErrors::NotInRangeQuestionError < HighLine::CustomErrors::ExplainableError
+  def explanation_key; end
+end
+class HighLine::CustomErrors::NoConfirmationQuestionError < HighLine::CustomErrors::ExplainableError
+  def explanation_key; end
+end
+class HighLine::CustomErrors::NoAutoCompleteMatch < HighLine::CustomErrors::ExplainableError
+  def explanation_key; end
+end
+class HighLine::Question
+  def above; end
+  def above=(arg0); end
+  def answer; end
+  def answer=(arg0); end
+  def answer_or_default(answer_string); end
+  def answer_type; end
+  def answer_type=(arg0); end
+  def append_default; end
+  def ask_on_error_msg; end
+  def below; end
+  def below=(arg0); end
+  def build_responses(message_source = nil); end
+  def build_responses_new_hash(message_source); end
+  def case; end
+  def case=(arg0); end
+  def change_case(answer_string); end
+  def character; end
+  def character=(arg0); end
+  def check_range; end
+  def choice_error_str(message_source); end
+  def choices_complete(answer_string); end
+  def completion; end
+  def completion=(arg0); end
+  def confirm; end
+  def confirm=(arg0); end
+  def confirm_question(highline); end
+  def convert; end
+  def default; end
+  def default=(arg0); end
+  def default_responses_hash; end
+  def directory; end
+  def directory=(arg0); end
+  def echo; end
+  def echo=(arg0); end
+  def expected_range; end
+  def final_response(error); end
+  def final_responses; end
+  def first_answer; end
+  def first_answer=(arg0); end
+  def first_answer?; end
+  def format_answer(answer_string); end
+  def gather; end
+  def gather=(arg0); end
+  def get_echo_for_response(response); end
+  def get_response(highline); end
+  def get_response_or_default(highline); end
+  def glob; end
+  def glob=(arg0); end
+  def in; end
+  def in=(arg0); end
+  def in_range?; end
+  def initialize(template, answer_type); end
+  def limit; end
+  def limit=(arg0); end
+  def overwrite; end
+  def overwrite=(arg0); end
+  def readline; end
+  def readline=(arg0); end
+  def remove_whitespace(answer_string); end
+  def responses; end
+  def selection; end
+  def self.build(template_or_question, answer_type = nil, &details); end
+  def show_question(highline); end
+  def template; end
+  def template=(arg0); end
+  def to_s; end
+  def valid_answer?; end
+  def validate; end
+  def validate=(arg0); end
+  def verify_match; end
+  def verify_match=(arg0); end
+  def whitespace; end
+  def whitespace=(arg0); end
+  include HighLine::CustomErrors
+end
+class HighLine::Question::AnswerConverter
+  def answer(*args, &block); end
+  def answer=(*args, &block); end
+  def answer_type(*args, &block); end
+  def check_range(*args, &block); end
+  def choices_complete(*args, &block); end
+  def convert; end
+  def convert_by_answer_type; end
+  def directory(*args, &block); end
+  def initialize(question); end
+  def to_array; end
+  def to_file; end
+  def to_float; end
+  def to_integer; end
+  def to_pathname; end
+  def to_proc; end
+  def to_regexp; end
+  def to_string; end
+  def to_symbol; end
+  extend Forwardable
+end
+class HighLine::QuestionAsker
+  def answer_matches_regex(answer); end
+  def ask_once; end
+  def explain_error(explanation_key); end
+  def gather_answers; end
+  def gather_answers_based_on_type; end
+  def gather_hash; end
+  def gather_integer; end
+  def gather_regexp; end
+  def gather_with_array; end
+  def initialize(question, highline); end
+  def question; end
+  include HighLine::CustomErrors
+end
+class HighLine::Menu < HighLine::Question
+  def add_item(item); end
+  def all_items; end
+  def build_item(*args); end
+  def choice(name, help = nil, text = nil, &action); end
+  def choices(*names, &action); end
+  def decorate_index(index); end
+  def decorate_item(text, ix); end
+  def find_item_from_selection(items, selection); end
+  def flow; end
+  def flow=(arg0); end
+  def gather_selected(highline_context, selections, details = nil); end
+  def get_item_by_letter(items, selection); end
+  def get_item_by_number(items, selection); end
+  def header; end
+  def header=(arg0); end
+  def help(topic, help); end
+  def hidden(name, help = nil, &action); end
+  def index; end
+  def index=(style); end
+  def index_color; end
+  def index_color=(arg0); end
+  def index_suffix; end
+  def index_suffix=(arg0); end
+  def init_help; end
+  def initialize; end
+  def layout; end
+  def layout=(new_layout); end
+  def list_option; end
+  def list_option=(arg0); end
+  def map_items_by_index; end
+  def map_items_by_name; end
+  def mark_for_decoration(text, ix); end
+  def nil_on_handled; end
+  def nil_on_handled=(arg0); end
+  def options; end
+  def parse_list; end
+  def prompt; end
+  def prompt=(arg0); end
+  def select(highline_context, selection, details = nil); end
+  def select_by; end
+  def select_by=(arg0); end
+  def self.index_color; end
+  def self.index_color=(arg0); end
+  def shell; end
+  def shell=(arg0); end
+  def show_default_if_any; end
+  def to_ary; end
+  def to_s; end
+  def update_responses; end
+  def value_for_array_selections(items, selections, details); end
+  def value_for_hash_selections(items, selections, details); end
+  def value_for_selected_item(item, details); end
+end
+class HighLine::Menu::Item
+  def action; end
+  def help; end
+  def initialize(name, attributes); end
+  def item_help; end
+  def name; end
+  def text; end
+end
+class HighLine::ColorScheme
+  def [](color_tag); end
+  def []=(color_tag, constants); end
+  def definition(color_tag); end
+  def include?(color_tag); end
+  def initialize(h = nil); end
+  def keys; end
+  def load_from_hash(h); end
+  def to_constant(v); end
+  def to_hash; end
+  def to_symbol(t); end
+end
+class HighLine::SampleColorScheme < HighLine::ColorScheme
+  def initialize(_h = nil); end
+end
+class HighLine::Style
+  def blue; end
+  def bright; end
+  def builtin; end
+  def builtin=(arg0); end
+  def code; end
+  def color(string); end
+  def create_bright_variant(variant_name); end
+  def dup; end
+  def find_style(name); end
+  def green; end
+  def initialize(defn = nil); end
+  def light; end
+  def list; end
+  def name; end
+  def on; end
+  def red; end
+  def rgb; end
+  def rgb=(arg0); end
+  def self.ansi_rgb_to_hex(ansi_number); end
+  def self.clear_index; end
+  def self.code_index; end
+  def self.index(style); end
+  def self.list; end
+  def self.rgb(*colors); end
+  def self.rgb_hex(*colors); end
+  def self.rgb_number(*parts); end
+  def self.rgb_parts(hex); end
+  def self.uncolor(string); end
+  def to_hash; end
+  def variant(new_name, options = nil); end
+end
+module HighLine::Wrapper
+  def self.actual_length(string_with_escapes); end
+  def self.wrap(text, wrap_at); end
+end
+class HighLine::Paginator
+  def continue_paging?; end
+  def highline; end
+  def initialize(highline); end
+  def page_print(text); end
+end
+class HighLine::TemplateRenderer
+  def answer(*args, &block); end
+  def answer_type(*args, &block); end
+  def color(*args, &block); end
+  def header(*args, &block); end
+  def highline; end
+  def initialize(template, source, highline); end
+  def key(*args, &block); end
+  def list(*args, &block); end
+  def menu; end
+  def method_missing(method, *args); end
+  def prompt(*args, &block); end
+  def render; end
+  def self.const_missing(name); end
+  def source; end
+  def template; end
+  extend Forwardable
+end
+class HighLine::Statement
+  def format_statement; end
+  def highline; end
+  def initialize(source, highline); end
+  def render_template; end
+  def self.const_missing(constant); end
+  def source; end
+  def statement; end
+  def stringfy(template_string); end
+  def template; end
+  def template_string; end
+  def to_s; end
+end
+class HighLine::List
+  def build; end
+  def col_down; end
+  def col_down_mode; end
+  def cols; end
+  def cols=(cols); end
+  def initialize(items, options = nil); end
+  def items; end
+  def items_sliced_by_cols; end
+  def items_sliced_by_rows; end
+  def list; end
+  def row_count; end
+  def row_join_str_size; end
+  def row_join_string; end
+  def row_join_string=(arg0); end
+  def slice_by_cols; end
+  def slice_by_rows; end
+  def stringfy(row); end
+  def to_a; end
+  def to_s; end
+  def transpose; end
+  def transpose_mode; end
+end
+class HighLine::ListRenderer
+  def actual_length(text); end
+  def actual_lengths_for(line); end
+  def col_count; end
+  def col_count_calculate; end
+  def get_col_widths(lines); end
+  def get_row_widths(lines); end
+  def get_segment_widths(lines); end
+  def highline; end
+  def initialize(items, mode = nil, option = nil, highline); end
+  def inside_line_size_limit?(widths); end
+  def items; end
+  def items_max_length; end
+  def line_size_limit; end
+  def list_columns_across_mode; end
+  def list_columns_down_mode; end
+  def list_default_mode; end
+  def list_inline_mode; end
+  def list_uneven_columns_down_mode; end
+  def list_uneven_columns_mode(list = nil); end
+  def max_length(items); end
+  def mode; end
+  def option; end
+  def pad_char; end
+  def pad_uneven_rows(list, widths); end
+  def render; end
+  def render_list_items(items); end
+  def right_pad_field(field, width); end
+  def right_pad_row(row, widths); end
+  def right_padded_items; end
+  def row_count; end
+  def row_join_str_size; end
+  def row_join_string; end
+  def row_join_string=(arg0); end
+  def row_to_s(row); end
+  def stringfy_list(list); end
+  def transpose(lines); end
+end
+module HighLine::BuiltinStyles
+  def self.included(base); end
+end
+module HighLine::BuiltinStyles::ClassMethods
+  def const_missing(name); end
+end
+class HighLine::Terminal::IOConsole < HighLine::Terminal
+  def get_character; end
+  def raw_no_echo_mode; end
+  def restore_mode; end
+  def terminal_size; end
+end
+module HighLine::StringExtensions
+  def self.define_builtin_style_methods(base); end
+  def self.define_style_support_methods(base); end
+  def self.included(base); end
+end
+class HighLine::String < String
+  def black; end
+  def blink; end
+  def blue; end
+  def bold; end
+  def bright_black; end
+  def bright_blue; end
+  def bright_cyan; end
+  def bright_gray; end
+  def bright_green; end
+  def bright_grey; end
+  def bright_magenta; end
+  def bright_none; end
+  def bright_red; end
+  def bright_white; end
+  def bright_yellow; end
+  def clear; end
+  def color(*args); end
+  def concealed; end
+  def cyan; end
+  def dark; end
+  def foreground(*args); end
+  def gray; end
+  def green; end
+  def grey; end
+  def light_black; end
+  def light_blue; end
+  def light_cyan; end
+  def light_gray; end
+  def light_green; end
+  def light_grey; end
+  def light_magenta; end
+  def light_none; end
+  def light_red; end
+  def light_white; end
+  def light_yellow; end
+  def magenta; end
+  def method_missing(method, *_args); end
+  def none; end
+  def on(arg); end
+  def on_black; end
+  def on_blue; end
+  def on_bright_black; end
+  def on_bright_blue; end
+  def on_bright_cyan; end
+  def on_bright_gray; end
+  def on_bright_green; end
+  def on_bright_grey; end
+  def on_bright_magenta; end
+  def on_bright_none; end
+  def on_bright_red; end
+  def on_bright_white; end
+  def on_bright_yellow; end
+  def on_cyan; end
+  def on_gray; end
+  def on_green; end
+  def on_grey; end
+  def on_light_black; end
+  def on_light_blue; end
+  def on_light_cyan; end
+  def on_light_gray; end
+  def on_light_green; end
+  def on_light_grey; end
+  def on_light_magenta; end
+  def on_light_none; end
+  def on_light_red; end
+  def on_light_white; end
+  def on_light_yellow; end
+  def on_magenta; end
+  def on_none; end
+  def on_red; end
+  def on_rgb(*colors); end
+  def on_white; end
+  def on_yellow; end
+  def red; end
+  def reset; end
+  def respond_to_missing?(method_name, include_private = nil); end
+  def reverse; end
+  def rgb(*colors); end
+  def setup_color_code(*colors); end
+  def uncolor; end
+  def underline; end
+  def underscore; end
+  def white; end
+  def yellow; end
+  include HighLine::StringExtensions
+end
+module Kernel
+  def agree(*args, &block); end
+  def ask(*args, &block); end
+  def choose(*args, &block); end
+  def say(*args, &block); end
+  extend Forwardable
+end
+class Object < BasicObject
+  def or_ask(*args, &details); end
+end
diff --git a/sorbet/rbi/gems/method_source.rbi b/sorbet/rbi/gems/method_source.rbi
new file mode 100644
index 0000000..92cdecd
--- /dev/null
+++ b/sorbet/rbi/gems/method_source.rbi
@@ -0,0 +1,64 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/method_source/all/method_source.rbi
+#
+# method_source-1.0.0
+
+module MethodSource
+  def self.comment_helper(source_location, name = nil); end
+  def self.extract_code(source_location); end
+  def self.lines_for(file_name, name = nil); end
+  def self.source_helper(source_location, name = nil); end
+  def self.valid_expression?(str); end
+  extend MethodSource::CodeHelpers
+end
+module MethodSource::ReeSourceLocation
+  def source_location; end
+end
+module MethodSource::SourceLocation
+end
+module MethodSource::SourceLocation::MethodExtensions
+  def source_location; end
+  def trace_func(event, file, line, id, binding, classname); end
+end
+module MethodSource::SourceLocation::ProcExtensions
+  def source_location; end
+end
+module MethodSource::SourceLocation::UnboundMethodExtensions
+  def source_location; end
+end
+module MethodSource::CodeHelpers
+  def comment_describing(file, line_number); end
+  def complete_expression?(str); end
+  def expression_at(file, line_number, options = nil); end
+  def extract_first_expression(lines, consume = nil, &block); end
+  def extract_last_comment(lines); end
+end
+module MethodSource::CodeHelpers::IncompleteExpression
+  def self.===(ex); end
+  def self.rbx?; end
+end
+class MethodSource::SourceNotFoundError < StandardError
+end
+module MethodSource::MethodExtensions
+  def comment; end
+  def self.included(klass); end
+  def source; end
+end
+class Method
+  include MethodSource::MethodExtensions
+  include MethodSource::SourceLocation::MethodExtensions
+end
+class UnboundMethod
+  include MethodSource::MethodExtensions
+  include MethodSource::SourceLocation::UnboundMethodExtensions
+end
+class Proc
+  include MethodSource::MethodExtensions
+  include MethodSource::SourceLocation::ProcExtensions
+end
diff --git a/sorbet/rbi/gems/morecane.rbi b/sorbet/rbi/gems/morecane.rbi
new file mode 100644
index 0000000..00cc99e
--- /dev/null
+++ b/sorbet/rbi/gems/morecane.rbi
@@ -0,0 +1,55 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/morecane/all/morecane.rbi
+#
+# morecane-0.2.0
+
+module Morecane
+end
+class Anonymous_Struct_8 < Struct
+  def opts; end
+  def opts=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class Morecane::EncodingCheck < Anonymous_Struct_8
+  def file_names; end
+  def find_violations(file_name); end
+  def self.options; end
+  def violations; end
+end
+class Anonymous_Struct_9 < Struct
+  def opts; end
+  def opts=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class Morecane::MustMatchCheck < Anonymous_Struct_9
+  def file_names; end
+  def find_violations(file_name); end
+  def self.options; end
+  def violations; end
+end
+class Anonymous_Struct_10 < Struct
+  def opts; end
+  def opts=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class Morecane::MustNotMatchCheck < Anonymous_Struct_10
+  def file_names; end
+  def find_violations(file_name); end
+  def self.options; end
+  def violations; end
+end
diff --git a/sorbet/rbi/gems/parallel.rbi b/sorbet/rbi/gems/parallel.rbi
new file mode 100644
index 0000000..47ed4ba
--- /dev/null
+++ b/sorbet/rbi/gems/parallel.rbi
@@ -0,0 +1,81 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/parallel/all/parallel.rbi
+#
+# parallel-1.13.0
+
+module Parallel
+  def self.add_progress_bar!(job_factory, options); end
+  def self.all?(*args, &block); end
+  def self.any?(*args, &block); end
+  def self.call_with_index(item, index, options, &block); end
+  def self.create_workers(job_factory, options, &block); end
+  def self.each(array, options = nil, &block); end
+  def self.each_with_index(array, options = nil, &block); end
+  def self.extract_count_from_options(options); end
+  def self.handle_exception(exception, results); end
+  def self.in_processes(options = nil, &block); end
+  def self.in_threads(options = nil); end
+  def self.map(source, options = nil, &block); end
+  def self.map_with_index(array, options = nil, &block); end
+  def self.process_incoming_jobs(read, write, job_factory, options, &block); end
+  def self.replace_worker(job_factory, workers, i, options, blk); end
+  def self.with_instrumentation(item, index, options); end
+  def self.work_direct(job_factory, options, &block); end
+  def self.work_in_processes(job_factory, options, &blk); end
+  def self.work_in_threads(job_factory, options, &block); end
+  def self.worker(job_factory, options, &block); end
+  def self.worker_number; end
+  def self.worker_number=(worker_num); end
+  extend Parallel::ProcessorCount
+end
+module Parallel::ProcessorCount
+  def physical_processor_count; end
+  def processor_count; end
+end
+class Parallel::DeadWorker < StandardError
+end
+class Parallel::Break < StandardError
+end
+class Parallel::Kill < StandardError
+end
+class Parallel::UndumpableException < StandardError
+  def backtrace; end
+  def initialize(original); end
+end
+class Parallel::ExceptionWrapper
+  def exception; end
+  def initialize(exception); end
+end
+class Parallel::Worker
+  def close_pipes; end
+  def initialize(read, write, pid); end
+  def pid; end
+  def read; end
+  def stop; end
+  def thread; end
+  def thread=(arg0); end
+  def wait; end
+  def work(data); end
+  def write; end
+end
+class Parallel::JobFactory
+  def initialize(source, mutex); end
+  def next; end
+  def pack(item, index); end
+  def producer?; end
+  def queue_wrapper(array); end
+  def size; end
+  def unpack(data); end
+end
+class Parallel::UserInterruptHandler
+  def self.kill(thing); end
+  def self.kill_on_ctrl_c(pids, options); end
+  def self.restore_interrupt(old, signal); end
+  def self.trap_interrupt(signal); end
+end
diff --git a/sorbet/rbi/gems/parlour.rbi b/sorbet/rbi/gems/parlour.rbi
new file mode 100644
index 0000000..99788a1
--- /dev/null
+++ b/sorbet/rbi/gems/parlour.rbi
@@ -0,0 +1,840 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: ignore
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/parlour/all/parlour.rbi
+#
+# parlour-6.0.1
+
+module Parlour
+end
+module Parlour::Debugging
+  def self.debug_mode=(*args, &blk); end
+  def self.debug_mode?(*args, &blk); end
+  def self.debug_puts(*args, &blk); end
+  def self.name_for_debug_caller(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+module Parlour::Debugging::Tree
+  def self.begin(*args, &blk); end
+  def self.end(*args, &blk); end
+  def self.here(*args, &blk); end
+  def self.line_prefix; end
+  def self.text_prefix; end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+module Kernel
+end
+class Parlour::Plugin
+  def generate(*args, &blk); end
+  def initialize(*args, &blk); end
+  def self.inherited(*args, &blk); end
+  def self.registered_plugins(*args, &blk); end
+  def self.run_plugins(*args, &blk); end
+  def strictness(*args, &blk); end
+  def strictness=(arg0); end
+  extend T::Helpers
+  extend T::InterfaceWrapper::Helpers
+  extend T::Private::Abstract::Hooks
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+module Parlour::Types
+end
+class Parlour::Types::Type
+  def describe(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def hash; end
+  def initialize(*args, &blk); end
+  def self.to_type(*args, &blk); end
+  def to_type(*args, &blk); end
+  extend T::Helpers
+  extend T::InterfaceWrapper::Helpers
+  extend T::Private::Abstract::Hooks
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::Types::Raw < Parlour::Types::Type
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def str(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Nilable < Parlour::Types::Type
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Union < Parlour::Types::Type
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def types(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Intersection < Parlour::Types::Type
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def types(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Tuple < Parlour::Types::Type
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def types(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Generic < Parlour::Types::Type
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def type(*args, &blk); end
+  def type_params(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::SingleElementCollection < Parlour::Types::Type
+  def collection_name(*args, &blk); end
+  def describe(*args, &blk); end
+  def element(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  extend T::InterfaceWrapper::Helpers
+  extend T::Private::Abstract::Hooks
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Array < Parlour::Types::SingleElementCollection
+  def ==(*args, &blk); end
+  def collection_name(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Set < Parlour::Types::SingleElementCollection
+  def ==(*args, &blk); end
+  def collection_name(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Range < Parlour::Types::SingleElementCollection
+  def ==(*args, &blk); end
+  def collection_name(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Enumerable < Parlour::Types::SingleElementCollection
+  def ==(*args, &blk); end
+  def collection_name(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Enumerator < Parlour::Types::SingleElementCollection
+  def ==(*args, &blk); end
+  def collection_name(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Hash < Parlour::Types::Type
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def key(*args, &blk); end
+  def value(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Record < Parlour::Types::Type
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def keys_to_types(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Class < Parlour::Types::Type
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Boolean < Parlour::Types::Type
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Self < Parlour::Types::Type
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Untyped < Parlour::Types::Type
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Proc < Parlour::Types::Type
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def parameters(*args, &blk); end
+  def return_type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::Types::Proc::Parameter
+  def ==(*args, &blk); end
+  def default(*args, &blk); end
+  def initialize(*args, &blk); end
+  def name(*args, &blk); end
+  def type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::Options
+  def break_params(*args, &blk); end
+  def indented(*args, &blk); end
+  def initialize(*args, &blk); end
+  def sort_namespaces(*args, &blk); end
+  def tab_size(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::TypedObject
+  def add_comment(*args, &blk); end
+  def add_comments(*args, &blk); end
+  def comments(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_comments(*args, &blk); end
+  def generated_by(*args, &blk); end
+  def initialize(*args, &blk); end
+  def name(*args, &blk); end
+  extend T::Helpers
+  extend T::InterfaceWrapper::Helpers
+  extend T::Private::Abstract::Hooks
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::Generator
+  def current_plugin(*args, &blk); end
+  def current_plugin=(arg0); end
+  def initialize(*args, &blk); end
+  def options(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbiGenerator < Parlour::Generator
+  def initialize(**hash); end
+  def rbi(*args, &blk); end
+  def root(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::Parameter
+  def ==(*args, &blk); end
+  def default(*args, &blk); end
+  def generalize_from_rbi!(*args, &blk); end
+  def initialize(*args, &blk); end
+  def kind(*args, &blk); end
+  def name(*args, &blk); end
+  def name_without_kind(*args, &blk); end
+  def to_def_param(*args, &blk); end
+  def to_sig_param(*args, &blk); end
+  def type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbiGenerator::RbiObject < Parlour::TypedObject
+  def describe(*args, &blk); end
+  def generalize_from_rbi!(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def generator(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  extend T::InterfaceWrapper::Helpers
+  extend T::Private::Abstract::Hooks
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::TypeAlias < Parlour::RbiGenerator::RbiObject
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generalize_from_rbi!(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  def type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::Method < Parlour::RbiGenerator::RbiObject
+  def ==(*args, &blk); end
+  def abstract(*args, &blk); end
+  def class_method(*args, &blk); end
+  def describe(*args, &blk); end
+  def final(*args, &blk); end
+  def generalize_from_rbi!(*args, &blk); end
+  def generate_definition(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def implementation(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  def overridable(*args, &blk); end
+  def override(*args, &blk); end
+  def parameters(*args, &blk); end
+  def qualifiers(*args, &blk); end
+  def return_type(*args, &blk); end
+  def type_parameters(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbiGenerator::Attribute < Parlour::RbiGenerator::Method
+  def ==(*args, &blk); end
+  def class_attribute(*args, &blk); end
+  def generalize_from_rbi!(*args, &blk); end
+  def generate_definition(*args, &blk); end
+  def initialize(*args, &blk); end
+  def kind(*args, &blk); end
+  def type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::Arbitrary < Parlour::RbiGenerator::RbiObject
+  def ==(*args, &blk); end
+  def code(*args, &blk); end
+  def code=(arg0); end
+  def describe(*args, &blk); end
+  def generalize_from_rbi!(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::Include < Parlour::RbiGenerator::RbiObject
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generalize_from_rbi!(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::Extend < Parlour::RbiGenerator::RbiObject
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generalize_from_rbi!(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::Constant < Parlour::RbiGenerator::RbiObject
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def eigen_constant; end
+  def generalize_from_rbi!(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  def value(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbiGenerator::Namespace < Parlour::RbiGenerator::RbiObject
+  def add_comment_to_next_child(*args, &blk); end
+  def aliases(*args, &blk); end
+  def children(*args, &blk); end
+  def constants(*args, &blk); end
+  def create_arbitrary(code:, &block); end
+  def create_attr(*args, &blk); end
+  def create_attr_accessor(*args, &blk); end
+  def create_attr_reader(*args, &blk); end
+  def create_attr_writer(*args, &blk); end
+  def create_attribute(*args, &blk); end
+  def create_class(*args, &blk); end
+  def create_constant(*args, &blk); end
+  def create_enum_class(*args, &blk); end
+  def create_extend(*args, &blk); end
+  def create_extends(*args, &blk); end
+  def create_include(*args, &blk); end
+  def create_includes(*args, &blk); end
+  def create_method(*args, &blk); end
+  def create_module(*args, &blk); end
+  def create_struct_class(*args, &blk); end
+  def create_type_alias(*args, &blk); end
+  def describe(*args, &blk); end
+  def extends(*args, &blk); end
+  def final(*args, &blk); end
+  def generalize_from_rbi!(*args, &blk); end
+  def generate_body(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def includes(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  def move_next_comments(*args, &blk); end
+  def path(*args, &blk); end
+  def sealed(*args, &blk); end
+  def type_aliases(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbiGenerator::ModuleNamespace < Parlour::RbiGenerator::Namespace
+  def abstract(*args, &blk); end
+  def describe(*args, &blk); end
+  def generalize_from_rbi!(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def initialize(*args, &blk); end
+  def interface(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbiGenerator::ClassNamespace < Parlour::RbiGenerator::Namespace
+  def abstract(*args, &blk); end
+  def describe(*args, &blk); end
+  def generalize_from_rbi!(*args, &blk); end
+  def generate_rbi(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  def superclass(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbiGenerator::EnumClassNamespace < Parlour::RbiGenerator::ClassNamespace
+  def enums(*args, &blk); end
+  def generalize_from_rbi!(*args, &blk); end
+  def generate_body(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbiGenerator::StructProp
+  def ==(*args, &blk); end
+  def array(*args, &blk); end
+  def default(*args, &blk); end
+  def dont_store(*args, &blk); end
+  def enum(*args, &blk); end
+  def factory(*args, &blk); end
+  def foreign(*args, &blk); end
+  def generalize_from_rbi!(*args, &blk); end
+  def immutable(*args, &blk); end
+  def initialize(*args, &blk); end
+  def name(*args, &blk); end
+  def optional(*args, &blk); end
+  def override(*args, &blk); end
+  def redaction(*args, &blk); end
+  def to_prop_call(*args, &blk); end
+  def type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbiGenerator::StructClassNamespace < Parlour::RbiGenerator::ClassNamespace
+  def generalize_from_rbi!(*args, &blk); end
+  def generate_body(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  def props(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::DetachedRbiGenerator < Parlour::RbiGenerator
+  def current_plugin(*args, &blk); end
+  def detached!(*args, &blk); end
+  def options(*args, &blk); end
+  def rbi(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator < Parlour::Generator
+  def initialize(**hash); end
+  def rbs(*args, &blk); end
+  def root(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator::RbsObject < Parlour::TypedObject
+  def describe(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def generator(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  extend T::InterfaceWrapper::Helpers
+  extend T::Private::Abstract::Hooks
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator::TypeAlias < Parlour::RbsGenerator::RbsObject
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  def type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator::Namespace < Parlour::RbsGenerator::RbsObject
+  def add_comment_to_next_child(*args, &blk); end
+  def aliases(*args, &blk); end
+  def children(*args, &blk); end
+  def constants(*args, &blk); end
+  def create_arbitrary(code:, &block); end
+  def create_attr(*args, &blk); end
+  def create_attr_accessor(*args, &blk); end
+  def create_attr_reader(*args, &blk); end
+  def create_attr_writer(*args, &blk); end
+  def create_attribute(*args, &blk); end
+  def create_class(*args, &blk); end
+  def create_constant(*args, &blk); end
+  def create_extend(*args, &blk); end
+  def create_extends(*args, &blk); end
+  def create_include(*args, &blk); end
+  def create_includes(*args, &blk); end
+  def create_interface(*args, &blk); end
+  def create_method(*args, &blk); end
+  def create_module(*args, &blk); end
+  def create_type_alias(*args, &blk); end
+  def describe(*args, &blk); end
+  def extends(*args, &blk); end
+  def generate_body(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def includes(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  def move_next_comments(*args, &blk); end
+  def path(*args, &blk); end
+  def type_aliases(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbsGenerator::Method < Parlour::RbsGenerator::RbsObject
+  def ==(*args, &blk); end
+  def class_method(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  def signatures(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbsGenerator::Arbitrary < Parlour::RbsGenerator::RbsObject
+  def ==(*args, &blk); end
+  def code(*args, &blk); end
+  def code=(arg0); end
+  def describe(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator::Attribute < Parlour::RbsGenerator::Method
+  def ==(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def kind(*args, &blk); end
+  def type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbsGenerator::Block
+  def ==(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def required(*args, &blk); end
+  def type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbsGenerator::ClassNamespace < Parlour::RbsGenerator::Namespace
+  def describe(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  def superclass(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbsGenerator::Constant < Parlour::RbsGenerator::RbsObject
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  def type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator::Extend < Parlour::RbsGenerator::RbsObject
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  def type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator::Include < Parlour::RbsGenerator::RbsObject
+  def ==(*args, &blk); end
+  def describe(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def merge_into_self(*args, &blk); end
+  def mergeable?(*args, &blk); end
+  def type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+class Parlour::RbsGenerator::MethodSignature
+  def ==(*args, &blk); end
+  def block(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  def initialize(*args, &blk); end
+  def parameters(*args, &blk); end
+  def return_type(*args, &blk); end
+  def type_parameters(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbsGenerator::ModuleNamespace < Parlour::RbsGenerator::Namespace
+  def describe(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbsGenerator::InterfaceNamespace < Parlour::RbsGenerator::Namespace
+  def describe(*args, &blk); end
+  def generate_rbs(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::RbsGenerator::Parameter
+  def ==(*args, &blk); end
+  def initialize(*args, &blk); end
+  def kind(*args, &blk); end
+  def name(*args, &blk); end
+  def name_without_kind(*args, &blk); end
+  def required(*args, &blk); end
+  def to_rbs_param(*args, &blk); end
+  def type(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::DetachedRbsGenerator < Parlour::RbsGenerator
+  def current_plugin(*args, &blk); end
+  def detached!(*args, &blk); end
+  def options(*args, &blk); end
+  def rbs(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+end
+module Parlour::Conversion
+end
+class Parlour::Conversion::Converter
+  def add_warning(*args, &blk); end
+  def initialize; end
+  def warnings(*args, &blk); end
+  extend T::Helpers
+  extend T::InterfaceWrapper::Helpers
+  extend T::Private::Abstract::Hooks
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::Conversion::RbiToRbs < Parlour::Conversion::Converter
+  def convert_all(*args, &blk); end
+  def convert_object(*args, &blk); end
+  def initialize(*args, &blk); end
+  def rbs_gen(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::ConflictResolver
+  def all_eql?(*args, &blk); end
+  def deduplicate_mixins_of_name(*args, &blk); end
+  def merge_strategy(*args, &blk); end
+  def resolve_conflicts(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::ParseError < StandardError
+  def buffer(*args, &blk); end
+  def initialize(buffer, range); end
+  def range(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::TypeParser
+  def ast(*args, &blk); end
+  def ast=(arg0); end
+  def body_has_modifier?(*args, &blk); end
+  def body_includes_and_extends(*args, &blk); end
+  def constant_names(*args, &blk); end
+  def generator(*args, &blk); end
+  def generator=(arg0); end
+  def initialize(*args, &blk); end
+  def node_to_s(*args, &blk); end
+  def parse_all(*args, &blk); end
+  def parse_err(*args, &blk); end
+  def parse_method_into_methods(*args, &blk); end
+  def parse_node_to_type(*args, &blk); end
+  def parse_path_to_object(*args, &blk); end
+  def parse_sig_into_methods(*args, &blk); end
+  def parse_sig_into_sig(*args, &blk); end
+  def previous_sibling_sig_node?(*args, &blk); end
+  def self.from_source(*args, &blk); end
+  def self.parse_single_type(*args, &blk); end
+  def sig_node?(*args, &blk); end
+  def unknown_node_errors(*args, &blk); end
+  def warning(*args, &blk); end
+  def zip_by(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::TypeParser::NodePath
+  def child(*args, &blk); end
+  def indices(*args, &blk); end
+  def initialize(*args, &blk); end
+  def parent(*args, &blk); end
+  def sibling(*args, &blk); end
+  def traverse(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
+class Parlour::TypeParser::IntermediateSig < T::Struct
+  def __t_props_generated_deserialize(*args); end
+  def __t_props_generated_serialize(*args); end
+  def abstract; end
+  def abstract=(val); end
+  def final; end
+  def final=(val); end
+  def overridable; end
+  def overridable=(val); end
+  def override; end
+  def override=(val); end
+  def params; end
+  def params=(val); end
+  def return_type; end
+  def return_type=(val); end
+  def self.inherited(s); end
+  def type_parameters; end
+  def type_parameters=(val); end
+  extend T::Props::ClassMethods
+  extend T::Props::Plugin::ClassMethods
+  extend T::Props::Plugin::ClassMethods
+  extend T::Props::Plugin::ClassMethods
+  extend T::Props::Plugin::ClassMethods
+  extend T::Props::Plugin::ClassMethods
+  extend T::Props::Serializable::ClassMethods
+end
+module Parlour::TypeLoader
+  def self.load_file(*args, &blk); end
+  def self.load_project(*args, &blk); end
+  def self.load_source(*args, &blk); end
+  extend T::Private::Methods::MethodHooks
+  extend T::Private::Methods::SingletonMethodHooks
+  extend T::Sig
+end
diff --git a/sorbet/rbi/gems/parser.rbi b/sorbet/rbi/gems/parser.rbi
new file mode 100644
index 0000000..222b9ca
--- /dev/null
+++ b/sorbet/rbi/gems/parser.rbi
@@ -0,0 +1,1957 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/parser/all/parser.rbi
+#
+# parser-3.0.2.0
+
+module Parser
+  def self.warn_syntax_deviation(feature, version); end
+end
+module Parser::Messages
+  def self.compile(reason, arguments); end
+end
+module Parser::Deprecation
+  def warn_of_deprecation; end
+  def warned_of_deprecation=(arg0); end
+end
+module Parser::AST
+end
+class Parser::AST::Node < AST::Node
+  def assign_properties(properties); end
+  def loc; end
+  def location; end
+end
+class Parser::AST::Processor < AST::Processor
+  def on_alias(node); end
+  def on_and(node); end
+  def on_and_asgn(node); end
+  def on_arg(node); end
+  def on_arg_expr(node); end
+  def on_args(node); end
+  def on_argument(node); end
+  def on_array(node); end
+  def on_array_pattern(node); end
+  def on_array_pattern_with_tail(node); end
+  def on_back_ref(node); end
+  def on_begin(node); end
+  def on_block(node); end
+  def on_block_pass(node); end
+  def on_blockarg(node); end
+  def on_blockarg_expr(node); end
+  def on_break(node); end
+  def on_case(node); end
+  def on_case_match(node); end
+  def on_casgn(node); end
+  def on_class(node); end
+  def on_const(node); end
+  def on_const_pattern(node); end
+  def on_csend(node); end
+  def on_cvar(node); end
+  def on_cvasgn(node); end
+  def on_def(node); end
+  def on_defined?(node); end
+  def on_defs(node); end
+  def on_dstr(node); end
+  def on_dsym(node); end
+  def on_eflipflop(node); end
+  def on_empty_else(node); end
+  def on_ensure(node); end
+  def on_erange(node); end
+  def on_find_pattern(node); end
+  def on_for(node); end
+  def on_forward_arg(node); end
+  def on_gvar(node); end
+  def on_gvasgn(node); end
+  def on_hash(node); end
+  def on_hash_pattern(node); end
+  def on_if(node); end
+  def on_if_guard(node); end
+  def on_iflipflop(node); end
+  def on_in_match(node); end
+  def on_in_pattern(node); end
+  def on_index(node); end
+  def on_indexasgn(node); end
+  def on_irange(node); end
+  def on_ivar(node); end
+  def on_ivasgn(node); end
+  def on_kwarg(node); end
+  def on_kwargs(node); end
+  def on_kwbegin(node); end
+  def on_kwoptarg(node); end
+  def on_kwrestarg(node); end
+  def on_kwsplat(node); end
+  def on_lambda(node); end
+  def on_lvar(node); end
+  def on_lvasgn(node); end
+  def on_masgn(node); end
+  def on_match_alt(node); end
+  def on_match_as(node); end
+  def on_match_current_line(node); end
+  def on_match_pattern(node); end
+  def on_match_pattern_p(node); end
+  def on_match_rest(node); end
+  def on_match_var(node); end
+  def on_match_with_lvasgn(node); end
+  def on_mlhs(node); end
+  def on_module(node); end
+  def on_next(node); end
+  def on_not(node); end
+  def on_nth_ref(node); end
+  def on_numblock(node); end
+  def on_op_asgn(node); end
+  def on_optarg(node); end
+  def on_or(node); end
+  def on_or_asgn(node); end
+  def on_pair(node); end
+  def on_pin(node); end
+  def on_postexe(node); end
+  def on_preexe(node); end
+  def on_procarg0(node); end
+  def on_redo(node); end
+  def on_regexp(node); end
+  def on_resbody(node); end
+  def on_rescue(node); end
+  def on_restarg(node); end
+  def on_restarg_expr(node); end
+  def on_retry(node); end
+  def on_return(node); end
+  def on_sclass(node); end
+  def on_send(node); end
+  def on_shadowarg(node); end
+  def on_splat(node); end
+  def on_super(node); end
+  def on_undef(node); end
+  def on_unless_guard(node); end
+  def on_until(node); end
+  def on_until_post(node); end
+  def on_var(node); end
+  def on_vasgn(node); end
+  def on_when(node); end
+  def on_while(node); end
+  def on_while_post(node); end
+  def on_xstr(node); end
+  def on_yield(node); end
+  def process_argument_node(node); end
+  def process_regular_node(node); end
+  def process_var_asgn_node(node); end
+  def process_variable_node(node); end
+end
+module Parser::Meta
+end
+module Parser::Source
+end
+class Parser::Source::Buffer
+  def bsearch(line_begins, position); end
+  def column_for_position(position); end
+  def decompose_position(position); end
+  def first_line; end
+  def freeze; end
+  def initialize(name, first_line = nil, source: nil); end
+  def inspect; end
+  def last_line; end
+  def line_begins; end
+  def line_for_position(position); end
+  def line_index_for_position(position); end
+  def line_range(lineno); end
+  def name; end
+  def raw_source=(input); end
+  def read; end
+  def self.recognize_encoding(string); end
+  def self.reencode_string(input); end
+  def slice(range); end
+  def source; end
+  def source=(input); end
+  def source_line(lineno); end
+  def source_lines; end
+  def source_range; end
+end
+class Parser::Source::Range
+  def <=>(other); end
+  def adjust(begin_pos: nil, end_pos: nil); end
+  def begin; end
+  def begin_pos; end
+  def column; end
+  def column_range; end
+  def contained?(other); end
+  def contains?(other); end
+  def crossing?(other); end
+  def disjoint?(other); end
+  def empty?; end
+  def end; end
+  def end_pos; end
+  def eql?(arg0); end
+  def first_line; end
+  def hash; end
+  def initialize(source_buffer, begin_pos, end_pos); end
+  def inspect; end
+  def intersect(other); end
+  def is?(*what); end
+  def join(other); end
+  def last_column; end
+  def last_line; end
+  def length; end
+  def line; end
+  def overlaps?(other); end
+  def resize(new_size); end
+  def size; end
+  def source; end
+  def source_buffer; end
+  def source_line; end
+  def to_a; end
+  def to_range; end
+  def to_s; end
+  def with(begin_pos: nil, end_pos: nil); end
+  include Comparable
+end
+class Parser::Source::Comment
+  def ==(other); end
+  def document?; end
+  def initialize(range); end
+  def inline?; end
+  def inspect; end
+  def loc; end
+  def location; end
+  def self.associate(ast, comments); end
+  def self.associate_by_identity(ast, comments); end
+  def self.associate_locations(ast, comments); end
+  def text; end
+  def type; end
+end
+class Parser::Source::Comment::Associator
+  def advance_comment; end
+  def advance_through_directives; end
+  def associate; end
+  def associate_and_advance_comment(node); end
+  def associate_by_identity; end
+  def associate_locations; end
+  def children_in_source_order(node); end
+  def current_comment_before?(node); end
+  def current_comment_before_end?(node); end
+  def current_comment_decorates?(node); end
+  def do_associate; end
+  def initialize(ast, comments); end
+  def process_leading_comments(node); end
+  def process_trailing_comments(node); end
+  def skip_directives; end
+  def skip_directives=(arg0); end
+  def visit(node); end
+end
+class Parser::Source::Rewriter
+  def active_clobber; end
+  def active_clobber=(value); end
+  def active_insertions; end
+  def active_insertions=(value); end
+  def active_queue; end
+  def adjacent?(range1, range2); end
+  def adjacent_insertion_mask(range); end
+  def adjacent_insertions?(range); end
+  def adjacent_position_mask(range); end
+  def adjacent_updates?(range); end
+  def append(action); end
+  def can_merge?(action, existing); end
+  def clobbered_insertion?(insertion); end
+  def clobbered_position_mask(range); end
+  def diagnostics; end
+  def in_transaction?; end
+  def initialize(source_buffer); end
+  def insert_after(range, content); end
+  def insert_after_multi(range, content); end
+  def insert_before(range, content); end
+  def insert_before_multi(range, content); end
+  def merge_actions!(action, existing); end
+  def merge_actions(action, existing); end
+  def merge_replacements(actions); end
+  def process; end
+  def raise_clobber_error(action, existing); end
+  def record_insertion(range); end
+  def record_replace(range); end
+  def remove(range); end
+  def replace(range, content); end
+  def replace_actions(old, updated); end
+  def replace_compatible_with_insertion?(replace, insertion); end
+  def source_buffer; end
+  def transaction; end
+  def wrap(range, before, after); end
+  extend Parser::Deprecation
+end
+class Parser::Source::Rewriter::Action
+  def <=>(other); end
+  def allow_multiple_insertions; end
+  def allow_multiple_insertions?; end
+  def initialize(range, replacement = nil, allow_multiple_insertions = nil, order = nil); end
+  def order; end
+  def range; end
+  def replacement; end
+  def to_s; end
+  include Comparable
+end
+class Parser::Source::TreeRewriter
+  def action_root; end
+  def action_summary; end
+  def as_nested_actions; end
+  def as_replacements; end
+  def check_policy_validity; end
+  def check_range_validity(range); end
+  def combine(range, attributes); end
+  def diagnostics; end
+  def empty?; end
+  def enforce_policy(event); end
+  def import!(foreign_rewriter, offset: nil); end
+  def in_transaction?; end
+  def initialize(source_buffer, crossing_deletions: nil, different_replacements: nil, swallowed_insertions: nil); end
+  def insert_after(range, content); end
+  def insert_after_multi(range, text); end
+  def insert_before(range, content); end
+  def insert_before_multi(range, text); end
+  def inspect; end
+  def merge!(with); end
+  def merge(with); end
+  def process; end
+  def remove(range); end
+  def replace(range, content); end
+  def source_buffer; end
+  def transaction; end
+  def trigger_policy(event, range: nil, conflict: nil, **arguments); end
+  def wrap(range, insert_before, insert_after); end
+  extend Parser::Deprecation
+end
+class Parser::Source::TreeRewriter::Action
+  def analyse_hierarchy(action); end
+  def bsearch_child_index(from = nil); end
+  def call_enforcer_for_merge(action); end
+  def check_fusible(action, *fusible); end
+  def children; end
+  def combine(action); end
+  def combine_children(more_children); end
+  def contract; end
+  def do_combine(action); end
+  def empty?; end
+  def fuse_deletions(action, fusible, other_sibblings); end
+  def initialize(range, enforcer, insert_before: nil, replacement: nil, insert_after: nil, children: nil); end
+  def insert_after; end
+  def insert_before; end
+  def insertion?; end
+  def merge(action); end
+  def moved(source_buffer, offset); end
+  def nested_actions; end
+  def ordered_replacements; end
+  def place_in_hierarchy(action); end
+  def range; end
+  def replacement; end
+  def swallow(children); end
+  def with(range: nil, enforcer: nil, children: nil, insert_before: nil, replacement: nil, insert_after: nil); end
+end
+class Parser::Source::Map
+  def ==(other); end
+  def column; end
+  def expression; end
+  def first_line; end
+  def initialize(expression); end
+  def initialize_copy(other); end
+  def last_column; end
+  def last_line; end
+  def line; end
+  def node; end
+  def node=(node); end
+  def to_hash; end
+  def update_expression(expression_l); end
+  def with(&block); end
+  def with_expression(expression_l); end
+end
+class Parser::Source::Map::Operator < Parser::Source::Map
+  def initialize(operator, expression); end
+  def operator; end
+end
+class Parser::Source::Map::Collection < Parser::Source::Map
+  def begin; end
+  def end; end
+  def initialize(begin_l, end_l, expression_l); end
+end
+class Parser::Source::Map::Constant < Parser::Source::Map
+  def double_colon; end
+  def initialize(double_colon, name, expression); end
+  def name; end
+  def operator; end
+  def update_operator(operator_l); end
+  def with_operator(operator_l); end
+end
+class Parser::Source::Map::Variable < Parser::Source::Map
+  def initialize(name_l, expression_l = nil); end
+  def name; end
+  def operator; end
+  def update_operator(operator_l); end
+  def with_operator(operator_l); end
+end
+class Parser::Source::Map::Keyword < Parser::Source::Map
+  def begin; end
+  def end; end
+  def initialize(keyword_l, begin_l, end_l, expression_l); end
+  def keyword; end
+end
+class Parser::Source::Map::Definition < Parser::Source::Map
+  def end; end
+  def initialize(keyword_l, operator_l, name_l, end_l); end
+  def keyword; end
+  def name; end
+  def operator; end
+end
+class Parser::Source::Map::MethodDefinition < Parser::Source::Map
+  def assignment; end
+  def end; end
+  def initialize(keyword_l, operator_l, name_l, end_l, assignment_l, body_l); end
+  def keyword; end
+  def name; end
+  def operator; end
+end
+class Parser::Source::Map::Send < Parser::Source::Map
+  def begin; end
+  def dot; end
+  def end; end
+  def initialize(dot_l, selector_l, begin_l, end_l, expression_l); end
+  def operator; end
+  def selector; end
+  def update_operator(operator_l); end
+  def with_operator(operator_l); end
+end
+class Parser::Source::Map::Index < Parser::Source::Map
+  def begin; end
+  def end; end
+  def initialize(begin_l, end_l, expression_l); end
+  def operator; end
+  def update_operator(operator_l); end
+  def with_operator(operator_l); end
+end
+class Parser::Source::Map::Condition < Parser::Source::Map
+  def begin; end
+  def else; end
+  def end; end
+  def initialize(keyword_l, begin_l, else_l, end_l, expression_l); end
+  def keyword; end
+end
+class Parser::Source::Map::Ternary < Parser::Source::Map
+  def colon; end
+  def initialize(question_l, colon_l, expression_l); end
+  def question; end
+end
+class Parser::Source::Map::For < Parser::Source::Map
+  def begin; end
+  def end; end
+  def in; end
+  def initialize(keyword_l, in_l, begin_l, end_l, expression_l); end
+  def keyword; end
+end
+class Parser::Source::Map::RescueBody < Parser::Source::Map
+  def assoc; end
+  def begin; end
+  def initialize(keyword_l, assoc_l, begin_l, expression_l); end
+  def keyword; end
+end
+class Parser::Source::Map::Heredoc < Parser::Source::Map
+  def heredoc_body; end
+  def heredoc_end; end
+  def initialize(begin_l, body_l, end_l); end
+end
+class Parser::Source::Map::ObjcKwarg < Parser::Source::Map
+  def argument; end
+  def initialize(keyword_l, operator_l, argument_l, expression_l); end
+  def keyword; end
+  def operator; end
+end
+class Parser::SyntaxError < StandardError
+  def diagnostic; end
+  def initialize(diagnostic); end
+end
+class Parser::ClobberingError < RuntimeError
+end
+class Parser::Diagnostic
+  def arguments; end
+  def first_line_only(range); end
+  def highlights; end
+  def initialize(level, reason, arguments, location, highlights = nil); end
+  def last_line_only(range); end
+  def level; end
+  def location; end
+  def message; end
+  def reason; end
+  def render; end
+  def render_line(range, ellipsis = nil, range_end = nil); end
+end
+class Parser::Diagnostic::Engine
+  def all_errors_are_fatal; end
+  def all_errors_are_fatal=(arg0); end
+  def consumer; end
+  def consumer=(arg0); end
+  def ignore?(diagnostic); end
+  def ignore_warnings; end
+  def ignore_warnings=(arg0); end
+  def initialize(consumer = nil); end
+  def process(diagnostic); end
+  def raise?(diagnostic); end
+end
+class Parser::StaticEnvironment
+  def declare(name); end
+  def declare_forward_args; end
+  def declared?(name); end
+  def declared_forward_args?; end
+  def empty?; end
+  def extend_dynamic; end
+  def extend_static; end
+  def initialize; end
+  def reset; end
+  def unextend; end
+end
+class Parser::Lexer
+  def advance; end
+  def arg_or_cmdarg(cmd_state); end
+  def cmdarg; end
+  def cmdarg=(arg0); end
+  def cmdarg_stack; end
+  def command_start; end
+  def command_start=(arg0); end
+  def comments; end
+  def comments=(arg0); end
+  def cond; end
+  def cond=(arg0); end
+  def cond_stack; end
+  def context; end
+  def context=(arg0); end
+  def dedent_level; end
+  def diagnostic(type, reason, arguments = nil, location = nil, highlights = nil); end
+  def diagnostics; end
+  def diagnostics=(arg0); end
+  def emit(type, value = nil, s = nil, e = nil); end
+  def emit_comment(s = nil, e = nil); end
+  def emit_do(do_block = nil); end
+  def emit_table(table, s = nil, e = nil); end
+  def encode_escape(ord); end
+  def encoding; end
+  def eof_codepoint?(point); end
+  def force_utf32; end
+  def force_utf32=(arg0); end
+  def in_kwarg; end
+  def in_kwarg=(arg0); end
+  def initialize(version); end
+  def lambda_stack; end
+  def literal; end
+  def next_state_for_literal(literal); end
+  def paren_nest; end
+  def pop_cmdarg; end
+  def pop_cond; end
+  def pop_literal; end
+  def push_cmdarg; end
+  def push_cond; end
+  def push_literal(*args); end
+  def range(s = nil, e = nil); end
+  def reset(reset_state = nil); end
+  def self._lex_eof_trans; end
+  def self._lex_eof_trans=(arg0); end
+  def self._lex_from_state_actions; end
+  def self._lex_from_state_actions=(arg0); end
+  def self._lex_index_offsets; end
+  def self._lex_index_offsets=(arg0); end
+  def self._lex_indicies; end
+  def self._lex_indicies=(arg0); end
+  def self._lex_key_spans; end
+  def self._lex_key_spans=(arg0); end
+  def self._lex_to_state_actions; end
+  def self._lex_to_state_actions=(arg0); end
+  def self._lex_trans_actions; end
+  def self._lex_trans_actions=(arg0); end
+  def self._lex_trans_keys; end
+  def self._lex_trans_keys=(arg0); end
+  def self._lex_trans_targs; end
+  def self._lex_trans_targs=(arg0); end
+  def self.lex_en_expr_arg; end
+  def self.lex_en_expr_arg=(arg0); end
+  def self.lex_en_expr_beg; end
+  def self.lex_en_expr_beg=(arg0); end
+  def self.lex_en_expr_cmdarg; end
+  def self.lex_en_expr_cmdarg=(arg0); end
+  def self.lex_en_expr_dot; end
+  def self.lex_en_expr_dot=(arg0); end
+  def self.lex_en_expr_end; end
+  def self.lex_en_expr_end=(arg0); end
+  def self.lex_en_expr_endarg; end
+  def self.lex_en_expr_endarg=(arg0); end
+  def self.lex_en_expr_endfn; end
+  def self.lex_en_expr_endfn=(arg0); end
+  def self.lex_en_expr_fname; end
+  def self.lex_en_expr_fname=(arg0); end
+  def self.lex_en_expr_labelarg; end
+  def self.lex_en_expr_labelarg=(arg0); end
+  def self.lex_en_expr_mid; end
+  def self.lex_en_expr_mid=(arg0); end
+  def self.lex_en_expr_value; end
+  def self.lex_en_expr_value=(arg0); end
+  def self.lex_en_expr_variable; end
+  def self.lex_en_expr_variable=(arg0); end
+  def self.lex_en_interp_backslash_delimited; end
+  def self.lex_en_interp_backslash_delimited=(arg0); end
+  def self.lex_en_interp_backslash_delimited_words; end
+  def self.lex_en_interp_backslash_delimited_words=(arg0); end
+  def self.lex_en_interp_string; end
+  def self.lex_en_interp_string=(arg0); end
+  def self.lex_en_interp_words; end
+  def self.lex_en_interp_words=(arg0); end
+  def self.lex_en_leading_dot; end
+  def self.lex_en_leading_dot=(arg0); end
+  def self.lex_en_line_begin; end
+  def self.lex_en_line_begin=(arg0); end
+  def self.lex_en_line_comment; end
+  def self.lex_en_line_comment=(arg0); end
+  def self.lex_en_plain_backslash_delimited; end
+  def self.lex_en_plain_backslash_delimited=(arg0); end
+  def self.lex_en_plain_backslash_delimited_words; end
+  def self.lex_en_plain_backslash_delimited_words=(arg0); end
+  def self.lex_en_plain_string; end
+  def self.lex_en_plain_string=(arg0); end
+  def self.lex_en_plain_words; end
+  def self.lex_en_plain_words=(arg0); end
+  def self.lex_en_regexp_modifiers; end
+  def self.lex_en_regexp_modifiers=(arg0); end
+  def self.lex_error; end
+  def self.lex_error=(arg0); end
+  def self.lex_start; end
+  def self.lex_start=(arg0); end
+  def source_buffer; end
+  def source_buffer=(source_buffer); end
+  def stack_pop; end
+  def state; end
+  def state=(state); end
+  def static_env; end
+  def static_env=(arg0); end
+  def tok(s = nil, e = nil); end
+  def tokens; end
+  def tokens=(arg0); end
+  def version?(*versions); end
+end
+class Parser::Lexer::Literal
+  def backslash_delimited?; end
+  def clear_buffer; end
+  def coerce_encoding(string); end
+  def dedent_level; end
+  def delimiter?(delimiter); end
+  def emit(token, type, s, e); end
+  def emit_start_tok; end
+  def end_interp_brace_and_try_closing; end
+  def extend_content; end
+  def extend_space(ts, te); end
+  def extend_string(string, ts, te); end
+  def flush_string; end
+  def heredoc?; end
+  def heredoc_e; end
+  def infer_indent_level(line); end
+  def initialize(lexer, str_type, delimiter, str_s, heredoc_e = nil, indent = nil, dedent_body = nil, label_allowed = nil); end
+  def interpolate?; end
+  def munge_escape?(character); end
+  def nest_and_try_closing(delimiter, ts, te, lookahead = nil); end
+  def plain_heredoc?; end
+  def regexp?; end
+  def saved_herebody_s; end
+  def saved_herebody_s=(arg0); end
+  def squiggly_heredoc?; end
+  def start_interp_brace; end
+  def str_s; end
+  def supports_line_continuation_via_slash?; end
+  def type; end
+  def words?; end
+end
+class Parser::Lexer::StackState
+  def active?; end
+  def clear; end
+  def empty?; end
+  def initialize(name); end
+  def inspect; end
+  def lexpop; end
+  def pop; end
+  def push(bit); end
+  def to_s; end
+end
+class Parser::Lexer::Dedenter
+  def dedent(string); end
+  def initialize(dedent_level); end
+  def interrupt; end
+end
+class Parser::Builders::Default
+  def __ENCODING__(__ENCODING__t); end
+  def __FILE__(__FILE__t); end
+  def __LINE__(__LINE__t); end
+  def accessible(node); end
+  def alias(alias_t, to, from); end
+  def arg(name_t); end
+  def arg_expr(expr); end
+  def arg_name_collides?(this_name, that_name); end
+  def arg_prefix_map(op_t, name_t = nil); end
+  def args(begin_t, args, end_t, check_args = nil); end
+  def array(begin_t, elements, end_t); end
+  def array_pattern(lbrack_t, elements, rbrack_t); end
+  def assign(lhs, eql_t, rhs); end
+  def assignable(node); end
+  def associate(begin_t, pairs, end_t); end
+  def attr_asgn(receiver, dot_t, selector_t); end
+  def back_ref(token); end
+  def begin(begin_t, body, end_t); end
+  def begin_body(compound_stmt, rescue_bodies = nil, else_t = nil, else_ = nil, ensure_t = nil, ensure_ = nil); end
+  def begin_keyword(begin_t, body, end_t); end
+  def binary_op(receiver, operator_t, arg); end
+  def binary_op_map(left_e, op_t, right_e); end
+  def block(method_call, begin_t, args, body, end_t); end
+  def block_map(receiver_l, begin_t, end_t); end
+  def block_pass(amper_t, arg); end
+  def blockarg(amper_t, name_t); end
+  def blockarg_expr(amper_t, expr); end
+  def call_lambda(lambda_t); end
+  def call_method(receiver, dot_t, selector_t, lparen_t = nil, args = nil, rparen_t = nil); end
+  def call_type_for_dot(dot_t); end
+  def case(case_t, expr, when_bodies, else_t, else_body, end_t); end
+  def case_match(case_t, expr, in_bodies, else_t, else_body, end_t); end
+  def character(char_t); end
+  def check_assignment_to_numparam(name, loc); end
+  def check_condition(cond); end
+  def check_duplicate_arg(this_arg, map = nil); end
+  def check_duplicate_args(args, map = nil); end
+  def check_duplicate_pattern_key(name, loc); end
+  def check_duplicate_pattern_variable(name, loc); end
+  def check_lvar_name(name, loc); end
+  def check_reserved_for_numparam(name, loc); end
+  def collapse_string_parts?(parts); end
+  def collection_map(begin_t, parts, end_t); end
+  def complex(complex_t); end
+  def compstmt(statements); end
+  def condition(cond_t, cond, then_t, if_true, else_t, if_false, end_t); end
+  def condition_map(keyword_t, cond_e, begin_t, body_e, else_t, else_e, end_t); end
+  def condition_mod(if_true, if_false, cond_t, cond); end
+  def const(name_t); end
+  def const_fetch(scope, t_colon2, name_t); end
+  def const_global(t_colon3, name_t); end
+  def const_op_assignable(node); end
+  def const_pattern(const, ldelim_t, pattern, rdelim_t); end
+  def constant_map(scope, colon2_t, name_t); end
+  def cvar(token); end
+  def dedent_string(node, dedent_level); end
+  def def_class(class_t, name, lt_t, superclass, body, end_t); end
+  def def_endless_method(def_t, name_t, args, assignment_t, body); end
+  def def_endless_singleton(def_t, definee, dot_t, name_t, args, assignment_t, body); end
+  def def_method(def_t, name_t, args, body, end_t); end
+  def def_module(module_t, name, body, end_t); end
+  def def_sclass(class_t, lshft_t, expr, body, end_t); end
+  def def_singleton(def_t, definee, dot_t, name_t, args, body, end_t); end
+  def definition_map(keyword_t, operator_t, name_t, end_t); end
+  def delimited_string_map(string_t); end
+  def diagnostic(type, reason, arguments, location, highlights = nil); end
+  def eh_keyword_map(compstmt_e, keyword_t, body_es, else_t, else_e); end
+  def emit_file_line_as_literals; end
+  def emit_file_line_as_literals=(arg0); end
+  def endless_definition_map(keyword_t, operator_t, name_t, assignment_t, body_e); end
+  def expr_map(loc); end
+  def false(false_t); end
+  def find_pattern(lbrack_t, elements, rbrack_t); end
+  def float(float_t); end
+  def for(for_t, iterator, in_t, iteratee, do_t, body, end_t); end
+  def for_map(keyword_t, in_t, begin_t, end_t); end
+  def forward_arg(dots_t); end
+  def forward_only_args(begin_t, dots_t, end_t); end
+  def forwarded_args(dots_t); end
+  def guard_map(keyword_t, guard_body_e); end
+  def gvar(token); end
+  def hash_pattern(lbrace_t, kwargs, rbrace_t); end
+  def ident(token); end
+  def if_guard(if_t, if_body); end
+  def in_match(lhs, in_t, rhs); end
+  def in_pattern(in_t, pattern, guard, then_t, body); end
+  def index(receiver, lbrack_t, indexes, rbrack_t); end
+  def index_asgn(receiver, lbrack_t, indexes, rbrack_t); end
+  def index_map(receiver_e, lbrack_t, rbrack_t); end
+  def initialize; end
+  def integer(integer_t); end
+  def ivar(token); end
+  def join_exprs(left_expr, right_expr); end
+  def keyword_cmd(type, keyword_t, lparen_t = nil, args = nil, rparen_t = nil); end
+  def keyword_map(keyword_t, begin_t, args, end_t); end
+  def keyword_mod_map(pre_e, keyword_t, post_e); end
+  def kwarg(name_t); end
+  def kwarg_map(name_t, value_e = nil); end
+  def kwargs?(node); end
+  def kwnilarg(dstar_t, nil_t); end
+  def kwoptarg(name_t, value); end
+  def kwrestarg(dstar_t, name_t = nil); end
+  def kwsplat(dstar_t, arg); end
+  def loc(token); end
+  def logical_op(type, lhs, op_t, rhs); end
+  def loop(type, keyword_t, cond, do_t, body, end_t); end
+  def loop_mod(type, body, keyword_t, cond); end
+  def match_alt(left, pipe_t, right); end
+  def match_as(value, assoc_t, as); end
+  def match_hash_var(name_t); end
+  def match_hash_var_from_str(begin_t, strings, end_t); end
+  def match_label(label_type, label); end
+  def match_nil_pattern(dstar_t, nil_t); end
+  def match_op(receiver, match_t, arg); end
+  def match_pair(label_type, label, value); end
+  def match_pattern(lhs, match_t, rhs); end
+  def match_pattern_p(lhs, match_t, rhs); end
+  def match_rest(star_t, name_t = nil); end
+  def match_var(name_t); end
+  def match_with_trailing_comma(match, comma_t); end
+  def module_definition_map(keyword_t, name_e, operator_t, end_t); end
+  def multi_assign(lhs, eql_t, rhs); end
+  def multi_lhs(begin_t, items, end_t); end
+  def n(type, children, source_map); end
+  def n0(type, source_map); end
+  def nil(nil_t); end
+  def not_op(not_t, begin_t = nil, receiver = nil, end_t = nil); end
+  def nth_ref(token); end
+  def numargs(max_numparam); end
+  def numeric(kind, token); end
+  def objc_kwarg(kwname_t, assoc_t, name_t); end
+  def objc_restarg(star_t, name = nil); end
+  def objc_varargs(pair, rest_of_varargs); end
+  def op_assign(lhs, op_t, rhs); end
+  def optarg(name_t, eql_t, value); end
+  def pair(key, assoc_t, value); end
+  def pair_keyword(key_t, value); end
+  def pair_keyword_map(key_t, value_e); end
+  def pair_list_18(list); end
+  def pair_quoted(begin_t, parts, end_t, value); end
+  def pair_quoted_map(begin_t, end_t, value_e); end
+  def parser; end
+  def parser=(arg0); end
+  def pin(pin_t, var); end
+  def postexe(postexe_t, lbrace_t, compstmt, rbrace_t); end
+  def preexe(preexe_t, lbrace_t, compstmt, rbrace_t); end
+  def prefix_string_map(symbol); end
+  def procarg0(arg); end
+  def range_exclusive(lhs, dot3_t, rhs); end
+  def range_inclusive(lhs, dot2_t, rhs); end
+  def range_map(start_e, op_t, end_e); end
+  def rational(rational_t); end
+  def regexp_compose(begin_t, parts, end_t, options); end
+  def regexp_map(begin_t, end_t, options_e); end
+  def regexp_options(regopt_t); end
+  def rescue_body(rescue_t, exc_list, assoc_t, exc_var, then_t, compound_stmt); end
+  def rescue_body_map(keyword_t, exc_list_e, assoc_t, exc_var_e, then_t, compstmt_e); end
+  def restarg(star_t, name_t = nil); end
+  def restarg_expr(star_t, expr = nil); end
+  def rewrite_hash_args_to_kwargs(args); end
+  def self(token); end
+  def self.emit_arg_inside_procarg0; end
+  def self.emit_arg_inside_procarg0=(arg0); end
+  def self.emit_encoding; end
+  def self.emit_encoding=(arg0); end
+  def self.emit_forward_arg; end
+  def self.emit_forward_arg=(arg0); end
+  def self.emit_index; end
+  def self.emit_index=(arg0); end
+  def self.emit_kwargs; end
+  def self.emit_kwargs=(arg0); end
+  def self.emit_lambda; end
+  def self.emit_lambda=(arg0); end
+  def self.emit_match_pattern; end
+  def self.emit_match_pattern=(arg0); end
+  def self.emit_procarg0; end
+  def self.emit_procarg0=(arg0); end
+  def self.modernize; end
+  def send_binary_op_map(lhs_e, selector_t, rhs_e); end
+  def send_index_map(receiver_e, lbrack_t, rbrack_t); end
+  def send_map(receiver_e, dot_t, selector_t, begin_t = nil, args = nil, end_t = nil); end
+  def send_unary_op_map(selector_t, arg_e); end
+  def shadowarg(name_t); end
+  def splat(star_t, arg = nil); end
+  def static_regexp(parts, options); end
+  def static_regexp_node(node); end
+  def static_string(nodes); end
+  def string(string_t); end
+  def string_compose(begin_t, parts, end_t); end
+  def string_internal(string_t); end
+  def string_map(begin_t, parts, end_t); end
+  def string_value(token); end
+  def symbol(symbol_t); end
+  def symbol_compose(begin_t, parts, end_t); end
+  def symbol_internal(symbol_t); end
+  def symbols_compose(begin_t, parts, end_t); end
+  def ternary(cond, question_t, if_true, colon_t, if_false); end
+  def ternary_map(begin_e, question_t, mid_e, colon_t, end_e); end
+  def token_map(token); end
+  def true(true_t); end
+  def unary_num(unary_t, numeric); end
+  def unary_op(op_t, receiver); end
+  def unary_op_map(op_t, arg_e = nil); end
+  def undef_method(undef_t, names); end
+  def unless_guard(unless_t, unless_body); end
+  def unquoted_map(token); end
+  def validate_definee(definee); end
+  def value(token); end
+  def var_send_map(variable_e); end
+  def variable_map(name_t); end
+  def when(when_t, patterns, then_t, body); end
+  def word(parts); end
+  def words_compose(begin_t, parts, end_t); end
+  def xstring_compose(begin_t, parts, end_t); end
+end
+class Parser::Context
+  def class_definition_allowed?; end
+  def dynamic_const_definition_allowed?; end
+  def empty?; end
+  def in_block?; end
+  def in_class?; end
+  def in_dynamic_block?; end
+  def in_lambda?; end
+  def indirectly_in_def?; end
+  def initialize; end
+  def module_definition_allowed?; end
+  def pop; end
+  def push(state); end
+  def reset; end
+  def stack; end
+end
+class Parser::MaxNumparamStack
+  def empty?; end
+  def has_numparams?; end
+  def has_ordinary_params!; end
+  def has_ordinary_params?; end
+  def initialize; end
+  def pop; end
+  def push; end
+  def register(numparam); end
+  def set(value); end
+  def stack; end
+  def top; end
+end
+class Parser::CurrentArgStack
+  def empty?; end
+  def initialize; end
+  def pop; end
+  def push(value); end
+  def reset; end
+  def set(value); end
+  def stack; end
+  def top; end
+end
+class Parser::VariablesStack
+  def declare(name); end
+  def declared?(name); end
+  def empty?; end
+  def initialize; end
+  def pop; end
+  def push; end
+  def reset; end
+end
+class Parser::Base < Racc::Parser
+  def builder; end
+  def check_kwarg_name(name_t); end
+  def context; end
+  def current_arg_stack; end
+  def diagnostic(level, reason, arguments, location_t, highlights_ts = nil); end
+  def diagnostics; end
+  def initialize(builder = nil); end
+  def lexer; end
+  def max_numparam_stack; end
+  def next_token; end
+  def on_error(error_token_id, error_value, value_stack); end
+  def parse(source_buffer); end
+  def parse_with_comments(source_buffer); end
+  def pattern_hash_keys; end
+  def pattern_variables; end
+  def reset; end
+  def self.default_parser; end
+  def self.parse(string, file = nil, line = nil); end
+  def self.parse_file(filename); end
+  def self.parse_file_with_comments(filename); end
+  def self.parse_with_comments(string, file = nil, line = nil); end
+  def self.setup_source_buffer(file, line, string, encoding); end
+  def source_buffer; end
+  def static_env; end
+  def tokenize(source_buffer, recover = nil); end
+end
+class Parser::Rewriter < Parser::AST::Processor
+  def assignment?(node); end
+  def initialize(*arg0); end
+  def insert_after(range, content); end
+  def insert_before(range, content); end
+  def remove(range); end
+  def replace(range, content); end
+  def rewrite(source_buffer, ast); end
+  def wrap(range, before, after); end
+  extend Parser::Deprecation
+end
+class Parser::TreeRewriter < Parser::AST::Processor
+  def assignment?(node); end
+  def insert_after(range, content); end
+  def insert_before(range, content); end
+  def remove(range); end
+  def replace(range, content); end
+  def rewrite(source_buffer, ast, **policy); end
+  def wrap(range, before, after); end
+end
+module Parser::Builders
+end
+class Parser::Ruby27 < Parser::Base
+  def _reduce_1(val, _values, result); end
+  def _reduce_10(val, _values, result); end
+  def _reduce_100(val, _values, result); end
+  def _reduce_101(val, _values, result); end
+  def _reduce_102(val, _values, result); end
+  def _reduce_103(val, _values, result); end
+  def _reduce_104(val, _values, result); end
+  def _reduce_105(val, _values, result); end
+  def _reduce_106(val, _values, result); end
+  def _reduce_107(val, _values, result); end
+  def _reduce_108(val, _values, result); end
+  def _reduce_109(val, _values, result); end
+  def _reduce_11(val, _values, result); end
+  def _reduce_110(val, _values, result); end
+  def _reduce_111(val, _values, result); end
+  def _reduce_112(val, _values, result); end
+  def _reduce_113(val, _values, result); end
+  def _reduce_114(val, _values, result); end
+  def _reduce_115(val, _values, result); end
+  def _reduce_117(val, _values, result); end
+  def _reduce_118(val, _values, result); end
+  def _reduce_119(val, _values, result); end
+  def _reduce_12(val, _values, result); end
+  def _reduce_125(val, _values, result); end
+  def _reduce_127(val, _values, result); end
+  def _reduce_128(val, _values, result); end
+  def _reduce_129(val, _values, result); end
+  def _reduce_13(val, _values, result); end
+  def _reduce_14(val, _values, result); end
+  def _reduce_15(val, _values, result); end
+  def _reduce_16(val, _values, result); end
+  def _reduce_18(val, _values, result); end
+  def _reduce_19(val, _values, result); end
+  def _reduce_2(val, _values, result); end
+  def _reduce_20(val, _values, result); end
+  def _reduce_201(val, _values, result); end
+  def _reduce_202(val, _values, result); end
+  def _reduce_203(val, _values, result); end
+  def _reduce_204(val, _values, result); end
+  def _reduce_205(val, _values, result); end
+  def _reduce_206(val, _values, result); end
+  def _reduce_207(val, _values, result); end
+  def _reduce_208(val, _values, result); end
+  def _reduce_209(val, _values, result); end
+  def _reduce_21(val, _values, result); end
+  def _reduce_210(val, _values, result); end
+  def _reduce_211(val, _values, result); end
+  def _reduce_212(val, _values, result); end
+  def _reduce_213(val, _values, result); end
+  def _reduce_214(val, _values, result); end
+  def _reduce_215(val, _values, result); end
+  def _reduce_216(val, _values, result); end
+  def _reduce_217(val, _values, result); end
+  def _reduce_218(val, _values, result); end
+  def _reduce_219(val, _values, result); end
+  def _reduce_22(val, _values, result); end
+  def _reduce_220(val, _values, result); end
+  def _reduce_221(val, _values, result); end
+  def _reduce_222(val, _values, result); end
+  def _reduce_223(val, _values, result); end
+  def _reduce_224(val, _values, result); end
+  def _reduce_225(val, _values, result); end
+  def _reduce_226(val, _values, result); end
+  def _reduce_227(val, _values, result); end
+  def _reduce_228(val, _values, result); end
+  def _reduce_23(val, _values, result); end
+  def _reduce_230(val, _values, result); end
+  def _reduce_231(val, _values, result); end
+  def _reduce_232(val, _values, result); end
+  def _reduce_233(val, _values, result); end
+  def _reduce_234(val, _values, result); end
+  def _reduce_235(val, _values, result); end
+  def _reduce_236(val, _values, result); end
+  def _reduce_237(val, _values, result); end
+  def _reduce_238(val, _values, result); end
+  def _reduce_239(val, _values, result); end
+  def _reduce_24(val, _values, result); end
+  def _reduce_240(val, _values, result); end
+  def _reduce_241(val, _values, result); end
+  def _reduce_242(val, _values, result); end
+  def _reduce_248(val, _values, result); end
+  def _reduce_249(val, _values, result); end
+  def _reduce_25(val, _values, result); end
+  def _reduce_253(val, _values, result); end
+  def _reduce_254(val, _values, result); end
+  def _reduce_256(val, _values, result); end
+  def _reduce_257(val, _values, result); end
+  def _reduce_258(val, _values, result); end
+  def _reduce_259(val, _values, result); end
+  def _reduce_26(val, _values, result); end
+  def _reduce_260(val, _values, result); end
+  def _reduce_262(val, _values, result); end
+  def _reduce_265(val, _values, result); end
+  def _reduce_266(val, _values, result); end
+  def _reduce_267(val, _values, result); end
+  def _reduce_268(val, _values, result); end
+  def _reduce_269(val, _values, result); end
+  def _reduce_27(val, _values, result); end
+  def _reduce_270(val, _values, result); end
+  def _reduce_271(val, _values, result); end
+  def _reduce_272(val, _values, result); end
+  def _reduce_273(val, _values, result); end
+  def _reduce_274(val, _values, result); end
+  def _reduce_275(val, _values, result); end
+  def _reduce_276(val, _values, result); end
+  def _reduce_277(val, _values, result); end
+  def _reduce_278(val, _values, result); end
+  def _reduce_279(val, _values, result); end
+  def _reduce_28(val, _values, result); end
+  def _reduce_280(val, _values, result); end
+  def _reduce_281(val, _values, result); end
+  def _reduce_283(val, _values, result); end
+  def _reduce_284(val, _values, result); end
+  def _reduce_285(val, _values, result); end
+  def _reduce_29(val, _values, result); end
+  def _reduce_296(val, _values, result); end
+  def _reduce_297(val, _values, result); end
+  def _reduce_298(val, _values, result); end
+  def _reduce_299(val, _values, result); end
+  def _reduce_3(val, _values, result); end
+  def _reduce_30(val, _values, result); end
+  def _reduce_300(val, _values, result); end
+  def _reduce_301(val, _values, result); end
+  def _reduce_302(val, _values, result); end
+  def _reduce_303(val, _values, result); end
+  def _reduce_304(val, _values, result); end
+  def _reduce_305(val, _values, result); end
+  def _reduce_306(val, _values, result); end
+  def _reduce_307(val, _values, result); end
+  def _reduce_308(val, _values, result); end
+  def _reduce_309(val, _values, result); end
+  def _reduce_310(val, _values, result); end
+  def _reduce_311(val, _values, result); end
+  def _reduce_312(val, _values, result); end
+  def _reduce_313(val, _values, result); end
+  def _reduce_314(val, _values, result); end
+  def _reduce_315(val, _values, result); end
+  def _reduce_317(val, _values, result); end
+  def _reduce_318(val, _values, result); end
+  def _reduce_319(val, _values, result); end
+  def _reduce_32(val, _values, result); end
+  def _reduce_320(val, _values, result); end
+  def _reduce_321(val, _values, result); end
+  def _reduce_322(val, _values, result); end
+  def _reduce_323(val, _values, result); end
+  def _reduce_324(val, _values, result); end
+  def _reduce_325(val, _values, result); end
+  def _reduce_326(val, _values, result); end
+  def _reduce_327(val, _values, result); end
+  def _reduce_328(val, _values, result); end
+  def _reduce_329(val, _values, result); end
+  def _reduce_33(val, _values, result); end
+  def _reduce_330(val, _values, result); end
+  def _reduce_331(val, _values, result); end
+  def _reduce_332(val, _values, result); end
+  def _reduce_333(val, _values, result); end
+  def _reduce_334(val, _values, result); end
+  def _reduce_335(val, _values, result); end
+  def _reduce_336(val, _values, result); end
+  def _reduce_337(val, _values, result); end
+  def _reduce_338(val, _values, result); end
+  def _reduce_339(val, _values, result); end
+  def _reduce_34(val, _values, result); end
+  def _reduce_340(val, _values, result); end
+  def _reduce_341(val, _values, result); end
+  def _reduce_342(val, _values, result); end
+  def _reduce_344(val, _values, result); end
+  def _reduce_347(val, _values, result); end
+  def _reduce_35(val, _values, result); end
+  def _reduce_351(val, _values, result); end
+  def _reduce_353(val, _values, result); end
+  def _reduce_356(val, _values, result); end
+  def _reduce_357(val, _values, result); end
+  def _reduce_358(val, _values, result); end
+  def _reduce_359(val, _values, result); end
+  def _reduce_361(val, _values, result); end
+  def _reduce_362(val, _values, result); end
+  def _reduce_363(val, _values, result); end
+  def _reduce_364(val, _values, result); end
+  def _reduce_365(val, _values, result); end
+  def _reduce_366(val, _values, result); end
+  def _reduce_367(val, _values, result); end
+  def _reduce_368(val, _values, result); end
+  def _reduce_369(val, _values, result); end
+  def _reduce_37(val, _values, result); end
+  def _reduce_370(val, _values, result); end
+  def _reduce_371(val, _values, result); end
+  def _reduce_372(val, _values, result); end
+  def _reduce_373(val, _values, result); end
+  def _reduce_374(val, _values, result); end
+  def _reduce_375(val, _values, result); end
+  def _reduce_376(val, _values, result); end
+  def _reduce_377(val, _values, result); end
+  def _reduce_378(val, _values, result); end
+  def _reduce_38(val, _values, result); end
+  def _reduce_380(val, _values, result); end
+  def _reduce_381(val, _values, result); end
+  def _reduce_382(val, _values, result); end
+  def _reduce_383(val, _values, result); end
+  def _reduce_384(val, _values, result); end
+  def _reduce_385(val, _values, result); end
+  def _reduce_386(val, _values, result); end
+  def _reduce_387(val, _values, result); end
+  def _reduce_389(val, _values, result); end
+  def _reduce_39(val, _values, result); end
+  def _reduce_390(val, _values, result); end
+  def _reduce_391(val, _values, result); end
+  def _reduce_392(val, _values, result); end
+  def _reduce_393(val, _values, result); end
+  def _reduce_394(val, _values, result); end
+  def _reduce_395(val, _values, result); end
+  def _reduce_396(val, _values, result); end
+  def _reduce_397(val, _values, result); end
+  def _reduce_399(val, _values, result); end
+  def _reduce_4(val, _values, result); end
+  def _reduce_40(val, _values, result); end
+  def _reduce_400(val, _values, result); end
+  def _reduce_401(val, _values, result); end
+  def _reduce_402(val, _values, result); end
+  def _reduce_403(val, _values, result); end
+  def _reduce_404(val, _values, result); end
+  def _reduce_405(val, _values, result); end
+  def _reduce_406(val, _values, result); end
+  def _reduce_407(val, _values, result); end
+  def _reduce_408(val, _values, result); end
+  def _reduce_409(val, _values, result); end
+  def _reduce_41(val, _values, result); end
+  def _reduce_410(val, _values, result); end
+  def _reduce_411(val, _values, result); end
+  def _reduce_412(val, _values, result); end
+  def _reduce_413(val, _values, result); end
+  def _reduce_414(val, _values, result); end
+  def _reduce_415(val, _values, result); end
+  def _reduce_416(val, _values, result); end
+  def _reduce_417(val, _values, result); end
+  def _reduce_418(val, _values, result); end
+  def _reduce_419(val, _values, result); end
+  def _reduce_42(val, _values, result); end
+  def _reduce_420(val, _values, result); end
+  def _reduce_421(val, _values, result); end
+  def _reduce_422(val, _values, result); end
+  def _reduce_423(val, _values, result); end
+  def _reduce_424(val, _values, result); end
+  def _reduce_425(val, _values, result); end
+  def _reduce_426(val, _values, result); end
+  def _reduce_427(val, _values, result); end
+  def _reduce_428(val, _values, result); end
+  def _reduce_429(val, _values, result); end
+  def _reduce_43(val, _values, result); end
+  def _reduce_430(val, _values, result); end
+  def _reduce_431(val, _values, result); end
+  def _reduce_432(val, _values, result); end
+  def _reduce_433(val, _values, result); end
+  def _reduce_435(val, _values, result); end
+  def _reduce_436(val, _values, result); end
+  def _reduce_437(val, _values, result); end
+  def _reduce_438(val, _values, result); end
+  def _reduce_44(val, _values, result); end
+  def _reduce_440(val, _values, result); end
+  def _reduce_441(val, _values, result); end
+  def _reduce_442(val, _values, result); end
+  def _reduce_444(val, _values, result); end
+  def _reduce_445(val, _values, result); end
+  def _reduce_446(val, _values, result); end
+  def _reduce_447(val, _values, result); end
+  def _reduce_449(val, _values, result); end
+  def _reduce_451(val, _values, result); end
+  def _reduce_453(val, _values, result); end
+  def _reduce_454(val, _values, result); end
+  def _reduce_456(val, _values, result); end
+  def _reduce_457(val, _values, result); end
+  def _reduce_458(val, _values, result); end
+  def _reduce_459(val, _values, result); end
+  def _reduce_46(val, _values, result); end
+  def _reduce_460(val, _values, result); end
+  def _reduce_461(val, _values, result); end
+  def _reduce_462(val, _values, result); end
+  def _reduce_463(val, _values, result); end
+  def _reduce_464(val, _values, result); end
+  def _reduce_465(val, _values, result); end
+  def _reduce_466(val, _values, result); end
+  def _reduce_467(val, _values, result); end
+  def _reduce_468(val, _values, result); end
+  def _reduce_469(val, _values, result); end
+  def _reduce_470(val, _values, result); end
+  def _reduce_471(val, _values, result); end
+  def _reduce_472(val, _values, result); end
+  def _reduce_473(val, _values, result); end
+  def _reduce_474(val, _values, result); end
+  def _reduce_475(val, _values, result); end
+  def _reduce_476(val, _values, result); end
+  def _reduce_478(val, _values, result); end
+  def _reduce_479(val, _values, result); end
+  def _reduce_480(val, _values, result); end
+  def _reduce_481(val, _values, result); end
+  def _reduce_482(val, _values, result); end
+  def _reduce_483(val, _values, result); end
+  def _reduce_484(val, _values, result); end
+  def _reduce_485(val, _values, result); end
+  def _reduce_487(val, _values, result); end
+  def _reduce_488(val, _values, result); end
+  def _reduce_489(val, _values, result); end
+  def _reduce_49(val, _values, result); end
+  def _reduce_490(val, _values, result); end
+  def _reduce_491(val, _values, result); end
+  def _reduce_492(val, _values, result); end
+  def _reduce_493(val, _values, result); end
+  def _reduce_494(val, _values, result); end
+  def _reduce_495(val, _values, result); end
+  def _reduce_496(val, _values, result); end
+  def _reduce_497(val, _values, result); end
+  def _reduce_498(val, _values, result); end
+  def _reduce_499(val, _values, result); end
+  def _reduce_5(val, _values, result); end
+  def _reduce_50(val, _values, result); end
+  def _reduce_500(val, _values, result); end
+  def _reduce_501(val, _values, result); end
+  def _reduce_503(val, _values, result); end
+  def _reduce_504(val, _values, result); end
+  def _reduce_505(val, _values, result); end
+  def _reduce_506(val, _values, result); end
+  def _reduce_51(val, _values, result); end
+  def _reduce_510(val, _values, result); end
+  def _reduce_511(val, _values, result); end
+  def _reduce_52(val, _values, result); end
+  def _reduce_520(val, _values, result); end
+  def _reduce_521(val, _values, result); end
+  def _reduce_522(val, _values, result); end
+  def _reduce_523(val, _values, result); end
+  def _reduce_524(val, _values, result); end
+  def _reduce_525(val, _values, result); end
+  def _reduce_526(val, _values, result); end
+  def _reduce_527(val, _values, result); end
+  def _reduce_528(val, _values, result); end
+  def _reduce_529(val, _values, result); end
+  def _reduce_53(val, _values, result); end
+  def _reduce_530(val, _values, result); end
+  def _reduce_533(val, _values, result); end
+  def _reduce_535(val, _values, result); end
+  def _reduce_539(val, _values, result); end
+  def _reduce_54(val, _values, result); end
+  def _reduce_540(val, _values, result); end
+  def _reduce_541(val, _values, result); end
+  def _reduce_542(val, _values, result); end
+  def _reduce_543(val, _values, result); end
+  def _reduce_544(val, _values, result); end
+  def _reduce_545(val, _values, result); end
+  def _reduce_546(val, _values, result); end
+  def _reduce_547(val, _values, result); end
+  def _reduce_548(val, _values, result); end
+  def _reduce_549(val, _values, result); end
+  def _reduce_550(val, _values, result); end
+  def _reduce_551(val, _values, result); end
+  def _reduce_552(val, _values, result); end
+  def _reduce_553(val, _values, result); end
+  def _reduce_554(val, _values, result); end
+  def _reduce_555(val, _values, result); end
+  def _reduce_556(val, _values, result); end
+  def _reduce_557(val, _values, result); end
+  def _reduce_558(val, _values, result); end
+  def _reduce_559(val, _values, result); end
+  def _reduce_560(val, _values, result); end
+  def _reduce_561(val, _values, result); end
+  def _reduce_562(val, _values, result); end
+  def _reduce_563(val, _values, result); end
+  def _reduce_564(val, _values, result); end
+  def _reduce_565(val, _values, result); end
+  def _reduce_566(val, _values, result); end
+  def _reduce_567(val, _values, result); end
+  def _reduce_568(val, _values, result); end
+  def _reduce_569(val, _values, result); end
+  def _reduce_57(val, _values, result); end
+  def _reduce_570(val, _values, result); end
+  def _reduce_571(val, _values, result); end
+  def _reduce_572(val, _values, result); end
+  def _reduce_573(val, _values, result); end
+  def _reduce_577(val, _values, result); end
+  def _reduce_578(val, _values, result); end
+  def _reduce_579(val, _values, result); end
+  def _reduce_58(val, _values, result); end
+  def _reduce_580(val, _values, result); end
+  def _reduce_581(val, _values, result); end
+  def _reduce_582(val, _values, result); end
+  def _reduce_583(val, _values, result); end
+  def _reduce_584(val, _values, result); end
+  def _reduce_585(val, _values, result); end
+  def _reduce_586(val, _values, result); end
+  def _reduce_587(val, _values, result); end
+  def _reduce_588(val, _values, result); end
+  def _reduce_589(val, _values, result); end
+  def _reduce_590(val, _values, result); end
+  def _reduce_591(val, _values, result); end
+  def _reduce_592(val, _values, result); end
+  def _reduce_593(val, _values, result); end
+  def _reduce_594(val, _values, result); end
+  def _reduce_595(val, _values, result); end
+  def _reduce_596(val, _values, result); end
+  def _reduce_597(val, _values, result); end
+  def _reduce_598(val, _values, result); end
+  def _reduce_599(val, _values, result); end
+  def _reduce_6(val, _values, result); end
+  def _reduce_600(val, _values, result); end
+  def _reduce_601(val, _values, result); end
+  def _reduce_602(val, _values, result); end
+  def _reduce_603(val, _values, result); end
+  def _reduce_604(val, _values, result); end
+  def _reduce_605(val, _values, result); end
+  def _reduce_606(val, _values, result); end
+  def _reduce_607(val, _values, result); end
+  def _reduce_608(val, _values, result); end
+  def _reduce_609(val, _values, result); end
+  def _reduce_610(val, _values, result); end
+  def _reduce_611(val, _values, result); end
+  def _reduce_612(val, _values, result); end
+  def _reduce_613(val, _values, result); end
+  def _reduce_614(val, _values, result); end
+  def _reduce_615(val, _values, result); end
+  def _reduce_616(val, _values, result); end
+  def _reduce_617(val, _values, result); end
+  def _reduce_618(val, _values, result); end
+  def _reduce_619(val, _values, result); end
+  def _reduce_62(val, _values, result); end
+  def _reduce_620(val, _values, result); end
+  def _reduce_621(val, _values, result); end
+  def _reduce_622(val, _values, result); end
+  def _reduce_623(val, _values, result); end
+  def _reduce_624(val, _values, result); end
+  def _reduce_625(val, _values, result); end
+  def _reduce_626(val, _values, result); end
+  def _reduce_627(val, _values, result); end
+  def _reduce_628(val, _values, result); end
+  def _reduce_629(val, _values, result); end
+  def _reduce_63(val, _values, result); end
+  def _reduce_630(val, _values, result); end
+  def _reduce_631(val, _values, result); end
+  def _reduce_632(val, _values, result); end
+  def _reduce_633(val, _values, result); end
+  def _reduce_634(val, _values, result); end
+  def _reduce_635(val, _values, result); end
+  def _reduce_636(val, _values, result); end
+  def _reduce_637(val, _values, result); end
+  def _reduce_639(val, _values, result); end
+  def _reduce_64(val, _values, result); end
+  def _reduce_640(val, _values, result); end
+  def _reduce_641(val, _values, result); end
+  def _reduce_642(val, _values, result); end
+  def _reduce_643(val, _values, result); end
+  def _reduce_644(val, _values, result); end
+  def _reduce_645(val, _values, result); end
+  def _reduce_646(val, _values, result); end
+  def _reduce_647(val, _values, result); end
+  def _reduce_648(val, _values, result); end
+  def _reduce_649(val, _values, result); end
+  def _reduce_650(val, _values, result); end
+  def _reduce_651(val, _values, result); end
+  def _reduce_652(val, _values, result); end
+  def _reduce_653(val, _values, result); end
+  def _reduce_656(val, _values, result); end
+  def _reduce_657(val, _values, result); end
+  def _reduce_658(val, _values, result); end
+  def _reduce_659(val, _values, result); end
+  def _reduce_66(val, _values, result); end
+  def _reduce_660(val, _values, result); end
+  def _reduce_661(val, _values, result); end
+  def _reduce_662(val, _values, result); end
+  def _reduce_663(val, _values, result); end
+  def _reduce_664(val, _values, result); end
+  def _reduce_667(val, _values, result); end
+  def _reduce_668(val, _values, result); end
+  def _reduce_67(val, _values, result); end
+  def _reduce_671(val, _values, result); end
+  def _reduce_672(val, _values, result); end
+  def _reduce_673(val, _values, result); end
+  def _reduce_675(val, _values, result); end
+  def _reduce_676(val, _values, result); end
+  def _reduce_678(val, _values, result); end
+  def _reduce_679(val, _values, result); end
+  def _reduce_68(val, _values, result); end
+  def _reduce_680(val, _values, result); end
+  def _reduce_681(val, _values, result); end
+  def _reduce_682(val, _values, result); end
+  def _reduce_683(val, _values, result); end
+  def _reduce_69(val, _values, result); end
+  def _reduce_696(val, _values, result); end
+  def _reduce_697(val, _values, result); end
+  def _reduce_7(val, _values, result); end
+  def _reduce_70(val, _values, result); end
+  def _reduce_702(val, _values, result); end
+  def _reduce_703(val, _values, result); end
+  def _reduce_704(val, _values, result); end
+  def _reduce_708(val, _values, result); end
+  def _reduce_71(val, _values, result); end
+  def _reduce_712(val, _values, result); end
+  def _reduce_72(val, _values, result); end
+  def _reduce_73(val, _values, result); end
+  def _reduce_74(val, _values, result); end
+  def _reduce_75(val, _values, result); end
+  def _reduce_76(val, _values, result); end
+  def _reduce_77(val, _values, result); end
+  def _reduce_78(val, _values, result); end
+  def _reduce_79(val, _values, result); end
+  def _reduce_80(val, _values, result); end
+  def _reduce_82(val, _values, result); end
+  def _reduce_83(val, _values, result); end
+  def _reduce_84(val, _values, result); end
+  def _reduce_85(val, _values, result); end
+  def _reduce_86(val, _values, result); end
+  def _reduce_87(val, _values, result); end
+  def _reduce_88(val, _values, result); end
+  def _reduce_89(val, _values, result); end
+  def _reduce_9(val, _values, result); end
+  def _reduce_90(val, _values, result); end
+  def _reduce_92(val, _values, result); end
+  def _reduce_93(val, _values, result); end
+  def _reduce_94(val, _values, result); end
+  def _reduce_95(val, _values, result); end
+  def _reduce_96(val, _values, result); end
+  def _reduce_97(val, _values, result); end
+  def _reduce_98(val, _values, result); end
+  def _reduce_99(val, _values, result); end
+  def _reduce_none(val, _values, result); end
+  def default_encoding; end
+  def version; end
+end
+class Parser::Ruby24 < Parser::Base
+  def _reduce_10(val, _values, result); end
+  def _reduce_100(val, _values, result); end
+  def _reduce_101(val, _values, result); end
+  def _reduce_102(val, _values, result); end
+  def _reduce_103(val, _values, result); end
+  def _reduce_104(val, _values, result); end
+  def _reduce_105(val, _values, result); end
+  def _reduce_106(val, _values, result); end
+  def _reduce_107(val, _values, result); end
+  def _reduce_108(val, _values, result); end
+  def _reduce_11(val, _values, result); end
+  def _reduce_110(val, _values, result); end
+  def _reduce_111(val, _values, result); end
+  def _reduce_112(val, _values, result); end
+  def _reduce_118(val, _values, result); end
+  def _reduce_12(val, _values, result); end
+  def _reduce_122(val, _values, result); end
+  def _reduce_123(val, _values, result); end
+  def _reduce_124(val, _values, result); end
+  def _reduce_13(val, _values, result); end
+  def _reduce_14(val, _values, result); end
+  def _reduce_16(val, _values, result); end
+  def _reduce_17(val, _values, result); end
+  def _reduce_18(val, _values, result); end
+  def _reduce_19(val, _values, result); end
+  def _reduce_196(val, _values, result); end
+  def _reduce_197(val, _values, result); end
+  def _reduce_198(val, _values, result); end
+  def _reduce_199(val, _values, result); end
+  def _reduce_2(val, _values, result); end
+  def _reduce_20(val, _values, result); end
+  def _reduce_200(val, _values, result); end
+  def _reduce_201(val, _values, result); end
+  def _reduce_202(val, _values, result); end
+  def _reduce_203(val, _values, result); end
+  def _reduce_204(val, _values, result); end
+  def _reduce_205(val, _values, result); end
+  def _reduce_206(val, _values, result); end
+  def _reduce_207(val, _values, result); end
+  def _reduce_208(val, _values, result); end
+  def _reduce_209(val, _values, result); end
+  def _reduce_21(val, _values, result); end
+  def _reduce_210(val, _values, result); end
+  def _reduce_211(val, _values, result); end
+  def _reduce_212(val, _values, result); end
+  def _reduce_213(val, _values, result); end
+  def _reduce_214(val, _values, result); end
+  def _reduce_215(val, _values, result); end
+  def _reduce_216(val, _values, result); end
+  def _reduce_217(val, _values, result); end
+  def _reduce_218(val, _values, result); end
+  def _reduce_219(val, _values, result); end
+  def _reduce_22(val, _values, result); end
+  def _reduce_220(val, _values, result); end
+  def _reduce_221(val, _values, result); end
+  def _reduce_222(val, _values, result); end
+  def _reduce_223(val, _values, result); end
+  def _reduce_224(val, _values, result); end
+  def _reduce_225(val, _values, result); end
+  def _reduce_226(val, _values, result); end
+  def _reduce_227(val, _values, result); end
+  def _reduce_228(val, _values, result); end
+  def _reduce_229(val, _values, result); end
+  def _reduce_23(val, _values, result); end
+  def _reduce_230(val, _values, result); end
+  def _reduce_231(val, _values, result); end
+  def _reduce_232(val, _values, result); end
+  def _reduce_233(val, _values, result); end
+  def _reduce_234(val, _values, result); end
+  def _reduce_235(val, _values, result); end
+  def _reduce_236(val, _values, result); end
+  def _reduce_24(val, _values, result); end
+  def _reduce_241(val, _values, result); end
+  def _reduce_242(val, _values, result); end
+  def _reduce_244(val, _values, result); end
+  def _reduce_245(val, _values, result); end
+  def _reduce_246(val, _values, result); end
+  def _reduce_248(val, _values, result); end
+  def _reduce_25(val, _values, result); end
+  def _reduce_251(val, _values, result); end
+  def _reduce_252(val, _values, result); end
+  def _reduce_253(val, _values, result); end
+  def _reduce_254(val, _values, result); end
+  def _reduce_255(val, _values, result); end
+  def _reduce_256(val, _values, result); end
+  def _reduce_257(val, _values, result); end
+  def _reduce_258(val, _values, result); end
+  def _reduce_259(val, _values, result); end
+  def _reduce_26(val, _values, result); end
+  def _reduce_260(val, _values, result); end
+  def _reduce_261(val, _values, result); end
+  def _reduce_262(val, _values, result); end
+  def _reduce_263(val, _values, result); end
+  def _reduce_264(val, _values, result); end
+  def _reduce_265(val, _values, result); end
+  def _reduce_266(val, _values, result); end
+  def _reduce_267(val, _values, result); end
+  def _reduce_269(val, _values, result); end
+  def _reduce_27(val, _values, result); end
+  def _reduce_270(val, _values, result); end
+  def _reduce_271(val, _values, result); end
+  def _reduce_28(val, _values, result); end
+  def _reduce_282(val, _values, result); end
+  def _reduce_283(val, _values, result); end
+  def _reduce_284(val, _values, result); end
+  def _reduce_285(val, _values, result); end
+  def _reduce_286(val, _values, result); end
+  def _reduce_287(val, _values, result); end
+  def _reduce_288(val, _values, result); end
+  def _reduce_289(val, _values, result); end
+  def _reduce_290(val, _values, result); end
+  def _reduce_291(val, _values, result); end
+  def _reduce_292(val, _values, result); end
+  def _reduce_293(val, _values, result); end
+  def _reduce_294(val, _values, result); end
+  def _reduce_295(val, _values, result); end
+  def _reduce_296(val, _values, result); end
+  def _reduce_297(val, _values, result); end
+  def _reduce_298(val, _values, result); end
+  def _reduce_299(val, _values, result); end
+  def _reduce_3(val, _values, result); end
+  def _reduce_30(val, _values, result); end
+  def _reduce_300(val, _values, result); end
+  def _reduce_301(val, _values, result); end
+  def _reduce_303(val, _values, result); end
+  def _reduce_304(val, _values, result); end
+  def _reduce_305(val, _values, result); end
+  def _reduce_306(val, _values, result); end
+  def _reduce_307(val, _values, result); end
+  def _reduce_308(val, _values, result); end
+  def _reduce_309(val, _values, result); end
+  def _reduce_31(val, _values, result); end
+  def _reduce_310(val, _values, result); end
+  def _reduce_311(val, _values, result); end
+  def _reduce_312(val, _values, result); end
+  def _reduce_313(val, _values, result); end
+  def _reduce_314(val, _values, result); end
+  def _reduce_315(val, _values, result); end
+  def _reduce_316(val, _values, result); end
+  def _reduce_317(val, _values, result); end
+  def _reduce_318(val, _values, result); end
+  def _reduce_319(val, _values, result); end
+  def _reduce_32(val, _values, result); end
+  def _reduce_320(val, _values, result); end
+  def _reduce_321(val, _values, result); end
+  def _reduce_322(val, _values, result); end
+  def _reduce_323(val, _values, result); end
+  def _reduce_324(val, _values, result); end
+  def _reduce_325(val, _values, result); end
+  def _reduce_326(val, _values, result); end
+  def _reduce_327(val, _values, result); end
+  def _reduce_328(val, _values, result); end
+  def _reduce_329(val, _values, result); end
+  def _reduce_330(val, _values, result); end
+  def _reduce_331(val, _values, result); end
+  def _reduce_332(val, _values, result); end
+  def _reduce_333(val, _values, result); end
+  def _reduce_337(val, _values, result); end
+  def _reduce_34(val, _values, result); end
+  def _reduce_341(val, _values, result); end
+  def _reduce_343(val, _values, result); end
+  def _reduce_346(val, _values, result); end
+  def _reduce_347(val, _values, result); end
+  def _reduce_348(val, _values, result); end
+  def _reduce_349(val, _values, result); end
+  def _reduce_35(val, _values, result); end
+  def _reduce_351(val, _values, result); end
+  def _reduce_352(val, _values, result); end
+  def _reduce_353(val, _values, result); end
+  def _reduce_354(val, _values, result); end
+  def _reduce_355(val, _values, result); end
+  def _reduce_356(val, _values, result); end
+  def _reduce_357(val, _values, result); end
+  def _reduce_358(val, _values, result); end
+  def _reduce_359(val, _values, result); end
+  def _reduce_36(val, _values, result); end
+  def _reduce_360(val, _values, result); end
+  def _reduce_361(val, _values, result); end
+  def _reduce_362(val, _values, result); end
+  def _reduce_363(val, _values, result); end
+  def _reduce_364(val, _values, result); end
+  def _reduce_365(val, _values, result); end
+  def _reduce_366(val, _values, result); end
+  def _reduce_367(val, _values, result); end
+  def _reduce_368(val, _values, result); end
+  def _reduce_369(val, _values, result); end
+  def _reduce_37(val, _values, result); end
+  def _reduce_371(val, _values, result); end
+  def _reduce_372(val, _values, result); end
+  def _reduce_373(val, _values, result); end
+  def _reduce_374(val, _values, result); end
+  def _reduce_375(val, _values, result); end
+  def _reduce_376(val, _values, result); end
+  def _reduce_377(val, _values, result); end
+  def _reduce_378(val, _values, result); end
+  def _reduce_38(val, _values, result); end
+  def _reduce_380(val, _values, result); end
+  def _reduce_381(val, _values, result); end
+  def _reduce_382(val, _values, result); end
+  def _reduce_383(val, _values, result); end
+  def _reduce_384(val, _values, result); end
+  def _reduce_385(val, _values, result); end
+  def _reduce_386(val, _values, result); end
+  def _reduce_387(val, _values, result); end
+  def _reduce_388(val, _values, result); end
+  def _reduce_389(val, _values, result); end
+  def _reduce_39(val, _values, result); end
+  def _reduce_391(val, _values, result); end
+  def _reduce_392(val, _values, result); end
+  def _reduce_393(val, _values, result); end
+  def _reduce_394(val, _values, result); end
+  def _reduce_395(val, _values, result); end
+  def _reduce_396(val, _values, result); end
+  def _reduce_397(val, _values, result); end
+  def _reduce_398(val, _values, result); end
+  def _reduce_399(val, _values, result); end
+  def _reduce_4(val, _values, result); end
+  def _reduce_40(val, _values, result); end
+  def _reduce_400(val, _values, result); end
+  def _reduce_401(val, _values, result); end
+  def _reduce_402(val, _values, result); end
+  def _reduce_403(val, _values, result); end
+  def _reduce_404(val, _values, result); end
+  def _reduce_405(val, _values, result); end
+  def _reduce_406(val, _values, result); end
+  def _reduce_407(val, _values, result); end
+  def _reduce_408(val, _values, result); end
+  def _reduce_409(val, _values, result); end
+  def _reduce_41(val, _values, result); end
+  def _reduce_410(val, _values, result); end
+  def _reduce_411(val, _values, result); end
+  def _reduce_412(val, _values, result); end
+  def _reduce_413(val, _values, result); end
+  def _reduce_414(val, _values, result); end
+  def _reduce_415(val, _values, result); end
+  def _reduce_416(val, _values, result); end
+  def _reduce_417(val, _values, result); end
+  def _reduce_418(val, _values, result); end
+  def _reduce_419(val, _values, result); end
+  def _reduce_420(val, _values, result); end
+  def _reduce_421(val, _values, result); end
+  def _reduce_422(val, _values, result); end
+  def _reduce_423(val, _values, result); end
+  def _reduce_424(val, _values, result); end
+  def _reduce_425(val, _values, result); end
+  def _reduce_427(val, _values, result); end
+  def _reduce_428(val, _values, result); end
+  def _reduce_429(val, _values, result); end
+  def _reduce_43(val, _values, result); end
+  def _reduce_432(val, _values, result); end
+  def _reduce_434(val, _values, result); end
+  def _reduce_439(val, _values, result); end
+  def _reduce_440(val, _values, result); end
+  def _reduce_441(val, _values, result); end
+  def _reduce_442(val, _values, result); end
+  def _reduce_443(val, _values, result); end
+  def _reduce_444(val, _values, result); end
+  def _reduce_445(val, _values, result); end
+  def _reduce_446(val, _values, result); end
+  def _reduce_447(val, _values, result); end
+  def _reduce_448(val, _values, result); end
+  def _reduce_449(val, _values, result); end
+  def _reduce_450(val, _values, result); end
+  def _reduce_451(val, _values, result); end
+  def _reduce_452(val, _values, result); end
+  def _reduce_453(val, _values, result); end
+  def _reduce_454(val, _values, result); end
+  def _reduce_455(val, _values, result); end
+  def _reduce_456(val, _values, result); end
+  def _reduce_457(val, _values, result); end
+  def _reduce_458(val, _values, result); end
+  def _reduce_459(val, _values, result); end
+  def _reduce_46(val, _values, result); end
+  def _reduce_460(val, _values, result); end
+  def _reduce_461(val, _values, result); end
+  def _reduce_462(val, _values, result); end
+  def _reduce_463(val, _values, result); end
+  def _reduce_464(val, _values, result); end
+  def _reduce_465(val, _values, result); end
+  def _reduce_466(val, _values, result); end
+  def _reduce_467(val, _values, result); end
+  def _reduce_468(val, _values, result); end
+  def _reduce_469(val, _values, result); end
+  def _reduce_47(val, _values, result); end
+  def _reduce_470(val, _values, result); end
+  def _reduce_471(val, _values, result); end
+  def _reduce_472(val, _values, result); end
+  def _reduce_473(val, _values, result); end
+  def _reduce_475(val, _values, result); end
+  def _reduce_476(val, _values, result); end
+  def _reduce_477(val, _values, result); end
+  def _reduce_478(val, _values, result); end
+  def _reduce_479(val, _values, result); end
+  def _reduce_48(val, _values, result); end
+  def _reduce_480(val, _values, result); end
+  def _reduce_481(val, _values, result); end
+  def _reduce_482(val, _values, result); end
+  def _reduce_483(val, _values, result); end
+  def _reduce_484(val, _values, result); end
+  def _reduce_485(val, _values, result); end
+  def _reduce_486(val, _values, result); end
+  def _reduce_487(val, _values, result); end
+  def _reduce_488(val, _values, result); end
+  def _reduce_489(val, _values, result); end
+  def _reduce_49(val, _values, result); end
+  def _reduce_490(val, _values, result); end
+  def _reduce_491(val, _values, result); end
+  def _reduce_492(val, _values, result); end
+  def _reduce_493(val, _values, result); end
+  def _reduce_494(val, _values, result); end
+  def _reduce_495(val, _values, result); end
+  def _reduce_496(val, _values, result); end
+  def _reduce_497(val, _values, result); end
+  def _reduce_498(val, _values, result); end
+  def _reduce_499(val, _values, result); end
+  def _reduce_5(val, _values, result); end
+  def _reduce_500(val, _values, result); end
+  def _reduce_501(val, _values, result); end
+  def _reduce_502(val, _values, result); end
+  def _reduce_503(val, _values, result); end
+  def _reduce_504(val, _values, result); end
+  def _reduce_505(val, _values, result); end
+  def _reduce_506(val, _values, result); end
+  def _reduce_507(val, _values, result); end
+  def _reduce_508(val, _values, result); end
+  def _reduce_509(val, _values, result); end
+  def _reduce_510(val, _values, result); end
+  def _reduce_511(val, _values, result); end
+  def _reduce_512(val, _values, result); end
+  def _reduce_513(val, _values, result); end
+  def _reduce_514(val, _values, result); end
+  def _reduce_515(val, _values, result); end
+  def _reduce_516(val, _values, result); end
+  def _reduce_517(val, _values, result); end
+  def _reduce_518(val, _values, result); end
+  def _reduce_519(val, _values, result); end
+  def _reduce_520(val, _values, result); end
+  def _reduce_521(val, _values, result); end
+  def _reduce_522(val, _values, result); end
+  def _reduce_523(val, _values, result); end
+  def _reduce_524(val, _values, result); end
+  def _reduce_525(val, _values, result); end
+  def _reduce_526(val, _values, result); end
+  def _reduce_527(val, _values, result); end
+  def _reduce_528(val, _values, result); end
+  def _reduce_529(val, _values, result); end
+  def _reduce_530(val, _values, result); end
+  def _reduce_531(val, _values, result); end
+  def _reduce_533(val, _values, result); end
+  def _reduce_534(val, _values, result); end
+  def _reduce_535(val, _values, result); end
+  def _reduce_536(val, _values, result); end
+  def _reduce_537(val, _values, result); end
+  def _reduce_538(val, _values, result); end
+  def _reduce_539(val, _values, result); end
+  def _reduce_540(val, _values, result); end
+  def _reduce_541(val, _values, result); end
+  def _reduce_542(val, _values, result); end
+  def _reduce_543(val, _values, result); end
+  def _reduce_544(val, _values, result); end
+  def _reduce_545(val, _values, result); end
+  def _reduce_546(val, _values, result); end
+  def _reduce_547(val, _values, result); end
+  def _reduce_55(val, _values, result); end
+  def _reduce_550(val, _values, result); end
+  def _reduce_551(val, _values, result); end
+  def _reduce_552(val, _values, result); end
+  def _reduce_553(val, _values, result); end
+  def _reduce_554(val, _values, result); end
+  def _reduce_555(val, _values, result); end
+  def _reduce_556(val, _values, result); end
+  def _reduce_557(val, _values, result); end
+  def _reduce_56(val, _values, result); end
+  def _reduce_560(val, _values, result); end
+  def _reduce_561(val, _values, result); end
+  def _reduce_564(val, _values, result); end
+  def _reduce_565(val, _values, result); end
+  def _reduce_566(val, _values, result); end
+  def _reduce_568(val, _values, result); end
+  def _reduce_569(val, _values, result); end
+  def _reduce_57(val, _values, result); end
+  def _reduce_571(val, _values, result); end
+  def _reduce_572(val, _values, result); end
+  def _reduce_573(val, _values, result); end
+  def _reduce_574(val, _values, result); end
+  def _reduce_575(val, _values, result); end
+  def _reduce_576(val, _values, result); end
+  def _reduce_589(val, _values, result); end
+  def _reduce_59(val, _values, result); end
+  def _reduce_590(val, _values, result); end
+  def _reduce_595(val, _values, result); end
+  def _reduce_596(val, _values, result); end
+  def _reduce_6(val, _values, result); end
+  def _reduce_60(val, _values, result); end
+  def _reduce_600(val, _values, result); end
+  def _reduce_604(val, _values, result); end
+  def _reduce_61(val, _values, result); end
+  def _reduce_62(val, _values, result); end
+  def _reduce_63(val, _values, result); end
+  def _reduce_64(val, _values, result); end
+  def _reduce_65(val, _values, result); end
+  def _reduce_66(val, _values, result); end
+  def _reduce_67(val, _values, result); end
+  def _reduce_68(val, _values, result); end
+  def _reduce_69(val, _values, result); end
+  def _reduce_70(val, _values, result); end
+  def _reduce_71(val, _values, result); end
+  def _reduce_72(val, _values, result); end
+  def _reduce_73(val, _values, result); end
+  def _reduce_75(val, _values, result); end
+  def _reduce_76(val, _values, result); end
+  def _reduce_77(val, _values, result); end
+  def _reduce_78(val, _values, result); end
+  def _reduce_79(val, _values, result); end
+  def _reduce_8(val, _values, result); end
+  def _reduce_80(val, _values, result); end
+  def _reduce_81(val, _values, result); end
+  def _reduce_82(val, _values, result); end
+  def _reduce_83(val, _values, result); end
+  def _reduce_85(val, _values, result); end
+  def _reduce_86(val, _values, result); end
+  def _reduce_87(val, _values, result); end
+  def _reduce_88(val, _values, result); end
+  def _reduce_89(val, _values, result); end
+  def _reduce_9(val, _values, result); end
+  def _reduce_90(val, _values, result); end
+  def _reduce_91(val, _values, result); end
+  def _reduce_92(val, _values, result); end
+  def _reduce_93(val, _values, result); end
+  def _reduce_94(val, _values, result); end
+  def _reduce_95(val, _values, result); end
+  def _reduce_96(val, _values, result); end
+  def _reduce_97(val, _values, result); end
+  def _reduce_98(val, _values, result); end
+  def _reduce_99(val, _values, result); end
+  def _reduce_none(val, _values, result); end
+  def default_encoding; end
+  def version; end
+end
diff --git a/sorbet/rbi/gems/pry.rbi b/sorbet/rbi/gems/pry.rbi
new file mode 100644
index 0000000..cc7c02f
--- /dev/null
+++ b/sorbet/rbi/gems/pry.rbi
@@ -0,0 +1,1898 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/pry/all/pry.rbi
+#
+# pry-0.14.1
+
+class Pry
+  def add_sticky_local(name, &block); end
+  def backtrace; end
+  def backtrace=(arg0); end
+  def binding_stack; end
+  def binding_stack=(arg0); end
+  def color(*args, &block); end
+  def color=(*args, &block); end
+  def commands(*args, &block); end
+  def commands=(*args, &block); end
+  def complete(str); end
+  def config; end
+  def current_binding; end
+  def current_context; end
+  def custom_completions; end
+  def custom_completions=(arg0); end
+  def editor(*args, &block); end
+  def editor=(*args, &block); end
+  def ensure_correct_encoding!(val); end
+  def eval(line, options = nil); end
+  def eval_string; end
+  def eval_string=(arg0); end
+  def evaluate_ruby(code); end
+  def exception_handler(*args, &block); end
+  def exception_handler=(*args, &block); end
+  def exec_hook(name, *args, &block); end
+  def exit_value; end
+  def extra_sticky_locals(*args, &block); end
+  def extra_sticky_locals=(*args, &block); end
+  def generate_prompt(prompt_proc, conf); end
+  def handle_line(line, options); end
+  def hooks(*args, &block); end
+  def hooks=(*args, &block); end
+  def initialize(options = nil); end
+  def inject_local(name, value, binding); end
+  def inject_sticky_locals!; end
+  def input(*args, &block); end
+  def input=(*args, &block); end
+  def input_ring; end
+  def last_dir; end
+  def last_dir=(arg0); end
+  def last_exception; end
+  def last_exception=(exception); end
+  def last_file; end
+  def last_file=(arg0); end
+  def last_result; end
+  def last_result=(arg0); end
+  def last_result_is_exception?; end
+  def memory_size; end
+  def memory_size=(size); end
+  def output; end
+  def output=(*args, &block); end
+  def output_ring; end
+  def pager; end
+  def pager=(*args, &block); end
+  def pop_prompt; end
+  def print(*args, &block); end
+  def print=(*args, &block); end
+  def process_command(val); end
+  def process_command_safely(val); end
+  def prompt; end
+  def prompt=(new_prompt); end
+  def prompt_stack; end
+  def push_binding(object); end
+  def push_initial_binding(target = nil); end
+  def push_prompt(new_prompt); end
+  def quiet?; end
+  def raise_up!(*args); end
+  def raise_up(*args); end
+  def raise_up_common(force, *args); end
+  def repl(target = nil); end
+  def reset_eval_string; end
+  def run_command(val); end
+  def select_prompt; end
+  def self.Code(obj); end
+  def self.Method(obj); end
+  def self.WrappedModule(obj); end
+  def self.auto_resize!; end
+  def self.binding_for(target); end
+  def self.cli; end
+  def self.cli=(arg0); end
+  def self.color(*args, &block); end
+  def self.color=(*args, &block); end
+  def self.commands(*args, &block); end
+  def self.commands=(*args, &block); end
+  def self.config; end
+  def self.config=(arg0); end
+  def self.configure; end
+  def self.critical_section; end
+  def self.current; end
+  def self.current_line; end
+  def self.current_line=(arg0); end
+  def self.custom_completions; end
+  def self.custom_completions=(arg0); end
+  def self.editor(*args, &block); end
+  def self.editor=(*args, &block); end
+  def self.eval_path; end
+  def self.eval_path=(arg0); end
+  def self.exception_handler(*args, &block); end
+  def self.exception_handler=(*args, &block); end
+  def self.extra_sticky_locals(*args, &block); end
+  def self.extra_sticky_locals=(*args, &block); end
+  def self.final_session_setup; end
+  def self.history(*args, &block); end
+  def self.history=(*args, &block); end
+  def self.hooks(*args, &block); end
+  def self.hooks=(*args, &block); end
+  def self.in_critical_section?; end
+  def self.init; end
+  def self.initial_session?; end
+  def self.initial_session_setup; end
+  def self.input(*args, &block); end
+  def self.input=(*args, &block); end
+  def self.last_internal_error; end
+  def self.last_internal_error=(arg0); end
+  def self.line_buffer; end
+  def self.line_buffer=(arg0); end
+  def self.load_file_at_toplevel(file); end
+  def self.load_file_through_repl(file_name); end
+  def self.load_history; end
+  def self.load_rc_files; end
+  def self.load_requires; end
+  def self.load_traps; end
+  def self.load_win32console; end
+  def self.main; end
+  def self.memory_size(*args, &block); end
+  def self.memory_size=(*args, &block); end
+  def self.output(*args, &block); end
+  def self.output=(*args, &block); end
+  def self.pager(*args, &block); end
+  def self.pager=(*args, &block); end
+  def self.print(*args, &block); end
+  def self.print=(*args, &block); end
+  def self.prompt(*args, &block); end
+  def self.prompt=(*args, &block); end
+  def self.quiet; end
+  def self.quiet=(arg0); end
+  def self.rc_files_to_load; end
+  def self.real_path_to(file); end
+  def self.reset_defaults; end
+  def self.run_command(command_string, options = nil); end
+  def self.start(target = nil, options = nil); end
+  def self.toplevel_binding; end
+  def self.toplevel_binding=(arg0); end
+  def self.view_clip(obj, options = nil); end
+  def set_last_result(result, code = nil); end
+  def should_print?; end
+  def show_result(result); end
+  def sticky_locals; end
+  def suppress_output; end
+  def suppress_output=(arg0); end
+  def update_input_history(code); end
+  extend Pry::Forwardable
+end
+class Pry::LastException < BasicObject
+  def bt_index; end
+  def bt_index=(arg0); end
+  def bt_source_location_for(index); end
+  def file; end
+  def inc_bt_index; end
+  def initialize(exception); end
+  def line; end
+  def method_missing(name, *args, &block); end
+  def respond_to_missing?(name, include_all = nil); end
+  def wrapped_exception; end
+end
+module Pry::Forwardable
+  def def_private_delegators(target, *private_delegates); end
+  include Forwardable
+end
+module Pry::Helpers
+  def self.tablify(things, line_length, pry_instance = nil); end
+  def self.tablify_or_one_line(heading, things, pry_instance = nil); end
+  def self.tablify_to_screen_width(things, options, pry_instance = nil); end
+end
+module Pry::Helpers::BaseHelpers
+  def colorize_code(code); end
+  def find_command(name, set = nil); end
+  def heading(text); end
+  def highlight(string, regexp, highlight_color = nil); end
+  def not_a_real_file?(file); end
+  def safe_send(obj, method, *args, &block); end
+  def silence_warnings; end
+  def stagger_output(text, _out = nil); end
+  def use_ansi_codes?; end
+  extend Pry::Helpers::BaseHelpers
+end
+module Pry::Helpers::DocumentationHelpers
+  def get_comment_content(comment); end
+  def process_comment_markup(comment); end
+  def process_rdoc(comment); end
+  def process_yardoc(comment); end
+  def process_yardoc_tag(comment, tag); end
+  def self.get_comment_content(comment); end
+  def self.process_comment_markup(comment); end
+  def self.process_rdoc(comment); end
+  def self.process_yardoc(comment); end
+  def self.process_yardoc_tag(comment, tag); end
+  def self.strip_comments_from_c_code(code); end
+  def self.strip_leading_whitespace(text); end
+  def strip_comments_from_c_code(code); end
+  def strip_leading_whitespace(text); end
+end
+module Pry::Helpers::OptionsHelpers
+  def method_object; end
+  def method_options(opt); end
+  def self.method_object; end
+  def self.method_options(opt); end
+end
+module Pry::Helpers::CommandHelpers
+  def absolute_index_number(line_number, array_length); end
+  def absolute_index_range(range_or_number, array_length); end
+  def get_method_or_raise(method_name, context, opts = nil); end
+  def internal_binding?(context); end
+  def one_index_number(line_number); end
+  def one_index_range(range); end
+  def one_index_range_or_number(range_or_number); end
+  def restrict_to_lines(content, lines); end
+  def set_file_and_dir_locals(file_name, pry = nil, ctx = nil); end
+  def temp_file(ext = nil); end
+  def unindent(dirty_text, left_padding = nil); end
+  extend Pry::Helpers::CommandHelpers
+  include Pry::Helpers::OptionsHelpers
+end
+module Pry::Helpers::Text
+  def black(text); end
+  def black_on_black(text); end
+  def black_on_blue(text); end
+  def black_on_cyan(text); end
+  def black_on_green(text); end
+  def black_on_magenta(text); end
+  def black_on_purple(text); end
+  def black_on_red(text); end
+  def black_on_white(text); end
+  def black_on_yellow(text); end
+  def blue(text); end
+  def blue_on_black(text); end
+  def blue_on_blue(text); end
+  def blue_on_cyan(text); end
+  def blue_on_green(text); end
+  def blue_on_magenta(text); end
+  def blue_on_purple(text); end
+  def blue_on_red(text); end
+  def blue_on_white(text); end
+  def blue_on_yellow(text); end
+  def bold(text); end
+  def bright_black(text); end
+  def bright_black_on_black(text); end
+  def bright_black_on_blue(text); end
+  def bright_black_on_cyan(text); end
+  def bright_black_on_green(text); end
+  def bright_black_on_magenta(text); end
+  def bright_black_on_purple(text); end
+  def bright_black_on_red(text); end
+  def bright_black_on_white(text); end
+  def bright_black_on_yellow(text); end
+  def bright_blue(text); end
+  def bright_blue_on_black(text); end
+  def bright_blue_on_blue(text); end
+  def bright_blue_on_cyan(text); end
+  def bright_blue_on_green(text); end
+  def bright_blue_on_magenta(text); end
+  def bright_blue_on_purple(text); end
+  def bright_blue_on_red(text); end
+  def bright_blue_on_white(text); end
+  def bright_blue_on_yellow(text); end
+  def bright_cyan(text); end
+  def bright_cyan_on_black(text); end
+  def bright_cyan_on_blue(text); end
+  def bright_cyan_on_cyan(text); end
+  def bright_cyan_on_green(text); end
+  def bright_cyan_on_magenta(text); end
+  def bright_cyan_on_purple(text); end
+  def bright_cyan_on_red(text); end
+  def bright_cyan_on_white(text); end
+  def bright_cyan_on_yellow(text); end
+  def bright_green(text); end
+  def bright_green_on_black(text); end
+  def bright_green_on_blue(text); end
+  def bright_green_on_cyan(text); end
+  def bright_green_on_green(text); end
+  def bright_green_on_magenta(text); end
+  def bright_green_on_purple(text); end
+  def bright_green_on_red(text); end
+  def bright_green_on_white(text); end
+  def bright_green_on_yellow(text); end
+  def bright_magenta(text); end
+  def bright_magenta_on_black(text); end
+  def bright_magenta_on_blue(text); end
+  def bright_magenta_on_cyan(text); end
+  def bright_magenta_on_green(text); end
+  def bright_magenta_on_magenta(text); end
+  def bright_magenta_on_purple(text); end
+  def bright_magenta_on_red(text); end
+  def bright_magenta_on_white(text); end
+  def bright_magenta_on_yellow(text); end
+  def bright_purple(text); end
+  def bright_purple_on_black(text); end
+  def bright_purple_on_blue(text); end
+  def bright_purple_on_cyan(text); end
+  def bright_purple_on_green(text); end
+  def bright_purple_on_magenta(text); end
+  def bright_purple_on_purple(text); end
+  def bright_purple_on_red(text); end
+  def bright_purple_on_white(text); end
+  def bright_purple_on_yellow(text); end
+  def bright_red(text); end
+  def bright_red_on_black(text); end
+  def bright_red_on_blue(text); end
+  def bright_red_on_cyan(text); end
+  def bright_red_on_green(text); end
+  def bright_red_on_magenta(text); end
+  def bright_red_on_purple(text); end
+  def bright_red_on_red(text); end
+  def bright_red_on_white(text); end
+  def bright_red_on_yellow(text); end
+  def bright_white(text); end
+  def bright_white_on_black(text); end
+  def bright_white_on_blue(text); end
+  def bright_white_on_cyan(text); end
+  def bright_white_on_green(text); end
+  def bright_white_on_magenta(text); end
+  def bright_white_on_purple(text); end
+  def bright_white_on_red(text); end
+  def bright_white_on_white(text); end
+  def bright_white_on_yellow(text); end
+  def bright_yellow(text); end
+  def bright_yellow_on_black(text); end
+  def bright_yellow_on_blue(text); end
+  def bright_yellow_on_cyan(text); end
+  def bright_yellow_on_green(text); end
+  def bright_yellow_on_magenta(text); end
+  def bright_yellow_on_purple(text); end
+  def bright_yellow_on_red(text); end
+  def bright_yellow_on_white(text); end
+  def bright_yellow_on_yellow(text); end
+  def cyan(text); end
+  def cyan_on_black(text); end
+  def cyan_on_blue(text); end
+  def cyan_on_cyan(text); end
+  def cyan_on_green(text); end
+  def cyan_on_magenta(text); end
+  def cyan_on_purple(text); end
+  def cyan_on_red(text); end
+  def cyan_on_white(text); end
+  def cyan_on_yellow(text); end
+  def default(text); end
+  def green(text); end
+  def green_on_black(text); end
+  def green_on_blue(text); end
+  def green_on_cyan(text); end
+  def green_on_green(text); end
+  def green_on_magenta(text); end
+  def green_on_purple(text); end
+  def green_on_red(text); end
+  def green_on_white(text); end
+  def green_on_yellow(text); end
+  def indent(text, chars); end
+  def magenta(text); end
+  def magenta_on_black(text); end
+  def magenta_on_blue(text); end
+  def magenta_on_cyan(text); end
+  def magenta_on_green(text); end
+  def magenta_on_magenta(text); end
+  def magenta_on_purple(text); end
+  def magenta_on_red(text); end
+  def magenta_on_white(text); end
+  def magenta_on_yellow(text); end
+  def no_color; end
+  def no_pager; end
+  def purple(text); end
+  def purple_on_black(text); end
+  def purple_on_blue(text); end
+  def purple_on_cyan(text); end
+  def purple_on_green(text); end
+  def purple_on_magenta(text); end
+  def purple_on_purple(text); end
+  def purple_on_red(text); end
+  def purple_on_white(text); end
+  def purple_on_yellow(text); end
+  def red(text); end
+  def red_on_black(text); end
+  def red_on_blue(text); end
+  def red_on_cyan(text); end
+  def red_on_green(text); end
+  def red_on_magenta(text); end
+  def red_on_purple(text); end
+  def red_on_red(text); end
+  def red_on_white(text); end
+  def red_on_yellow(text); end
+  def strip_color(text); end
+  def white(text); end
+  def white_on_black(text); end
+  def white_on_blue(text); end
+  def white_on_cyan(text); end
+  def white_on_green(text); end
+  def white_on_magenta(text); end
+  def white_on_purple(text); end
+  def white_on_red(text); end
+  def white_on_white(text); end
+  def white_on_yellow(text); end
+  def with_line_numbers(text, offset, color = nil); end
+  def yellow(text); end
+  def yellow_on_black(text); end
+  def yellow_on_blue(text); end
+  def yellow_on_cyan(text); end
+  def yellow_on_green(text); end
+  def yellow_on_magenta(text); end
+  def yellow_on_purple(text); end
+  def yellow_on_red(text); end
+  def yellow_on_white(text); end
+  def yellow_on_yellow(text); end
+  extend Pry::Helpers::Text
+end
+class Pry::Helpers::Table
+  def ==(other); end
+  def _max_width(things); end
+  def _rebuild_colorless_cache; end
+  def _recall_color_for(thing); end
+  def _recolumn; end
+  def column_count; end
+  def column_count=(count); end
+  def columns; end
+  def fits_on_line?(line_length); end
+  def initialize(items, args, pry_instance = nil); end
+  def items; end
+  def items=(items); end
+  def rows_to_s(style = nil); end
+  def to_a; end
+  def to_s; end
+end
+module Pry::Helpers::Platform
+  def self.jruby?; end
+  def self.jruby_19?; end
+  def self.linux?; end
+  def self.mac_osx?; end
+  def self.mri?; end
+  def self.mri_19?; end
+  def self.mri_2?; end
+  def self.windows?; end
+  def self.windows_ansi?; end
+end
+class Pry::BasicObject < BasicObject
+  include Kernel
+end
+class Pry::Prompt
+  def [](key); end
+  def description; end
+  def incomplete_proc; end
+  def initialize(name, description, prompt_procs); end
+  def name; end
+  def prompt_procs; end
+  def self.[](name); end
+  def self.add(name, description = nil, separators = nil); end
+  def self.all; end
+  def wait_proc; end
+end
+class Pry::CodeObject
+  def command_lookup; end
+  def default_lookup; end
+  def empty_lookup; end
+  def initialize(str, pry_instance, options = nil); end
+  def looks_like_an_instance_method?(str); end
+  def lookup_super(obj, super_level); end
+  def method_or_class_lookup; end
+  def pry_instance; end
+  def pry_instance=(arg0); end
+  def safe_to_evaluate?(str); end
+  def self.lookup(str, pry_instance, options = nil); end
+  def sourcable_object?(obj); end
+  def str; end
+  def str=(arg0); end
+  def super_level; end
+  def super_level=(arg0); end
+  def target; end
+  def target=(arg0); end
+  def target_self; end
+  include Pry::Helpers::CommandHelpers
+end
+module Pry::CodeObject::Helpers
+  def c_method?; end
+  def c_module?; end
+  def command?; end
+  def module_with_yard_docs?; end
+  def real_method_object?; end
+end
+module Pry::RescuableException
+  def self.===(exception); end
+end
+module Pry::TooSafeException
+  def self.===(exception); end
+end
+module Pry::UserError
+end
+module Pry::FrozenObjectException
+  def self.===(exception); end
+end
+class Pry::CommandError < StandardError
+end
+class Pry::MethodNotFound < Pry::CommandError
+end
+class Pry::ObsoleteError < StandardError
+end
+class Pry::Hooks
+  def add_hook(event_name, hook_name, callable = nil, &block); end
+  def clear_event_hooks(event_name); end
+  def delete_hook(event_name, hook_name); end
+  def errors; end
+  def exec_hook(event_name, *args, &block); end
+  def get_hook(event_name, hook_name); end
+  def get_hooks(event_name); end
+  def hook_count(event_name); end
+  def hook_exists?(event_name, hook_name); end
+  def hooks; end
+  def initialize; end
+  def initialize_copy(_orig); end
+  def merge!(other); end
+  def merge(other); end
+  def self.default; end
+end
+class Pry::InputCompleter
+  def build_path(input); end
+  def call(str, options = nil); end
+  def ignored_modules; end
+  def initialize(input, pry = nil); end
+  def select_message(path, receiver, message, candidates); end
+end
+class Pry::Command
+  def _pry_; end
+  def _pry_=(arg0); end
+  def after_hooks; end
+  def arg_string; end
+  def arg_string=(arg0); end
+  def before_hooks; end
+  def block; end
+  def call_safely(*args); end
+  def call_with_hooks(*args); end
+  def captures; end
+  def captures=(arg0); end
+  def check_for_command_collision(command_match, arg_string); end
+  def command_block; end
+  def command_block=(arg0); end
+  def command_name; end
+  def command_options; end
+  def command_set; end
+  def command_set=(arg0); end
+  def commands; end
+  def complete(_search); end
+  def context; end
+  def context=(arg0); end
+  def description; end
+  def eval_string; end
+  def eval_string=(arg0); end
+  def find_hooks(event); end
+  def hooks; end
+  def hooks=(arg0); end
+  def initialize(context = nil); end
+  def interpolate_string(str); end
+  def match; end
+  def name; end
+  def normalize_method_args(method, args); end
+  def output; end
+  def output=(arg0); end
+  def pass_block(arg_string); end
+  def process_line(line); end
+  def pry_instance; end
+  def pry_instance=(arg0); end
+  def run(command_string, *args); end
+  def self.banner(arg = nil); end
+  def self.block; end
+  def self.block=(arg0); end
+  def self.command_name; end
+  def self.command_options(arg = nil); end
+  def self.command_options=(arg0); end
+  def self.command_regex; end
+  def self.convert_to_regex(obj); end
+  def self.default_options(match); end
+  def self.description(arg = nil); end
+  def self.description=(arg0); end
+  def self.doc; end
+  def self.file; end
+  def self.group(name = nil); end
+  def self.inspect; end
+  def self.line; end
+  def self.match(arg = nil); end
+  def self.match=(arg0); end
+  def self.match_score(val); end
+  def self.matches?(val); end
+  def self.name; end
+  def self.options(arg = nil); end
+  def self.options=(arg0); end
+  def self.source; end
+  def self.source_file; end
+  def self.source_line; end
+  def self.state; end
+  def self.subclass(match, description, options, helpers, &block); end
+  def source; end
+  def state; end
+  def target; end
+  def target=(arg0); end
+  def target_self; end
+  def tokenize(val); end
+  def use_unpatched_symbol; end
+  def void; end
+  extend Pry::CodeObject::Helpers
+  extend Pry::Helpers::DocumentationHelpers
+  include Pry::Helpers::BaseHelpers
+  include Pry::Helpers::CommandHelpers
+  include Pry::Helpers::Text
+end
+class Pry::ClassCommand < Pry::Command
+  def args; end
+  def args=(arg0); end
+  def call(*args); end
+  def complete(search); end
+  def help; end
+  def options(opt); end
+  def opts; end
+  def opts=(arg0); end
+  def process; end
+  def self.doc; end
+  def self.file; end
+  def self.inherited(klass); end
+  def self.line; end
+  def self.source; end
+  def self.source_file; end
+  def self.source_line; end
+  def self.source_location; end
+  def self.source_object; end
+  def setup; end
+  def slop; end
+  def subcommands(cmd); end
+end
+class Pry::BlockCommand < Pry::Command
+  def call(*args); end
+  def help; end
+end
+class Pry::NoCommandError < StandardError
+  def initialize(match, owner); end
+end
+class Pry::CommandSet
+  def [](pattern); end
+  def []=(pattern, command); end
+  def add_command(command); end
+  def alias_command(match, action, options = nil); end
+  def block_command(match, description = nil, options = nil, &block); end
+  def command(match, description = nil, options = nil, &block); end
+  def complete(search, context = nil); end
+  def create_command(match, description = nil, options = nil, &block); end
+  def delete(*searches); end
+  def desc(search, description = nil); end
+  def each(&block); end
+  def find_command(pattern); end
+  def find_command_by_match_or_listing(match_or_listing); end
+  def find_command_for_help(search); end
+  def helper_module; end
+  def helpers(&block); end
+  def import(*sets); end
+  def import_from(set, *matches); end
+  def initialize(*imported_sets, &block); end
+  def keys; end
+  def list_commands; end
+  def process_line(val, context = nil); end
+  def rename_command(new_match, search, options = nil); end
+  def to_h; end
+  def to_hash; end
+  def valid_command?(val); end
+  include Enumerable
+  include Pry::Helpers::BaseHelpers
+end
+class Pry::Result
+  def command?; end
+  def initialize(is_command, retval = nil); end
+  def retval; end
+  def void_command?; end
+end
+class Pry::SyntaxHighlighter
+  def self.highlight(code, language = nil); end
+  def self.keyword_token_color; end
+  def self.overwrite_coderay_comment_token!; end
+  def self.tokenize(code, language = nil); end
+end
+class Pry::Editor
+  def blocking_flag_for_editor(blocking); end
+  def build_editor_invocation_string(file, line, blocking); end
+  def edit_tempfile_with_content(initial_content, line = nil); end
+  def editor_name; end
+  def initialize(pry_instance); end
+  def invoke_editor(file, line, blocking = nil); end
+  def open_editor(editor_invocation); end
+  def open_editor_on_jruby(editor_invocation); end
+  def pry_instance; end
+  def self.default; end
+  def start_line_syntax_for_editor(file_name, line_number); end
+  include Pry::Helpers::CommandHelpers
+end
+class Pry::History
+  def <<(line); end
+  def clear; end
+  def filter(history); end
+  def history_file; end
+  def history_file_path; end
+  def history_line_count; end
+  def initialize(options = nil); end
+  def invalid_readline_line?(line); end
+  def load; end
+  def loader; end
+  def loader=(arg0); end
+  def original_lines; end
+  def push(line); end
+  def read_from_file; end
+  def save_to_file(line); end
+  def saver; end
+  def saver=(arg0); end
+  def self.default_file; end
+  def session_line_count; end
+  def should_ignore?(line); end
+  def to_a; end
+end
+class Pry::ColorPrinter < PP
+  def highlight_object_literal(object_literal); end
+  def inspect_object(object); end
+  def pp(object); end
+  def self.default(_output, value, pry_instance); end
+  def self.pp(obj, output = nil, max_width = nil); end
+  def text(str, max_width = nil); end
+end
+module Pry::ExceptionHandler
+  def self.cause_text(cause); end
+  def self.exception_text(exception); end
+  def self.handle_exception(output, exception, _pry_instance); end
+  def self.standard_error_text_for(exception); end
+end
+module Pry::SystemCommandHandler
+  def self.default(output, command, _pry_instance); end
+end
+module Pry::ControlDHandler
+  def self.default(pry_instance); end
+end
+class Pry::CommandState
+  def initialize; end
+  def reset(command_name); end
+  def self.default; end
+  def state_for(command_name); end
+end
+module Pry::Warning
+  def self.warn(message); end
+end
+module Pry::Env
+  def self.[](key); end
+end
+class Pry::Command::Ls < Pry::ClassCommand
+  def error_list; end
+  def no_user_opts?; end
+  def options(opt); end
+  def process; end
+  def raise_errors_if_arguments_are_weird; end
+end
+module Pry::Command::Ls::JRubyHacks
+  def rubbishness(name); end
+  def trim_jruby_aliases(methods); end
+end
+module Pry::Command::Ls::MethodsHelper
+  def all_methods(instance_methods = nil); end
+  def format(methods); end
+  def resolution_order; end
+  include Pry::Command::Ls::JRubyHacks
+end
+module Pry::Command::Ls::Interrogatable
+  def interrogatee_mod; end
+  def interrogating_a_module?; end
+end
+class Pry::Command::Ls::Grep
+  def initialize(grep_regexp); end
+  def regexp; end
+end
+class Pry::Command::Ls::Formatter
+  def color(type, str); end
+  def correct_opts?; end
+  def format_value(value); end
+  def grep; end
+  def grep=(arg0); end
+  def initialize(pry_instance); end
+  def output_section(heading, body); end
+  def output_self; end
+  def pry_instance; end
+  def write_out; end
+end
+class Pry::Command::Ls::Globals < Pry::Command::Ls::Formatter
+  def format(globals); end
+  def initialize(opts, pry_instance); end
+  def output_self; end
+end
+class Pry::Command::Ls::Constants < Pry::Command::Ls::Formatter
+  def correct_opts?; end
+  def format(mod, constants); end
+  def initialize(interrogatee, no_user_opts, opts, pry_instance); end
+  def output_self; end
+  def show_deprecated_constants?; end
+  include Pry::Command::Ls::Interrogatable
+end
+class Pry::Command::Ls::Methods < Pry::Command::Ls::Formatter
+  def below_ceiling; end
+  def correct_opts?; end
+  def initialize(interrogatee, no_user_opts, opts, pry_instance); end
+  def output_self; end
+  include Pry::Command::Ls::Interrogatable
+  include Pry::Command::Ls::MethodsHelper
+end
+class Pry::Command::Ls::SelfMethods < Pry::Command::Ls::Formatter
+  def correct_opts?; end
+  def initialize(interrogatee, no_user_opts, opts, pry_instance); end
+  def output_self; end
+  include Pry::Command::Ls::Interrogatable
+  include Pry::Command::Ls::MethodsHelper
+end
+class Pry::Command::Ls::InstanceVars < Pry::Command::Ls::Formatter
+  def correct_opts?; end
+  def format(type, vars); end
+  def initialize(interrogatee, no_user_opts, opts, pry_instance); end
+  def output_self; end
+  include Pry::Command::Ls::Interrogatable
+end
+class Pry::Command::Ls::LocalNames < Pry::Command::Ls::Formatter
+  def correct_opts?; end
+  def format(locals); end
+  def initialize(no_user_opts, args, pry_instance); end
+  def output_self; end
+end
+class Pry::Command::Ls::LocalVars < Pry::Command::Ls::Formatter
+  def colorized_assignment_style(lhs, rhs, desired_width = nil); end
+  def format(name_value_pairs); end
+  def initialize(opts, pry_instance); end
+  def output_self; end
+end
+class Pry::Command::Ls::LsEntity
+  def constants; end
+  def entities; end
+  def entities_table; end
+  def globals; end
+  def grep(entity); end
+  def initialize(opts); end
+  def instance_vars; end
+  def local_names; end
+  def local_vars; end
+  def methods; end
+  def pry_instance; end
+  def self_methods; end
+end
+class Pry::Config
+  def [](attr); end
+  def []=(attr, value); end
+  def auto_indent; end
+  def auto_indent=(arg0); end
+  def collision_warning; end
+  def collision_warning=(arg0); end
+  def color; end
+  def color=(arg0); end
+  def command_completions; end
+  def command_completions=(arg0); end
+  def command_prefix; end
+  def command_prefix=(arg0); end
+  def commands; end
+  def commands=(arg0); end
+  def completer; end
+  def completer=(arg0); end
+  def control_d_handler; end
+  def control_d_handler=(value); end
+  def correct_indent; end
+  def correct_indent=(arg0); end
+  def default_rc_file; end
+  def default_window_size; end
+  def default_window_size=(arg0); end
+  def disable_auto_reload; end
+  def disable_auto_reload=(arg0); end
+  def editor; end
+  def editor=(arg0); end
+  def exception_handler; end
+  def exception_handler=(arg0); end
+  def exception_whitelist; end
+  def exception_whitelist=(arg0); end
+  def exec_string; end
+  def exec_string=(arg0); end
+  def extra_sticky_locals; end
+  def extra_sticky_locals=(arg0); end
+  def file_completions; end
+  def file_completions=(arg0); end
+  def history; end
+  def history=(arg0); end
+  def history_file; end
+  def history_file=(arg0); end
+  def history_ignorelist; end
+  def history_ignorelist=(arg0); end
+  def history_load; end
+  def history_load=(arg0); end
+  def history_save; end
+  def history_save=(arg0); end
+  def hooks; end
+  def hooks=(arg0); end
+  def initialize; end
+  def initialize_dup(other); end
+  def input; end
+  def input=(arg0); end
+  def lazy_readline; end
+  def ls; end
+  def ls=(arg0); end
+  def memory_size; end
+  def memory_size=(arg0); end
+  def merge!(config_hash); end
+  def merge(config_hash); end
+  def method_missing(method_name, *args, &_block); end
+  def output; end
+  def output=(arg0); end
+  def output_prefix; end
+  def output_prefix=(arg0); end
+  def pager; end
+  def pager=(arg0); end
+  def print; end
+  def print=(arg0); end
+  def prompt; end
+  def prompt=(arg0); end
+  def prompt_name; end
+  def prompt_name=(arg0); end
+  def prompt_safe_contexts; end
+  def prompt_safe_contexts=(arg0); end
+  def quiet; end
+  def quiet=(arg0); end
+  def rc_file; end
+  def rc_file=(arg0); end
+  def requires; end
+  def requires=(arg0); end
+  def respond_to_missing?(method_name, include_all = nil); end
+  def should_load_local_rc; end
+  def should_load_local_rc=(arg0); end
+  def should_load_rc; end
+  def should_load_rc=(arg0); end
+  def should_load_requires; end
+  def should_load_requires=(arg0); end
+  def should_trap_interrupts; end
+  def should_trap_interrupts=(arg0); end
+  def system; end
+  def system=(arg0); end
+  def unrescued_exceptions; end
+  def unrescued_exceptions=(arg0); end
+  def windows_console_warning; end
+  def windows_console_warning=(arg0); end
+  extend Pry::Config::Attributable
+end
+module Pry::Config::Attributable
+  def attribute(attr_name); end
+end
+class Pry::Config::Value
+  def call; end
+  def initialize(value); end
+end
+class Pry::Config::MemoizedValue
+  def call; end
+  def initialize(&block); end
+end
+class Pry::Config::LazyValue
+  def call; end
+  def initialize(&block); end
+end
+class Pry::Inspector
+end
+class Pry::Pager
+  def best_available; end
+  def enabled?; end
+  def initialize(pry_instance); end
+  def open; end
+  def output; end
+  def page(text); end
+  def pry_instance; end
+end
+class Pry::Pager::StopPaging < StandardError
+end
+class Pry::Pager::NullPager
+  def <<(str); end
+  def close; end
+  def height; end
+  def initialize(out); end
+  def print(str); end
+  def puts(str); end
+  def width; end
+  def write(str); end
+end
+class Pry::Pager::SimplePager < Pry::Pager::NullPager
+  def initialize(*arg0); end
+  def write(str); end
+end
+class Pry::Pager::SystemPager < Pry::Pager::NullPager
+  def close; end
+  def initialize(*arg0); end
+  def invoked_pager?; end
+  def pager; end
+  def self.available?; end
+  def self.default_pager; end
+  def write(str); end
+  def write_to_pager(text); end
+end
+class Pry::Pager::PageTracker
+  def initialize(rows, cols); end
+  def line_length(line); end
+  def page?; end
+  def record(str); end
+  def reset; end
+end
+class Pry::Indent
+  def correct_indentation(prompt, code, overhang = nil); end
+  def current_prefix; end
+  def end_of_statement?(last_token, last_kind); end
+  def in_string?; end
+  def indent(input); end
+  def indent_level; end
+  def indentation_delta(tokens); end
+  def initialize(pry_instance = nil); end
+  def module_nesting; end
+  def open_delimiters; end
+  def open_delimiters_line; end
+  def reset; end
+  def self.indent(str); end
+  def self.nesting_at(str, line_number); end
+  def stack; end
+  def tokenize(string); end
+  def track_delimiter(token); end
+  def track_module_nesting(token, kind); end
+  def track_module_nesting_end(token, kind = nil); end
+  include Pry::Helpers::BaseHelpers
+end
+class Pry::Indent::UnparseableNestingError < StandardError
+end
+class Pry::ObjectPath
+  def complete?(segment); end
+  def handle_failure(context, err); end
+  def initialize(path_string, current_stack); end
+  def resolve; end
+end
+class Pry::Output
+  def <<(*objs); end
+  def actual_screen_size; end
+  def ansicon_env_size; end
+  def decolorize_maybe(str); end
+  def env_size; end
+  def height; end
+  def initialize(pry_instance); end
+  def io_console_size; end
+  def method_missing(method_name, *args, &block); end
+  def nonzero_column?(size); end
+  def print(*objs); end
+  def pry_instance; end
+  def puts(*objs); end
+  def readline_size; end
+  def respond_to_missing?(method_name, include_private = nil); end
+  def size; end
+  def tty?; end
+  def width; end
+  def write(*objs); end
+end
+class Pry::InputLock
+  def __with_ownership; end
+  def enter_interruptible_region; end
+  def initialize; end
+  def interruptible_region; end
+  def leave_interruptible_region; end
+  def self.for(input); end
+  def self.global_lock; end
+  def self.global_lock=(arg0); end
+  def self.input_locks; end
+  def self.input_locks=(arg0); end
+  def with_ownership(&block); end
+end
+class Pry::InputLock::Interrupt < Exception
+end
+class Pry::REPL
+  def calculate_overhang(current_prompt, original_val, indented_val); end
+  def coolline_available?; end
+  def epilogue; end
+  def handle_read_errors; end
+  def initialize(pry, options = nil); end
+  def input(*args, &block); end
+  def input_readline(*args); end
+  def output(*args, &block); end
+  def piping?; end
+  def prologue; end
+  def pry; end
+  def pry=(arg0); end
+  def read; end
+  def read_line(current_prompt); end
+  def readline_available?; end
+  def repl; end
+  def self.start(options); end
+  def set_readline_output; end
+  def start; end
+  extend Pry::Forwardable
+end
+class Pry::Code
+  def <<(line); end
+  def ==(other); end
+  def after(lineno, lines = nil); end
+  def alter(&block); end
+  def around(lineno, lines = nil); end
+  def before(lineno, lines = nil); end
+  def between(start_line, end_line = nil); end
+  def code_type; end
+  def code_type=(arg0); end
+  def comment_describing(line_number); end
+  def expression_at(line_number, consume = nil); end
+  def grep(pattern); end
+  def highlighted; end
+  def initialize(lines = nil, start_line = nil, code_type = nil); end
+  def length; end
+  def max_lineno_width; end
+  def method_missing(method_name, *args, &block); end
+  def nesting_at(line_number); end
+  def print_to_output(output, color = nil); end
+  def push(line); end
+  def raw; end
+  def reject(&block); end
+  def respond_to_missing?(method_name, include_private = nil); end
+  def select(&block); end
+  def self.from_file(filename, code_type = nil); end
+  def self.from_method(meth, start_line = nil); end
+  def self.from_module(mod, candidate_rank = nil, start_line = nil); end
+  def take_lines(start_line, num_lines); end
+  def to_s; end
+  def with_indentation(spaces = nil); end
+  def with_line_numbers(y_n = nil); end
+  def with_marker(lineno = nil); end
+end
+class Pry::Ring
+  def <<(value); end
+  def [](index); end
+  def clear; end
+  def count; end
+  def initialize(max_size); end
+  def max_size; end
+  def size; end
+  def to_a; end
+  def transpose_buffer_tail; end
+end
+class Pry::Method
+  def ==(other); end
+  def alias?; end
+  def aliases; end
+  def bound_method?; end
+  def c_source; end
+  def comment; end
+  def doc; end
+  def dynamically_defined?; end
+  def initialize(method, known_info = nil); end
+  def is_a?(klass); end
+  def kind_of?(klass); end
+  def method_missing(method_name, *args, &block); end
+  def method_name_from_first_line(first_ln); end
+  def name; end
+  def name_with_owner; end
+  def original_name; end
+  def owner(*args, &block); end
+  def parameters(*args, &block); end
+  def pry_doc_info; end
+  def pry_method?; end
+  def receiver(*args, &block); end
+  def redefine(source); end
+  def respond_to?(method_name, include_all = nil); end
+  def respond_to_missing?(method_name, include_private = nil); end
+  def ruby_source; end
+  def self.all_from_class(klass, include_super = nil); end
+  def self.all_from_obj(obj, include_super = nil); end
+  def self.from_binding(binding); end
+  def self.from_class(klass, name, target = nil); end
+  def self.from_module(klass, name, target = nil); end
+  def self.from_obj(obj, name, target = nil); end
+  def self.from_str(name, target = nil, options = nil); end
+  def self.instance_method_definition?(name, definition_line); end
+  def self.instance_resolution_order(klass); end
+  def self.lookup_method_via_binding(obj, method_name, method_type, target = nil); end
+  def self.method_definition?(name, definition_line); end
+  def self.resolution_order(obj); end
+  def self.singleton_class_of(obj); end
+  def self.singleton_class_resolution_order(klass); end
+  def self.singleton_method_definition?(name, definition_line); end
+  def signature; end
+  def singleton_method?; end
+  def source; end
+  def source?; end
+  def source_file; end
+  def source_line; end
+  def source_range; end
+  def source_type; end
+  def super(times = nil); end
+  def super_using_ancestors(ancestors, times = nil); end
+  def unbound_method?; end
+  def undefined?; end
+  def visibility; end
+  def wrapped; end
+  def wrapped_owner; end
+  extend Pry::Forwardable
+  extend Pry::Helpers::BaseHelpers
+  include Pry::CodeObject::Helpers
+  include Pry::Helpers::BaseHelpers
+  include Pry::Helpers::DocumentationHelpers
+end
+class Pry::WrappedModule
+  def all_methods_for(mod); end
+  def all_relevant_methods_for(mod); end
+  def all_source_locations_by_popularity; end
+  def candidate(rank); end
+  def candidates; end
+  def class?; end
+  def constants(inherit = nil); end
+  def doc; end
+  def file; end
+  def initialize(mod); end
+  def line; end
+  def lines_for_file(file); end
+  def method_candidates; end
+  def method_defined_by_forwardable_module?(method); end
+  def method_missing(method_name, *args, &block); end
+  def method_prefix; end
+  def module?; end
+  def nested_module?(parent, name); end
+  def nonblank_name; end
+  def number_of_candidates; end
+  def primary_candidate; end
+  def respond_to_missing?(method_name, include_private = nil); end
+  def self.from_str(mod_name, target = nil); end
+  def self.safe_to_evaluate?(str, target); end
+  def singleton_class?; end
+  def singleton_instance; end
+  def source; end
+  def source_file; end
+  def source_line; end
+  def source_location; end
+  def super(times = nil); end
+  def wrapped; end
+  def yard_doc; end
+  def yard_docs?; end
+  def yard_file; end
+  def yard_line; end
+  include Pry::CodeObject::Helpers
+  include Pry::Helpers::BaseHelpers
+end
+class Pry::WrappedModule::Candidate
+  def class?(*args, &block); end
+  def class_regexes; end
+  def doc; end
+  def file; end
+  def first_line_of_module_definition(file, line); end
+  def first_method_source_location; end
+  def initialize(wrapper, rank); end
+  def last_method_source_location; end
+  def line; end
+  def lines_for_file(*a, &b); end
+  def method_candidates(*a, &b); end
+  def module?(*args, &block); end
+  def name(*a, &b); end
+  def nonblank_name(*args, &block); end
+  def number_of_candidates(*args, &block); end
+  def number_of_lines_in_first_chunk; end
+  def source; end
+  def source_file; end
+  def source_line; end
+  def source_location; end
+  def wrapped(*args, &block); end
+  def yard_docs?(*a, &b); end
+  extend Pry::Forwardable
+  include Pry::CodeObject::Helpers
+  include Pry::Helpers::DocumentationHelpers
+end
+class Pry::Slop
+  def [](key); end
+  def add_callback(label, &block); end
+  def autocreate(items, index); end
+  def banner(banner = nil); end
+  def banner=(banner); end
+  def build_option(objects, &block); end
+  def clean(object); end
+  def command(command, options = nil, &block); end
+  def commands_to_help; end
+  def config; end
+  def description(desc = nil); end
+  def description=(desc); end
+  def each(&block); end
+  def execute_multiple_switches(option, argument, index); end
+  def execute_option(option, argument, index, item = nil); end
+  def extract_long_flag(objects, config); end
+  def extract_option(flag); end
+  def extract_short_flag(objects, config); end
+  def fetch_command(command); end
+  def fetch_option(key); end
+  def get(key); end
+  def help; end
+  def initialize(config = nil, &block); end
+  def method_missing(method, *args, &block); end
+  def missing; end
+  def on(*objects, &block); end
+  def opt(*objects, &block); end
+  def option(*objects, &block); end
+  def options; end
+  def parse!(items = nil, &block); end
+  def parse(items = nil, &block); end
+  def present?(*keys); end
+  def process_item(items, index, &block); end
+  def respond_to_missing?(method_name, include_all = nil); end
+  def run(callable = nil, &block); end
+  def self.optspec(string, config = nil); end
+  def self.parse!(items = nil, config = nil, &block); end
+  def self.parse(items = nil, config = nil, &block); end
+  def separator(text); end
+  def strict?; end
+  def to_h(include_commands = nil); end
+  def to_hash(include_commands = nil); end
+  def to_s; end
+  include Enumerable
+end
+class Pry::Slop::Option
+  def accepts_optional_argument?; end
+  def argument_in_value; end
+  def argument_in_value=(arg0); end
+  def call(*objects); end
+  def config; end
+  def count; end
+  def count=(arg0); end
+  def description; end
+  def expects_argument?; end
+  def help; end
+  def initialize(slop, short, long, description, config = nil, &block); end
+  def inspect; end
+  def key; end
+  def long; end
+  def short; end
+  def to_s; end
+  def types; end
+  def value; end
+  def value=(new_value); end
+  def value_to_float(value); end
+  def value_to_integer(value); end
+  def value_to_range(value); end
+end
+class Pry::Slop::Commands
+  def [](key); end
+  def arguments; end
+  def banner(banner = nil); end
+  def banner=(arg0); end
+  def commands; end
+  def config; end
+  def default(config = nil, &block); end
+  def each(&block); end
+  def execute_arguments!(items); end
+  def execute_global_opts!(items); end
+  def get(key); end
+  def global(config = nil, &block); end
+  def help; end
+  def initialize(config = nil, &block); end
+  def inspect; end
+  def on(command, config = nil, &block); end
+  def parse!(items = nil); end
+  def parse(items = nil); end
+  def present?(key); end
+  def to_hash; end
+  def to_s; end
+  include Enumerable
+end
+class Pry::Slop::Error < StandardError
+end
+class Pry::Slop::MissingArgumentError < Pry::Slop::Error
+end
+class Pry::Slop::MissingOptionError < Pry::Slop::Error
+end
+class Pry::Slop::InvalidArgumentError < Pry::Slop::Error
+end
+class Pry::Slop::InvalidOptionError < Pry::Slop::Error
+end
+class Pry::Slop::InvalidCommandError < Pry::Slop::Error
+end
+class Pry::CLI
+  def self.add_option_processor(&block); end
+  def self.add_options(&block); end
+  def self.input_args; end
+  def self.input_args=(arg0); end
+  def self.option_processors; end
+  def self.option_processors=(arg0); end
+  def self.options; end
+  def self.options=(arg0); end
+  def self.parse_options(args = nil); end
+  def self.reset; end
+  def self.start(opts); end
+end
+class Pry::CLI::NoOptionsError < StandardError
+end
+class Object < BasicObject
+  def __binding__; end
+  def pry(object = nil, hash = nil); end
+end
+class BasicObject
+  def __binding__; end
+end
+class Pry::REPLFileLoader
+  def define_additional_commands; end
+  def initialize(file_name); end
+  def interactive_mode(pry_instance); end
+  def load; end
+  def non_interactive_mode(pry_instance, content); end
+end
+class Pry::Code::LOC
+  def ==(other); end
+  def add_line_number(max_width = nil, color = nil); end
+  def add_marker(marker_lineno); end
+  def colorize(code_type); end
+  def dup; end
+  def handle_multiline_entries_from_edit_command(line, max_width); end
+  def indent(distance); end
+  def initialize(line, lineno); end
+  def line; end
+  def lineno; end
+  def tuple; end
+end
+class Pry::Code::CodeRange
+  def end_line; end
+  def find_end_index(lines); end
+  def find_start_index(lines); end
+  def force_set_end_line; end
+  def indices(lines); end
+  def indices_range(lines); end
+  def initialize(start_line, end_line = nil); end
+  def set_end_line_from_range; end
+  def start_line; end
+end
+class Pry::CodeFile
+  def abs_path; end
+  def code; end
+  def code_path; end
+  def code_type; end
+  def from_load_path; end
+  def from_pry_init_pwd; end
+  def from_pwd; end
+  def initialize(filename, code_type = nil); end
+  def readable?(path); end
+  def type_from_filename(filename, default = nil); end
+end
+class Pry::Method::WeirdMethodLocator
+  def all_methods_for(obj); end
+  def expanded_source_location(source_location); end
+  def find_method; end
+  def find_method_in_superclass; end
+  def find_renamed_method; end
+  def index_to_line_number(index); end
+  def initialize(method, target); end
+  def lines_for_file(file); end
+  def lost_method?; end
+  def method; end
+  def method=(arg0); end
+  def normal_method?(method); end
+  def pry_file?; end
+  def renamed_method_source_location; end
+  def self.normal_method?(method, binding); end
+  def self.weird_method?(method, binding); end
+  def skip_superclass_search?; end
+  def target; end
+  def target=(arg0); end
+  def target_file; end
+  def target_line; end
+  def target_self; end
+  def valid_file?(file); end
+end
+class Pry::Method::Disowned < Pry::Method
+  def initialize(receiver, method_name); end
+  def method_missing(method_name, *args, &block); end
+  def name; end
+  def owner; end
+  def receiver; end
+  def respond_to_missing?(method_name, include_private = nil); end
+  def source?; end
+  def undefined?; end
+end
+class Pry::Method::Patcher
+  def cache_key; end
+  def definition_for_owner(line); end
+  def initialize(method); end
+  def method; end
+  def method=(arg0); end
+  def patch_in_ram(source); end
+  def redefine(source); end
+  def self.code_for(filename); end
+  def with_method_transaction; end
+  def wrap(source); end
+  def wrap_for_nesting(source); end
+  def wrap_for_owner(source); end
+end
+class Pry::Command::AmendLine < Pry::ClassCommand
+  def amend_input; end
+  def delete_from_array(array, range); end
+  def insert_into_array(array, range); end
+  def line_count; end
+  def line_range; end
+  def process; end
+  def replace_in_array(array, range); end
+  def start_and_end_line_number; end
+  def zero_indexed_range_from_one_indexed_numbers(start_line_number, end_line_number); end
+end
+class Pry::Command::Bang < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::BangPry < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::Cat < Pry::ClassCommand
+  def complete(search); end
+  def load_path_completions; end
+  def options(opt); end
+  def process; end
+end
+class Pry::Command::Cat::AbstractFormatter
+  def between_lines; end
+  def code_type; end
+  def decorate(content); end
+  def use_line_numbers?; end
+  include Pry::Helpers::BaseHelpers
+  include Pry::Helpers::CommandHelpers
+end
+class Pry::Command::Cat::InputExpressionFormatter < Pry::Command::Cat::AbstractFormatter
+  def format; end
+  def initialize(input_expressions, opts); end
+  def input_expressions; end
+  def input_expressions=(arg0); end
+  def normalized_expression_range; end
+  def numbered_input_items; end
+  def opts; end
+  def opts=(arg0); end
+  def selected_input_items; end
+end
+class Pry::Command::Cat::ExceptionFormatter < Pry::Command::Cat::AbstractFormatter
+  def backtrace_file; end
+  def backtrace_level; end
+  def backtrace_line; end
+  def check_for_errors; end
+  def code_window_size; end
+  def ex; end
+  def format; end
+  def header; end
+  def increment_backtrace_level; end
+  def initialize(exception, pry_instance, opts); end
+  def opts; end
+  def pry_instance; end
+  def start_and_end_line_for_code_window; end
+  include Pry::Helpers::Text
+end
+class Pry::Command::Cat::FileFormatter < Pry::Command::Cat::AbstractFormatter
+  def code_type; end
+  def code_window_size; end
+  def decorate(content); end
+  def detect_code_type_from_file(file_name); end
+  def file_and_line; end
+  def file_name; end
+  def file_with_embedded_line; end
+  def format; end
+  def initialize(file_with_embedded_line, pry_instance, opts); end
+  def line_number; end
+  def opts; end
+  def pry_instance; end
+end
+class Pry::Command::Cd < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::ChangeInspector < Pry::ClassCommand
+  def inspector_map; end
+  def process(inspector); end
+end
+class Pry::Command::ChangePrompt < Pry::ClassCommand
+  def change_prompt(prompt); end
+  def list_prompts; end
+  def options(opt); end
+  def process(prompt); end
+end
+class Pry::Command::ClearScreen < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::CodeCollector
+  def args; end
+  def bad_option_combination?; end
+  def code_object; end
+  def code_object_doc; end
+  def code_object_source_or_file; end
+  def content; end
+  def convert_to_range(range); end
+  def could_not_locate(name); end
+  def file; end
+  def file=(arg0); end
+  def file_content; end
+  def initialize(args, opts, pry_instance); end
+  def line_range; end
+  def obj_name; end
+  def opts; end
+  def pry_array_content_as_string(array, ranges); end
+  def pry_input_content; end
+  def pry_instance; end
+  def pry_output_content; end
+  def restrict_to_lines(content, range); end
+  def self.inject_options(opt); end
+  def self.input_expression_ranges; end
+  def self.input_expression_ranges=(arg0); end
+  def self.output_result_ranges; end
+  def self.output_result_ranges=(arg0); end
+  include Pry::Helpers::CommandHelpers
+end
+class Pry::Command::DisablePry < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::Edit < Pry::ClassCommand
+  def apply_runtime_patch; end
+  def bad_option_combination?; end
+  def code_object; end
+  def ensure_file_name_is_valid(file_name); end
+  def file_and_line; end
+  def file_and_line_for_current_exception; end
+  def file_based_exception?; end
+  def file_edit; end
+  def filename_argument; end
+  def initial_temp_file_content; end
+  def input_expression; end
+  def never_reload?; end
+  def options(opt); end
+  def patch_exception?; end
+  def previously_patched?(code_object); end
+  def probably_a_file?(str); end
+  def process; end
+  def pry_method?(code_object); end
+  def reload?(file_name = nil); end
+  def reloadable?; end
+  def repl_edit; end
+  def repl_edit?; end
+  def runtime_patch?; end
+end
+class Pry::Command::Edit::ExceptionPatcher
+  def file_and_line; end
+  def file_and_line=(arg0); end
+  def initialize(pry_instance, state, exception_file_and_line); end
+  def perform_patch; end
+  def pry_instance; end
+  def pry_instance=(arg0); end
+  def state; end
+  def state=(arg0); end
+end
+module Pry::Command::Edit::FileAndLineLocator
+  def self.from_binding(target); end
+  def self.from_code_object(code_object, filename_argument); end
+  def self.from_exception(exception, backtrace_level); end
+  def self.from_filename_argument(filename_argument); end
+end
+class Pry::Command::Exit < Pry::ClassCommand
+  def process; end
+  def process_pop_and_return; end
+end
+class Pry::Command::ExitAll < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::ExitProgram < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::FindMethod < Pry::ClassCommand
+  def additional_info(header, method); end
+  def content_search(namespace); end
+  def matched_method_lines(header, method); end
+  def name_search(namespace); end
+  def options(opt); end
+  def pattern; end
+  def print_matches(matches); end
+  def print_matches_for_class(klass, grouped); end
+  def process; end
+  def recurse_namespace(klass, done = nil, &block); end
+  def search_all_methods(namespace); end
+  def search_class; end
+  def show_search_results(matches); end
+  extend Pry::Helpers::BaseHelpers
+end
+class Pry::Command::FixIndent < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::Help < Pry::ClassCommand
+  def command_groups; end
+  def display_command(command); end
+  def display_filtered_commands(search); end
+  def display_filtered_search_results(search); end
+  def display_index(groups); end
+  def display_search(search); end
+  def group_sort_key(group_name); end
+  def help_text_for_commands(name, commands); end
+  def normalize(key); end
+  def process; end
+  def search_hash(search, hash); end
+  def sorted_commands(commands); end
+  def sorted_group_names(groups); end
+  def visible_commands; end
+end
+class Pry::Command::Hist < Pry::ClassCommand
+  def check_for_juxtaposed_replay(replay_sequence); end
+  def find_history; end
+  def options(opt); end
+  def process; end
+  def process_clear; end
+  def process_display; end
+  def process_replay; end
+  def process_save; end
+end
+class Pry::Command::ImportSet < Pry::ClassCommand
+  def process(_command_set_name); end
+end
+class Pry::Command::JumpTo < Pry::ClassCommand
+  def process(break_level); end
+end
+class Pry::Command::ListInspectors < Pry::ClassCommand
+  def inspector_map; end
+  def process; end
+  def selected_inspector?(inspector); end
+  def selected_text; end
+end
+class Pry::Command::Nesting < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::Play < Pry::ClassCommand
+  def code_object; end
+  def content; end
+  def content_after_options; end
+  def content_at_expression; end
+  def default_file; end
+  def file_content; end
+  def options(opt); end
+  def perform_play; end
+  def process; end
+  def should_use_default_file?; end
+  def show_input; end
+end
+class Pry::Command::PryBacktrace < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::Version < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::RaiseUp < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::ReloadCode < Pry::ClassCommand
+  def check_for_reloadability(code_object, identifier); end
+  def current_file; end
+  def process; end
+  def reload_current_file; end
+  def reload_object(identifier); end
+end
+class Pry::Command::Reset < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::Ri < Pry::ClassCommand
+  def process(spec); end
+end
+class Pry::Command::SaveFile < Pry::ClassCommand
+  def display_content; end
+  def file_name; end
+  def mode; end
+  def options(opt); end
+  def process; end
+  def save_file; end
+end
+class Pry::Command::ShellCommand < Pry::ClassCommand
+  def cd_path_env; end
+  def cd_path_exists?; end
+  def parse_destination(dest); end
+  def path_from_cd_path(dest); end
+  def process(cmd); end
+  def process_cd(dest); end
+  def special_case_path?(dest); end
+end
+class Pry::Command::ShellMode < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::ShowInfo < Pry::ClassCommand
+  def code_object_header(code_object, line_num); end
+  def code_object_with_accessible_source(code_object); end
+  def complete(input); end
+  def content_and_header_for_code_object(code_object); end
+  def content_and_headers_for_all_module_candidates(mod); end
+  def file_and_line_for(code_object); end
+  def header(code_object); end
+  def header_options; end
+  def initialize(*arg0); end
+  def method_header(code_object, line_num); end
+  def method_sections(code_object); end
+  def module_header(code_object, line_num); end
+  def no_definition_message; end
+  def obj_name; end
+  def options(opt); end
+  def process; end
+  def show_all_modules?(code_object); end
+  def start_line_for(code_object); end
+  def use_line_numbers?; end
+  def valid_superclass?(code_object); end
+  extend Pry::Helpers::BaseHelpers
+end
+class Pry::Command::ShowDoc < Pry::Command::ShowInfo
+  def content_for(code_object); end
+  def docs_for(code_object); end
+  def header_options; end
+  def process; end
+  def render_doc_markup_for(code_object); end
+  def start_line_for(code_object); end
+  include Pry::Helpers::DocumentationHelpers
+end
+class Pry::Command::ShowInput < Pry::ClassCommand
+  def process; end
+end
+class Pry::Command::ShowSource < Pry::Command::ShowInfo
+  def content_for(code_object); end
+  def docs_for(code_object); end
+  def header_options; end
+  def options(opt); end
+  def process; end
+  def render_doc_markup_for(code_object); end
+  def start_line_for(code_object); end
+  include Pry::Helpers::DocumentationHelpers
+end
+class Pry::Command::Stat < Pry::ClassCommand
+  def options(opt); end
+  def process; end
+end
+class Pry::Command::SwitchTo < Pry::ClassCommand
+  def process(selection); end
+end
+class Pry::Command::ToggleColor < Pry::ClassCommand
+  def color_toggle; end
+  def process; end
+end
+class Pry::Command::WatchExpression < Pry::ClassCommand
+  def add_expression(_arguments); end
+  def add_hook; end
+  def delete(index); end
+  def eval_and_print_changed(output); end
+  def expressions; end
+  def list; end
+  def options(opt); end
+  def process; end
+end
+class Pry::Command::WatchExpression::Expression
+  def changed?; end
+  def eval!; end
+  def initialize(pry_instance, target, source); end
+  def previous_value; end
+  def pry_instance; end
+  def source; end
+  def target; end
+  def target_eval(target, source); end
+  def to_s; end
+  def value; end
+end
+class Pry::Command::Whereami < Pry::ClassCommand
+  def bad_option_combination?; end
+  def class_code; end
+  def code; end
+  def code?; end
+  def code_window; end
+  def default_code; end
+  def expand_path(filename); end
+  def handle_internal_binding; end
+  def initialize(*arg0); end
+  def location; end
+  def marker; end
+  def method_code; end
+  def nothing_to_do?; end
+  def options(opt); end
+  def process; end
+  def self.method_size_cutoff; end
+  def self.method_size_cutoff=(arg0); end
+  def setup; end
+  def small_method?; end
+  def target_class; end
+  def top_level?; end
+  def use_line_numbers?; end
+  def valid_method?; end
+  def window_size; end
+end
+class Pry::Command::Wtf < Pry::ClassCommand
+  def format_backtrace(backtrace); end
+  def format_header(title, exception); end
+  def options(opt); end
+  def process; end
+  def read_line(file, line); end
+  def trim_backtrace(backtrace); end
+  def unwind_exceptions; end
+end
diff --git a/sorbet/rbi/gems/rainbow.rbi b/sorbet/rbi/gems/rainbow.rbi
new file mode 100644
index 0000000..cae9556
--- /dev/null
+++ b/sorbet/rbi/gems/rainbow.rbi
@@ -0,0 +1,118 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rainbow/all/rainbow.rbi
+#
+# rainbow-3.0.0
+
+module Rainbow
+  def self.enabled; end
+  def self.enabled=(value); end
+  def self.global; end
+  def self.new; end
+  def self.uncolor(string); end
+end
+class Rainbow::StringUtils
+  def self.uncolor(string); end
+  def self.wrap_with_sgr(string, codes); end
+end
+module Rainbow::X11ColorNames
+end
+class Rainbow::Color
+  def ground; end
+  def self.build(ground, values); end
+  def self.parse_hex_color(hex); end
+end
+class Rainbow::Color::Indexed < Rainbow::Color
+  def codes; end
+  def initialize(ground, num); end
+  def num; end
+end
+class Rainbow::Color::Named < Rainbow::Color::Indexed
+  def initialize(ground, name); end
+  def self.color_names; end
+  def self.valid_names; end
+end
+class Rainbow::Color::RGB < Rainbow::Color::Indexed
+  def b; end
+  def code_from_rgb; end
+  def codes; end
+  def g; end
+  def initialize(ground, *values); end
+  def r; end
+  def self.to_ansi_domain(value); end
+end
+class Rainbow::Color::X11Named < Rainbow::Color::RGB
+  def initialize(ground, name); end
+  def self.color_names; end
+  def self.valid_names; end
+  include Rainbow::X11ColorNames
+end
+class Rainbow::Presenter < String
+  def background(*values); end
+  def bg(*values); end
+  def black; end
+  def blink; end
+  def blue; end
+  def bold; end
+  def bright; end
+  def color(*values); end
+  def cyan; end
+  def dark; end
+  def faint; end
+  def fg(*values); end
+  def foreground(*values); end
+  def green; end
+  def hide; end
+  def inverse; end
+  def italic; end
+  def magenta; end
+  def method_missing(method_name, *args); end
+  def red; end
+  def reset; end
+  def respond_to_missing?(method_name, *args); end
+  def underline; end
+  def white; end
+  def wrap_with_sgr(codes); end
+  def yellow; end
+end
+class Rainbow::NullPresenter < String
+  def background(*_values); end
+  def bg(*_values); end
+  def black; end
+  def blink; end
+  def blue; end
+  def bold; end
+  def bright; end
+  def color(*_values); end
+  def cyan; end
+  def dark; end
+  def faint; end
+  def fg(*_values); end
+  def foreground(*_values); end
+  def green; end
+  def hide; end
+  def inverse; end
+  def italic; end
+  def magenta; end
+  def method_missing(method_name, *args); end
+  def red; end
+  def reset; end
+  def respond_to_missing?(method_name, *args); end
+  def underline; end
+  def white; end
+  def yellow; end
+end
+class Rainbow::Wrapper
+  def enabled; end
+  def enabled=(arg0); end
+  def initialize(enabled = nil); end
+  def wrap(string); end
+end
+class Object < BasicObject
+  def Rainbow(string); end
+end
diff --git a/sorbet/rbi/gems/rake.rbi b/sorbet/rbi/gems/rake.rbi
new file mode 100644
index 0000000..6f9fa20
--- /dev/null
+++ b/sorbet/rbi/gems/rake.rbi
@@ -0,0 +1,645 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rake/all/rake.rbi
+#
+# rake-12.3.3
+
+module Rake
+  def self.add_rakelib(*files); end
+  def self.application; end
+  def self.application=(app); end
+  def self.each_dir_parent(dir); end
+  def self.from_pathname(path); end
+  def self.load_rakefile(path); end
+  def self.original_dir; end
+  def self.suggested_thread_count; end
+  def self.with_application(block_application = nil); end
+  extend Rake::FileUtilsExt
+end
+module Rake::Version
+end
+class Module
+  def rake_extension(method); end
+end
+class String
+  def ext(newext = nil); end
+  def pathmap(spec = nil, &block); end
+  def pathmap_explode; end
+  def pathmap_partial(n); end
+  def pathmap_replace(patterns, &block); end
+end
+module Rake::Win32
+  def self.normalize(path); end
+  def self.win32_system_dir; end
+  def self.windows?; end
+end
+class Rake::Win32::Win32HomeError < RuntimeError
+end
+class Rake::LinkedList
+  def ==(other); end
+  def conj(item); end
+  def each; end
+  def empty?; end
+  def head; end
+  def initialize(head, tail = nil); end
+  def inspect; end
+  def self.cons(head, tail); end
+  def self.empty; end
+  def self.make(*args); end
+  def tail; end
+  def to_s; end
+  include Enumerable
+end
+class Rake::LinkedList::EmptyLinkedList < Rake::LinkedList
+  def empty?; end
+  def initialize; end
+  def self.cons(head, tail); end
+end
+class Rake::CpuCounter
+  def count; end
+  def count_with_default(default = nil); end
+  def self.count; end
+end
+class Rake::Scope < Rake::LinkedList
+  def path; end
+  def path_with_task_name(task_name); end
+  def trim(n); end
+end
+class Rake::Scope::EmptyScope < Rake::LinkedList::EmptyLinkedList
+  def path; end
+  def path_with_task_name(task_name); end
+end
+class Rake::TaskArgumentError < ArgumentError
+end
+class Rake::RuleRecursionOverflowError < StandardError
+  def add_target(target); end
+  def initialize(*args); end
+  def message; end
+end
+module Rake::TaskManager
+  def [](task_name, scopes = nil); end
+  def add_location(task); end
+  def attempt_rule(task_name, task_pattern, args, extensions, block, level); end
+  def clear; end
+  def create_rule(*args, &block); end
+  def current_scope; end
+  def define_task(task_class, *args, &block); end
+  def enhance_with_matching_rule(task_name, level = nil); end
+  def find_location; end
+  def generate_did_you_mean_suggestions(task_name); end
+  def generate_message_for_undefined_task(task_name); end
+  def generate_name; end
+  def get_description(task); end
+  def in_namespace(name); end
+  def initialize; end
+  def intern(task_class, task_name); end
+  def last_description; end
+  def last_description=(arg0); end
+  def lookup(task_name, initial_scope = nil); end
+  def lookup_in_scope(name, scope); end
+  def make_sources(task_name, task_pattern, extensions); end
+  def resolve_args(args); end
+  def resolve_args_with_dependencies(args, hash); end
+  def resolve_args_without_dependencies(args); end
+  def self.record_task_metadata; end
+  def self.record_task_metadata=(arg0); end
+  def synthesize_file_task(task_name); end
+  def tasks; end
+  def tasks_in_scope(scope); end
+  def trace_rule(level, message); end
+end
+module Rake::Cloneable
+  def initialize_copy(source); end
+end
+module FileUtils
+  def create_shell_runner(cmd); end
+  def ruby(*args, &block); end
+  def safe_ln(*args); end
+  def set_verbose_option(options); end
+  def sh(*cmd, &block); end
+  def sh_show_command(cmd); end
+  def split_all(path); end
+end
+module Rake::FileUtilsExt
+  def cd(*args, &block); end
+  def chdir(*args, &block); end
+  def chmod(*args, &block); end
+  def chmod_R(*args, &block); end
+  def chown(*args, &block); end
+  def chown_R(*args, &block); end
+  def copy(*args, &block); end
+  def cp(*args, &block); end
+  def cp_lr(*args, &block); end
+  def cp_r(*args, &block); end
+  def install(*args, &block); end
+  def link(*args, &block); end
+  def ln(*args, &block); end
+  def ln_s(*args, &block); end
+  def ln_sf(*args, &block); end
+  def makedirs(*args, &block); end
+  def mkdir(*args, &block); end
+  def mkdir_p(*args, &block); end
+  def mkpath(*args, &block); end
+  def move(*args, &block); end
+  def mv(*args, &block); end
+  def nowrite(value = nil); end
+  def rake_check_options(options, *optdecl); end
+  def rake_merge_option(args, defaults); end
+  def rake_output_message(message); end
+  def remove(*args, &block); end
+  def rm(*args, &block); end
+  def rm_f(*args, &block); end
+  def rm_r(*args, &block); end
+  def rm_rf(*args, &block); end
+  def rmdir(*args, &block); end
+  def rmtree(*args, &block); end
+  def safe_unlink(*args, &block); end
+  def self.nowrite_flag; end
+  def self.nowrite_flag=(arg0); end
+  def self.verbose_flag; end
+  def self.verbose_flag=(arg0); end
+  def symlink(*args, &block); end
+  def touch(*args, &block); end
+  def verbose(value = nil); end
+  def when_writing(msg = nil); end
+  extend Rake::FileUtilsExt
+  include FileUtils
+end
+class Rake::FileList
+  def &(*args, &block); end
+  def *(other); end
+  def +(*args, &block); end
+  def -(*args, &block); end
+  def <<(obj); end
+  def <=>(*args, &block); end
+  def ==(array); end
+  def [](*args, &block); end
+  def []=(*args, &block); end
+  def abbrev(*args, &block); end
+  def add(*filenames); end
+  def add_matching(pattern); end
+  def all?(*args, &block); end
+  def any?(*args, &block); end
+  def append(*args, &block); end
+  def assoc(*args, &block); end
+  def at(*args, &block); end
+  def bsearch(*args, &block); end
+  def bsearch_index(*args, &block); end
+  def chain(*args, &block); end
+  def chunk(*args, &block); end
+  def chunk_while(*args, &block); end
+  def clear(*args, &block); end
+  def clear_exclude; end
+  def collect!(*args, &block); end
+  def collect(*args, &block); end
+  def collect_concat(*args, &block); end
+  def combination(*args, &block); end
+  def compact!(*args, &block); end
+  def compact(*args, &block); end
+  def concat(*args, &block); end
+  def count(*args, &block); end
+  def cycle(*args, &block); end
+  def deconstruct(*args, &block); end
+  def delete(*args, &block); end
+  def delete_at(*args, &block); end
+  def delete_if(*args, &block); end
+  def detect(*args, &block); end
+  def difference(*args, &block); end
+  def dig(*args, &block); end
+  def drop(*args, &block); end
+  def drop_while(*args, &block); end
+  def each(*args, &block); end
+  def each_cons(*args, &block); end
+  def each_entry(*args, &block); end
+  def each_index(*args, &block); end
+  def each_slice(*args, &block); end
+  def each_with_index(*args, &block); end
+  def each_with_object(*args, &block); end
+  def egrep(pattern, *options); end
+  def empty?(*args, &block); end
+  def entries(*args, &block); end
+  def exclude(*patterns, &block); end
+  def excluded_from_list?(fn); end
+  def existing!; end
+  def existing; end
+  def ext(newext = nil); end
+  def fetch(*args, &block); end
+  def fill(*args, &block); end
+  def filter!(*args, &block); end
+  def filter(*args, &block); end
+  def filter_map(*args, &block); end
+  def find(*args, &block); end
+  def find_all(*args, &block); end
+  def find_index(*args, &block); end
+  def first(*args, &block); end
+  def flat_map(*args, &block); end
+  def flatten!(*args, &block); end
+  def flatten(*args, &block); end
+  def grep(*args, &block); end
+  def grep_v(*args, &block); end
+  def group_by(*args, &block); end
+  def gsub!(pat, rep); end
+  def gsub(pat, rep); end
+  def import(array); end
+  def include(*filenames); end
+  def include?(*args, &block); end
+  def index(*args, &block); end
+  def initialize(*patterns); end
+  def inject(*args, &block); end
+  def insert(*args, &block); end
+  def inspect(*args, &block); end
+  def intersection(*args, &block); end
+  def is_a?(klass); end
+  def join(*args, &block); end
+  def keep_if(*args, &block); end
+  def kind_of?(klass); end
+  def last(*args, &block); end
+  def lazy(*args, &block); end
+  def length(*args, &block); end
+  def map!(*args, &block); end
+  def map(*args, &block); end
+  def max(*args, &block); end
+  def max_by(*args, &block); end
+  def member?(*args, &block); end
+  def min(*args, &block); end
+  def min_by(*args, &block); end
+  def minmax(*args, &block); end
+  def minmax_by(*args, &block); end
+  def none?(*args, &block); end
+  def one?(*args, &block); end
+  def pack(*args, &block); end
+  def partition(&block); end
+  def pathmap(spec = nil, &block); end
+  def permutation(*args, &block); end
+  def pop(*args, &block); end
+  def prepend(*args, &block); end
+  def product(*args, &block); end
+  def push(*args, &block); end
+  def rassoc(*args, &block); end
+  def reduce(*args, &block); end
+  def reject!(*args, &block); end
+  def reject(*args, &block); end
+  def repeated_combination(*args, &block); end
+  def repeated_permutation(*args, &block); end
+  def replace(*args, &block); end
+  def resolve; end
+  def resolve_add(fn); end
+  def resolve_exclude; end
+  def reverse!(*args, &block); end
+  def reverse(*args, &block); end
+  def reverse_each(*args, &block); end
+  def rindex(*args, &block); end
+  def rotate!(*args, &block); end
+  def rotate(*args, &block); end
+  def sample(*args, &block); end
+  def select!(*args, &block); end
+  def select(*args, &block); end
+  def self.[](*args); end
+  def self.glob(pattern, *args); end
+  def shelljoin(*args, &block); end
+  def shift(*args, &block); end
+  def shuffle!(*args, &block); end
+  def shuffle(*args, &block); end
+  def size(*args, &block); end
+  def slice!(*args, &block); end
+  def slice(*args, &block); end
+  def slice_after(*args, &block); end
+  def slice_before(*args, &block); end
+  def slice_when(*args, &block); end
+  def sort!(*args, &block); end
+  def sort(*args, &block); end
+  def sort_by!(*args, &block); end
+  def sort_by(*args, &block); end
+  def sub!(pat, rep); end
+  def sub(pat, rep); end
+  def sum(*args, &block); end
+  def take(*args, &block); end
+  def take_while(*args, &block); end
+  def tally(*args, &block); end
+  def to_a; end
+  def to_ary; end
+  def to_h(*args, &block); end
+  def to_s; end
+  def to_set(*args, &block); end
+  def transpose(*args, &block); end
+  def union(*args, &block); end
+  def uniq!(*args, &block); end
+  def uniq(*args, &block); end
+  def unshift(*args, &block); end
+  def values_at(*args, &block); end
+  def zip(*args, &block); end
+  def |(*args, &block); end
+  include Rake::Cloneable
+end
+class Rake::Promise
+  def chore; end
+  def complete?; end
+  def discard; end
+  def error?; end
+  def initialize(args, &block); end
+  def recorder; end
+  def recorder=(arg0); end
+  def result?; end
+  def stat(*args); end
+  def value; end
+  def work; end
+end
+class Rake::ThreadPool
+  def __queue__; end
+  def future(*args, &block); end
+  def gather_history; end
+  def history; end
+  def initialize(thread_count); end
+  def join; end
+  def process_queue_item; end
+  def safe_thread_count; end
+  def start_thread; end
+  def stat(event, data = nil); end
+  def statistics; end
+end
+module Rake::PrivateReader
+  def self.included(base); end
+end
+module Rake::PrivateReader::ClassMethods
+  def private_reader(*names); end
+end
+class Rake::ThreadHistoryDisplay
+  def initialize(stats); end
+  def items; end
+  def rename(hash, key, renames); end
+  def show; end
+  def stats; end
+  def threads; end
+  extend Rake::PrivateReader::ClassMethods
+  include Rake::PrivateReader
+end
+module Rake::TraceOutput
+  def trace_on(out, *strings); end
+end
+class Rake::CommandLineOptionError < StandardError
+end
+class Rake::Application
+  def add_import(fn); end
+  def add_loader(ext, loader); end
+  def collect_command_line_tasks(args); end
+  def default_task_name; end
+  def deprecate(old_usage, new_usage, call_site); end
+  def display_cause_details(ex); end
+  def display_error_message(ex); end
+  def display_exception_backtrace(ex); end
+  def display_exception_details(ex); end
+  def display_exception_details_seen; end
+  def display_exception_message_details(ex); end
+  def display_prerequisites; end
+  def display_tasks_and_comments; end
+  def dynamic_width; end
+  def dynamic_width_stty; end
+  def dynamic_width_tput; end
+  def exit_because_of_exception(ex); end
+  def find_rakefile_location; end
+  def glob(path, &block); end
+  def handle_options(argv); end
+  def has_cause?(ex); end
+  def has_chain?(exception); end
+  def have_rakefile; end
+  def init(app_name = nil, argv = nil); end
+  def initialize; end
+  def invoke_task(task_string); end
+  def load_imports; end
+  def load_rakefile; end
+  def name; end
+  def options; end
+  def original_dir; end
+  def parse_task_string(string); end
+  def print_rakefile_directory(location); end
+  def rake_require(file_name, paths = nil, loaded = nil); end
+  def rakefile; end
+  def rakefile_location(backtrace = nil); end
+  def raw_load_rakefile; end
+  def run(argv = nil); end
+  def run_with_threads; end
+  def select_tasks_to_show(options, show_tasks, value); end
+  def select_trace_output(options, trace_option, value); end
+  def set_default_options; end
+  def sort_options(options); end
+  def standard_exception_handling; end
+  def standard_rake_options; end
+  def standard_system_dir; end
+  def system_dir; end
+  def terminal_columns; end
+  def terminal_columns=(arg0); end
+  def terminal_width; end
+  def thread_pool; end
+  def top_level; end
+  def top_level_tasks; end
+  def trace(*strings); end
+  def truncate(string, width); end
+  def truncate_output?; end
+  def tty_output=(arg0); end
+  def tty_output?; end
+  def unix?; end
+  def windows?; end
+  include Rake::TaskManager
+  include Rake::TraceOutput
+end
+class Rake::PseudoStatus
+  def >>(n); end
+  def exited?; end
+  def exitstatus; end
+  def initialize(code = nil); end
+  def stopped?; end
+  def to_i; end
+end
+class Rake::TaskArguments
+  def [](index); end
+  def each(&block); end
+  def extras; end
+  def fetch(*args, &block); end
+  def has_key?(key); end
+  def initialize(names, values, parent = nil); end
+  def inspect; end
+  def key?(key); end
+  def lookup(name); end
+  def method_missing(sym, *args); end
+  def names; end
+  def new_scope(names); end
+  def to_a; end
+  def to_hash; end
+  def to_s; end
+  def values_at(*keys); end
+  def with_defaults(defaults); end
+  include Enumerable
+end
+class Rake::InvocationChain < Rake::LinkedList
+  def append(invocation); end
+  def member?(invocation); end
+  def prefix; end
+  def self.append(invocation, chain); end
+  def to_s; end
+end
+class Rake::InvocationChain::EmptyInvocationChain < Rake::LinkedList::EmptyLinkedList
+  def append(invocation); end
+  def member?(obj); end
+  def to_s; end
+end
+module Rake::InvocationExceptionMixin
+  def chain; end
+  def chain=(value); end
+end
+class Rake::Task
+  def actions; end
+  def add_chain_to(exception, new_chain); end
+  def add_comment(comment); end
+  def add_description(description); end
+  def all_prerequisite_tasks; end
+  def already_invoked; end
+  def application; end
+  def application=(arg0); end
+  def arg_description; end
+  def arg_names; end
+  def clear; end
+  def clear_actions; end
+  def clear_args; end
+  def clear_comments; end
+  def clear_prerequisites; end
+  def collect_prerequisites(seen); end
+  def comment; end
+  def comment=(comment); end
+  def enhance(deps = nil, &block); end
+  def execute(args = nil); end
+  def first_sentence(string); end
+  def format_trace_flags; end
+  def full_comment; end
+  def initialize(task_name, app); end
+  def inspect; end
+  def investigation; end
+  def invoke(*args); end
+  def invoke_prerequisites(task_args, invocation_chain); end
+  def invoke_prerequisites_concurrently(task_args, invocation_chain); end
+  def invoke_with_call_chain(task_args, invocation_chain); end
+  def locations; end
+  def lookup_prerequisite(prerequisite_name); end
+  def name; end
+  def name_with_args; end
+  def needed?; end
+  def prereqs; end
+  def prerequisite_tasks; end
+  def prerequisites; end
+  def reenable; end
+  def scope; end
+  def self.[](task_name); end
+  def self.clear; end
+  def self.create_rule(*args, &block); end
+  def self.define_task(*args, &block); end
+  def self.scope_name(scope, task_name); end
+  def self.task_defined?(task_name); end
+  def self.tasks; end
+  def set_arg_names(args); end
+  def source; end
+  def sources; end
+  def sources=(arg0); end
+  def timestamp; end
+  def to_s; end
+  def transform_comments(separator, &block); end
+end
+class Rake::EarlyTime
+  def <=>(other); end
+  def self.allocate; end
+  def self.new(*arg0); end
+  def to_s; end
+  extend Singleton::SingletonClassMethods
+  include Comparable
+  include Singleton
+end
+class Rake::FileTask < Rake::Task
+  def needed?; end
+  def out_of_date?(stamp); end
+  def self.scope_name(scope, task_name); end
+  def timestamp; end
+end
+class Rake::FileCreationTask < Rake::FileTask
+  def needed?; end
+  def timestamp; end
+end
+class Rake::MultiTask < Rake::Task
+  def invoke_prerequisites(task_args, invocation_chain); end
+end
+module Rake::DSL
+  def cd(*args, &block); end
+  def chdir(*args, &block); end
+  def chmod(*args, &block); end
+  def chmod_R(*args, &block); end
+  def chown(*args, &block); end
+  def chown_R(*args, &block); end
+  def copy(*args, &block); end
+  def cp(*args, &block); end
+  def cp_lr(*args, &block); end
+  def cp_r(*args, &block); end
+  def desc(description); end
+  def directory(*args, &block); end
+  def file(*args, &block); end
+  def file_create(*args, &block); end
+  def import(*fns); end
+  def install(*args, &block); end
+  def link(*args, &block); end
+  def ln(*args, &block); end
+  def ln_s(*args, &block); end
+  def ln_sf(*args, &block); end
+  def makedirs(*args, &block); end
+  def mkdir(*args, &block); end
+  def mkdir_p(*args, &block); end
+  def mkpath(*args, &block); end
+  def move(*args, &block); end
+  def multitask(*args, &block); end
+  def mv(*args, &block); end
+  def namespace(name = nil, &block); end
+  def nowrite(value = nil); end
+  def rake_check_options(options, *optdecl); end
+  def rake_merge_option(args, defaults); end
+  def rake_output_message(message); end
+  def remove(*args, &block); end
+  def rm(*args, &block); end
+  def rm_f(*args, &block); end
+  def rm_r(*args, &block); end
+  def rm_rf(*args, &block); end
+  def rmdir(*args, &block); end
+  def rmtree(*args, &block); end
+  def ruby(*args, &block); end
+  def rule(*args, &block); end
+  def safe_ln(*args); end
+  def safe_unlink(*args, &block); end
+  def sh(*cmd, &block); end
+  def split_all(path); end
+  def symlink(*args, &block); end
+  def task(*args, &block); end
+  def touch(*args, &block); end
+  def verbose(value = nil); end
+  def when_writing(msg = nil); end
+  include Rake::FileUtilsExt
+end
+class Rake::DefaultLoader
+  def load(fn); end
+end
+class Rake::LateTime
+  def <=>(other); end
+  def self.allocate; end
+  def self.new(*arg0); end
+  def to_s; end
+  extend Singleton::SingletonClassMethods
+  include Comparable
+  include Singleton
+end
+class Rake::NameSpace
+  def [](name); end
+  def initialize(task_manager, scope_list); end
+  def scope; end
+  def tasks; end
+end
+module Rake::Backtrace
+  def self.collapse(backtrace); end
+end
diff --git a/sorbet/rbi/gems/rdoc.rbi b/sorbet/rbi/gems/rdoc.rbi
new file mode 100644
index 0000000..92bff85
--- /dev/null
+++ b/sorbet/rbi/gems/rdoc.rbi
@@ -0,0 +1,109 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rdoc/all/rdoc.rbi
+#
+# rdoc-5.1.0
+
+module RDoc
+  def self.load_yaml; end
+end
+class RDoc::Error < RuntimeError
+end
+class RDoc::Options
+  def ==(other); end
+  def charset; end
+  def charset=(arg0); end
+  def check_files; end
+  def check_generator; end
+  def coverage_report; end
+  def coverage_report=(arg0); end
+  def default_title=(string); end
+  def dry_run; end
+  def dry_run=(arg0); end
+  def encode_with(coder); end
+  def encoding; end
+  def encoding=(arg0); end
+  def exclude; end
+  def exclude=(arg0); end
+  def files; end
+  def files=(arg0); end
+  def finish; end
+  def finish_page_dir; end
+  def force_output; end
+  def force_output=(arg0); end
+  def force_update; end
+  def force_update=(arg0); end
+  def formatter; end
+  def formatter=(arg0); end
+  def generator; end
+  def generator=(arg0); end
+  def generator_descriptions; end
+  def generator_name; end
+  def generator_options; end
+  def generator_options=(arg0); end
+  def hyperlink_all; end
+  def hyperlink_all=(arg0); end
+  def init_ivars; end
+  def init_with(map); end
+  def initialize; end
+  def line_numbers; end
+  def line_numbers=(arg0); end
+  def locale; end
+  def locale=(arg0); end
+  def locale_dir; end
+  def locale_dir=(arg0); end
+  def main_page; end
+  def main_page=(arg0); end
+  def markup; end
+  def markup=(arg0); end
+  def op_dir; end
+  def op_dir=(arg0); end
+  def option_parser; end
+  def option_parser=(arg0); end
+  def output_decoration; end
+  def output_decoration=(arg0); end
+  def page_dir; end
+  def page_dir=(arg0); end
+  def parse(argv); end
+  def pipe; end
+  def pipe=(arg0); end
+  def quiet; end
+  def quiet=(bool); end
+  def rdoc_include; end
+  def rdoc_include=(arg0); end
+  def root; end
+  def root=(arg0); end
+  def sanitize_path(path); end
+  def setup_generator(generator_name = nil); end
+  def show_hash; end
+  def show_hash=(arg0); end
+  def static_path; end
+  def static_path=(arg0); end
+  def tab_width; end
+  def tab_width=(arg0); end
+  def template; end
+  def template=(arg0); end
+  def template_dir; end
+  def template_dir=(arg0); end
+  def template_dir_for(template); end
+  def template_stylesheets; end
+  def template_stylesheets=(arg0); end
+  def title; end
+  def title=(arg0); end
+  def update_output_dir; end
+  def update_output_dir=(arg0); end
+  def verbosity; end
+  def verbosity=(arg0); end
+  def visibility; end
+  def visibility=(visibility); end
+  def warn(message); end
+  def webcvs; end
+  def webcvs=(arg0); end
+  def write_options; end
+  def yaml_initialize(tag, map); end
+end
diff --git a/sorbet/rbi/gems/rspec-core.rbi b/sorbet/rbi/gems/rspec-core.rbi
new file mode 100644
index 0000000..76b78d1
--- /dev/null
+++ b/sorbet/rbi/gems/rspec-core.rbi
@@ -0,0 +1,1952 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rspec-core/all/rspec-core.rbi
+#
+# rspec-core-3.10.1
+
+module RSpec
+  def self.clear_examples; end
+  def self.configuration; end
+  def self.configuration=(arg0); end
+  def self.configure; end
+  def self.const_missing(name); end
+  def self.context(*args, &example_group_block); end
+  def self.current_example; end
+  def self.current_example=(example); end
+  def self.describe(*args, &example_group_block); end
+  def self.example_group(*args, &example_group_block); end
+  def self.fcontext(*args, &example_group_block); end
+  def self.fdescribe(*args, &example_group_block); end
+  def self.reset; end
+  def self.shared_context(name, *args, &block); end
+  def self.shared_examples(name, *args, &block); end
+  def self.shared_examples_for(name, *args, &block); end
+  def self.world; end
+  def self.world=(arg0); end
+  def self.xcontext(*args, &example_group_block); end
+  def self.xdescribe(*args, &example_group_block); end
+  extend RSpec::Core::Warnings
+end
+module RSpec::Core
+  def self.path_to_executable; end
+end
+module RSpec::Core::Version
+end
+module RSpec::Core::Warnings
+  def deprecate(deprecated, data = nil); end
+  def warn_deprecation(message, opts = nil); end
+  def warn_with(message, options = nil); end
+end
+class RSpec::Core::Set
+  def <<(key); end
+  def clear; end
+  def delete(key); end
+  def each(&block); end
+  def empty?; end
+  def include?(key); end
+  def initialize(array = nil); end
+  def merge(values); end
+  include Enumerable
+end
+module RSpec::Core::FlatMap
+  def flat_map(array, &block); end
+  def self.flat_map(array, &block); end
+end
+class RSpec::Core::FilterManager
+  def add_ids(rerun_path, scoped_ids); end
+  def add_location(file_path, line_numbers); end
+  def add_path_to_arrays_filter(filter_key, path, values); end
+  def empty?; end
+  def exclude(*args); end
+  def exclude_only(*args); end
+  def exclude_with_low_priority(*args); end
+  def exclusions; end
+  def file_scoped_include?(ex_metadata, ids, locations); end
+  def include(*args); end
+  def include_only(*args); end
+  def include_with_low_priority(*args); end
+  def inclusions; end
+  def initialize; end
+  def prune(examples); end
+  def prune_conditionally_filtered_examples(examples); end
+end
+class RSpec::Core::FilterRules
+  def [](key); end
+  def add(updated); end
+  def add_with_low_priority(updated); end
+  def clear; end
+  def delete(key); end
+  def description; end
+  def each_pair(&block); end
+  def empty?; end
+  def fetch(*args, &block); end
+  def include_example?(example); end
+  def initialize(rules = nil); end
+  def opposite; end
+  def opposite=(arg0); end
+  def rules; end
+  def self.build; end
+  def use_only(updated); end
+end
+class RSpec::Core::InclusionRules < RSpec::Core::FilterRules
+  def add(*args); end
+  def add_with_low_priority(*args); end
+  def apply_standalone_filter(updated); end
+  def include_example?(example); end
+  def is_standalone_filter?(rules); end
+  def replace_filters(new_rules); end
+  def split_file_scoped_rules; end
+  def standalone?; end
+end
+module RSpec::Core::DSL
+  def self.change_global_dsl(&changes); end
+  def self.example_group_aliases; end
+  def self.expose_example_group_alias(name); end
+  def self.expose_example_group_alias_globally(method_name); end
+  def self.expose_globally!; end
+  def self.exposed_globally?; end
+  def self.remove_globally!; end
+  def self.top_level; end
+  def self.top_level=(arg0); end
+end
+module RSpec::Core::Formatters
+  def self.register(formatter_class, *notifications); end
+end
+module RSpec::Core::Formatters::ConsoleCodes
+  def config_colors_to_methods; end
+  def console_code_for(code_or_symbol); end
+  def self.config_colors_to_methods; end
+  def self.console_code_for(code_or_symbol); end
+  def self.wrap(text, code_or_symbol); end
+  def wrap(text, code_or_symbol); end
+end
+class RSpec::Core::Formatters::SnippetExtractor
+  def beginning_line_number; end
+  def expression_lines; end
+  def expression_node; end
+  def expression_outmost_node?(node); end
+  def initialize(source, beginning_line_number, max_line_count = nil); end
+  def line_range_of_expression; end
+  def line_range_of_location_nodes_in_expression; end
+  def location_nodes_at_beginning_line; end
+  def max_line_count; end
+  def self.extract_expression_lines_at(file_path, beginning_line_number, max_line_count = nil); end
+  def self.extract_line_at(file_path, line_number); end
+  def self.least_indentation_from(lines); end
+  def self.source_from_file(path); end
+  def source; end
+  def unclosed_tokens_in_line_range(line_range); end
+end
+class RSpec::Core::Formatters::SnippetExtractor::NoSuchFileError < StandardError
+end
+class RSpec::Core::Formatters::SnippetExtractor::NoSuchLineError < StandardError
+end
+class RSpec::Core::Formatters::SnippetExtractor::NoExpressionAtLineError < StandardError
+end
+class RSpec::Core::Formatters::SyntaxHighlighter
+  def color_enabled_implementation; end
+  def highlight(lines); end
+  def implementation; end
+  def initialize(configuration); end
+  def self.attempt_to_add_rspec_terms_to_coderay_keywords; end
+end
+module RSpec::Core::Formatters::SyntaxHighlighter::CodeRayImplementation
+  def self.highlight_syntax(lines); end
+end
+module RSpec::Core::Formatters::SyntaxHighlighter::NoSyntaxHighlightingImplementation
+  def self.highlight_syntax(lines); end
+end
+class RSpec::Core::Formatters::ExceptionPresenter
+  def add_shared_group_lines(lines, colorizer); end
+  def backtrace_formatter; end
+  def colorized_formatted_backtrace(colorizer = nil); end
+  def colorized_message_lines(colorizer = nil); end
+  def description; end
+  def detail_formatter; end
+  def encoded_description(description); end
+  def encoded_string(string); end
+  def encoding_of(string); end
+  def example; end
+  def exception; end
+  def exception_backtrace; end
+  def exception_class_name(exception = nil); end
+  def exception_lines; end
+  def exception_message_string(exception); end
+  def extra_detail_formatter; end
+  def extra_failure_lines; end
+  def failure_lines; end
+  def failure_slash_error_lines; end
+  def final_exception(exception, previous = nil); end
+  def find_failed_line; end
+  def formatted_backtrace(exception = nil); end
+  def formatted_cause(exception); end
+  def formatted_message_and_backtrace(colorizer); end
+  def fully_formatted(failure_number, colorizer = nil); end
+  def fully_formatted_lines(failure_number, colorizer); end
+  def indent_lines(lines, failure_number); end
+  def initialize(exception, example, options = nil); end
+  def message_color; end
+  def message_lines; end
+  def read_failed_lines; end
+end
+class RSpec::Core::Formatters::ExceptionPresenter::Factory
+  def build; end
+  def initialize(example); end
+  def multiple_exception_summarizer(exception, prior_detail_formatter, color); end
+  def multiple_exceptions_error?(exception); end
+  def options; end
+  def pending_options; end
+  def sub_failure_list_formatter(exception, message_color); end
+  def with_multiple_error_options_as_needed(exception, options); end
+end
+module RSpec::Core::Formatters::ExceptionPresenter::Factory::EmptyBacktraceFormatter
+  def self.format_backtrace(*arg0); end
+end
+class RSpec::Core::Formatters::ExceptionPresenter::Factory::CommonBacktraceTruncater
+  def initialize(parent); end
+  def with_truncated_backtrace(child); end
+end
+class RSpec::Core::MultipleExceptionError < StandardError
+  def aggregation_block_label; end
+  def aggregation_metadata; end
+  def all_exceptions; end
+  def exception_count_description; end
+  def failures; end
+  def initialize(*exceptions); end
+  def message; end
+  def other_errors; end
+  def summary; end
+  include RSpec::Core::MultipleExceptionError::InterfaceTag
+end
+module RSpec::Core::MultipleExceptionError::InterfaceTag
+  def add(exception); end
+  def self.for(ex); end
+end
+module RSpec::Core::ShellEscape
+  def conditionally_quote(id); end
+  def escape(shell_command); end
+  def quote(argument); end
+  def self.conditionally_quote(id); end
+  def self.escape(shell_command); end
+  def self.quote(argument); end
+  def self.shell_allows_unquoted_ids?; end
+  def shell_allows_unquoted_ids?; end
+end
+module RSpec::Core::Formatters::Helpers
+  def self.format_duration(duration); end
+  def self.format_seconds(float, precision = nil); end
+  def self.organize_ids(ids); end
+  def self.pluralize(count, string); end
+  def self.strip_trailing_zeroes(string); end
+end
+module RSpec::Core::Notifications
+end
+module RSpec::Core::Notifications::NullColorizer
+  def self.wrap(line, _code_or_symbol); end
+  def wrap(line, _code_or_symbol); end
+end
+class RSpec::Core::Notifications::StartNotification < Struct
+  def count; end
+  def count=(_); end
+  def load_time; end
+  def load_time=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::ExampleNotification < Struct
+  def example; end
+  def example=(_); end
+  def self.[](*arg0); end
+  def self.for(example); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::ExamplesNotification
+  def examples; end
+  def failed_examples; end
+  def failure_notifications; end
+  def format_examples(examples); end
+  def fully_formatted_failed_examples(colorizer = nil); end
+  def fully_formatted_pending_examples(colorizer = nil); end
+  def initialize(reporter); end
+  def notifications; end
+  def pending_examples; end
+  def pending_notifications; end
+end
+class RSpec::Core::Notifications::FailedExampleNotification < RSpec::Core::Notifications::ExampleNotification
+  def colorized_formatted_backtrace(colorizer = nil); end
+  def colorized_message_lines(colorizer = nil); end
+  def description; end
+  def exception; end
+  def formatted_backtrace; end
+  def fully_formatted(failure_number, colorizer = nil); end
+  def fully_formatted_lines(failure_number, colorizer = nil); end
+  def initialize(example, exception_presenter = nil); end
+  def message_lines; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::PendingExampleFixedNotification < RSpec::Core::Notifications::FailedExampleNotification
+end
+class RSpec::Core::Notifications::PendingExampleFailedAsExpectedNotification < RSpec::Core::Notifications::FailedExampleNotification
+end
+class RSpec::Core::Notifications::SkippedExampleNotification < RSpec::Core::Notifications::ExampleNotification
+  def fully_formatted(pending_number, colorizer = nil); end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::GroupNotification < Struct
+  def group; end
+  def group=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::MessageNotification < Struct
+  def message; end
+  def message=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::SeedNotification < Struct
+  def fully_formatted; end
+  def seed; end
+  def seed=(_); end
+  def seed_used?; end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def used; end
+  def used=(_); end
+end
+class RSpec::Core::Notifications::SummaryNotification < Struct
+  def colorized_rerun_commands(colorizer = nil); end
+  def colorized_totals_line(colorizer = nil); end
+  def duplicate_rerun_locations; end
+  def duration; end
+  def duration=(_); end
+  def errors_outside_of_examples_count; end
+  def errors_outside_of_examples_count=(_); end
+  def example_count; end
+  def examples; end
+  def examples=(_); end
+  def failed_examples; end
+  def failed_examples=(_); end
+  def failure_count; end
+  def formatted_duration; end
+  def formatted_load_time; end
+  def fully_formatted(colorizer = nil); end
+  def load_time; end
+  def load_time=(_); end
+  def pending_count; end
+  def pending_examples; end
+  def pending_examples=(_); end
+  def rerun_argument_for(example); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def totals_line; end
+  include RSpec::Core::ShellEscape
+end
+class RSpec::Core::Notifications::ProfileNotification
+  def calculate_slowest_groups; end
+  def duration; end
+  def examples; end
+  def initialize(duration, examples, number_of_examples, example_groups); end
+  def number_of_examples; end
+  def percentage; end
+  def slow_duration; end
+  def slowest_examples; end
+  def slowest_groups; end
+end
+class RSpec::Core::Notifications::DeprecationNotification < Struct
+  def call_site; end
+  def call_site=(_); end
+  def deprecated; end
+  def deprecated=(_); end
+  def message; end
+  def message=(_); end
+  def replacement; end
+  def replacement=(_); end
+  def self.[](*arg0); end
+  def self.from_hash(data); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::NullNotification
+end
+class RSpec::Core::Notifications::CustomNotification < Struct
+  def self.for(options = nil); end
+end
+class RSpec::Core::Reporter
+  def abort_with(msg, exit_status); end
+  def close; end
+  def close_after; end
+  def deprecation(hash); end
+  def ensure_listeners_ready; end
+  def example_failed(example); end
+  def example_finished(example); end
+  def example_group_finished(group); end
+  def example_group_started(group); end
+  def example_passed(example); end
+  def example_pending(example); end
+  def example_started(example); end
+  def examples; end
+  def exit_early(exit_code); end
+  def fail_fast_limit_met?; end
+  def failed_examples; end
+  def finish; end
+  def initialize(configuration); end
+  def message(message); end
+  def mute_profile_output?; end
+  def notify(event, notification); end
+  def notify_non_example_exception(exception, context_description); end
+  def pending_examples; end
+  def prepare_default(loader, output_stream, deprecation_stream); end
+  def publish(event, options = nil); end
+  def register_listener(listener, *notifications); end
+  def registered_listeners(notification); end
+  def report(expected_example_count); end
+  def seed_used?; end
+  def start(expected_example_count, time = nil); end
+  def stop; end
+end
+class RSpec::Core::NullReporter
+  def self.method_missing(*arg0); end
+end
+module RSpec::Core::Hooks
+  def after(*args, &block); end
+  def append_after(*args, &block); end
+  def append_before(*args, &block); end
+  def around(*args, &block); end
+  def before(*args, &block); end
+  def hooks; end
+  def prepend_after(*args, &block); end
+  def prepend_before(*args, &block); end
+end
+class RSpec::Core::Hooks::Hook < Struct
+  def block; end
+  def block=(_); end
+  def options; end
+  def options=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Hooks::BeforeHook < RSpec::Core::Hooks::Hook
+  def run(example); end
+end
+class RSpec::Core::Hooks::AfterHook < RSpec::Core::Hooks::Hook
+  def run(example); end
+end
+class RSpec::Core::Hooks::AfterContextHook < RSpec::Core::Hooks::Hook
+  def run(example); end
+end
+class RSpec::Core::Hooks::AroundHook < RSpec::Core::Hooks::Hook
+  def execute_with(example, procsy); end
+  def hook_description; end
+end
+class RSpec::Core::Hooks::HookCollections
+  def all_hooks_for(position, scope); end
+  def ensure_hooks_initialized_for(position, scope); end
+  def extract_scope_from(args); end
+  def hooks_for(position, scope); end
+  def initialize(owner, filterable_item_repo_class); end
+  def known_scope?(scope); end
+  def matching_hooks_for(position, scope, example_or_group); end
+  def normalized_scope_for(scope); end
+  def owner_parent_groups; end
+  def process(host, parent_groups, globals, position, scope); end
+  def processable_hooks_for(position, scope, host); end
+  def register(prepend_or_append, position, *args, &block); end
+  def register_global_singleton_context_hooks(example, globals); end
+  def register_globals(host, globals); end
+  def run(position, scope, example_or_group); end
+  def run_around_example_hooks_for(example); end
+  def run_example_hooks_for(example, position, each_method); end
+  def run_owned_hooks_for(position, scope, example_or_group); end
+  def scope_and_options_from(*args); end
+end
+module RSpec::Core::MemoizedHelpers
+  def __init_memoized; end
+  def __memoized; end
+  def initialize(*arg0); end
+  def is_expected; end
+  def self.define_helpers_on(example_group); end
+  def self.get_constant_or_yield(example_group, name); end
+  def self.module_for(example_group); end
+  def should(matcher = nil, message = nil); end
+  def should_not(matcher = nil, message = nil); end
+  def subject; end
+end
+class RSpec::Core::MemoizedHelpers::ThreadsafeMemoized
+  def fetch_or_store(key); end
+  def initialize; end
+end
+class RSpec::Core::MemoizedHelpers::NonThreadSafeMemoized
+  def fetch_or_store(key); end
+  def initialize; end
+end
+class RSpec::Core::MemoizedHelpers::ContextHookMemoized
+  def self.fetch_or_store(key, &_block); end
+  def self.isolate_for_context_hook(example_group_instance); end
+end
+class RSpec::Core::MemoizedHelpers::ContextHookMemoized::Before < RSpec::Core::MemoizedHelpers::ContextHookMemoized
+  def self.article; end
+  def self.hook_expression; end
+  def self.hook_intention; end
+end
+class RSpec::Core::MemoizedHelpers::ContextHookMemoized::After < RSpec::Core::MemoizedHelpers::ContextHookMemoized
+  def self.article; end
+  def self.hook_expression; end
+  def self.hook_intention; end
+end
+module RSpec::Core::MemoizedHelpers::ClassMethods
+  def let!(name, &block); end
+  def let(name, &block); end
+  def subject!(name = nil, &block); end
+  def subject(name = nil, &block); end
+end
+module RSpec::Core::Metadata
+  def self.ascend(metadata); end
+  def self.ascending(metadata); end
+  def self.build_hash_from(args, warn_about_example_group_filtering = nil); end
+  def self.deep_hash_dup(object); end
+  def self.id_from(metadata); end
+  def self.location_tuple_from(metadata); end
+  def self.relative_path(line); end
+  def self.relative_path_regex; end
+end
+class RSpec::Core::Metadata::HashPopulator
+  def block; end
+  def build_description_from(parent_description = nil, my_description = nil); end
+  def build_scoped_id_for(file_path); end
+  def description_args; end
+  def description_separator(parent_part, child_part); end
+  def ensure_valid_user_keys; end
+  def file_path_and_line_number_from(backtrace); end
+  def initialize(metadata, user_metadata, index_provider, description_args, block); end
+  def metadata; end
+  def populate; end
+  def populate_location_attributes; end
+  def user_metadata; end
+end
+class RSpec::Core::Metadata::ExampleHash < RSpec::Core::Metadata::HashPopulator
+  def described_class; end
+  def full_description; end
+  def self.create(group_metadata, user_metadata, index_provider, description, block); end
+end
+class RSpec::Core::Metadata::ExampleGroupHash < RSpec::Core::Metadata::HashPopulator
+  def described_class; end
+  def full_description; end
+  def self.backwards_compatibility_default_proc(&example_group_selector); end
+  def self.create(parent_group_metadata, user_metadata, example_group_index, *args, &block); end
+  def self.hash_with_backwards_compatibility_default_proc; end
+end
+module RSpec::Core::HashImitatable
+  def <(*args, &block); end
+  def <=(*args, &block); end
+  def >(*args, &block); end
+  def >=(*args, &block); end
+  def [](key); end
+  def []=(key, value); end
+  def all?(*args, &block); end
+  def any?(*args, &block); end
+  def assoc(*args, &block); end
+  def chain(*args, &block); end
+  def chunk(*args, &block); end
+  def chunk_while(*args, &block); end
+  def clear(*args, &block); end
+  def collect(*args, &block); end
+  def collect_concat(*args, &block); end
+  def compact!(*args, &block); end
+  def compact(*args, &block); end
+  def compare_by_identity(*args, &block); end
+  def compare_by_identity?(*args, &block); end
+  def count(*args, &block); end
+  def cycle(*args, &block); end
+  def deconstruct_keys(*args, &block); end
+  def default(*args, &block); end
+  def default=(*args, &block); end
+  def default_proc(*args, &block); end
+  def default_proc=(*args, &block); end
+  def delete(*args, &block); end
+  def delete_if(*args, &block); end
+  def detect(*args, &block); end
+  def dig(*args, &block); end
+  def directly_supports_attribute?(name); end
+  def drop(*args, &block); end
+  def drop_while(*args, &block); end
+  def each(*args, &block); end
+  def each_cons(*args, &block); end
+  def each_entry(*args, &block); end
+  def each_key(*args, &block); end
+  def each_pair(*args, &block); end
+  def each_slice(*args, &block); end
+  def each_value(*args, &block); end
+  def each_with_index(*args, &block); end
+  def each_with_object(*args, &block); end
+  def empty?(*args, &block); end
+  def entries(*args, &block); end
+  def extra_hash_attributes; end
+  def fetch(*args, &block); end
+  def fetch_values(*args, &block); end
+  def filter!(*args, &block); end
+  def filter(*args, &block); end
+  def filter_map(*args, &block); end
+  def find(*args, &block); end
+  def find_all(*args, &block); end
+  def find_index(*args, &block); end
+  def first(*args, &block); end
+  def flat_map(*args, &block); end
+  def flatten(*args, &block); end
+  def get_value(name); end
+  def grep(*args, &block); end
+  def grep_v(*args, &block); end
+  def group_by(*args, &block); end
+  def has_key?(*args, &block); end
+  def has_value?(*args, &block); end
+  def hash_for_delegation; end
+  def include?(*args, &block); end
+  def index(*args, &block); end
+  def inject(*args, &block); end
+  def invert(*args, &block); end
+  def issue_deprecation(_method_name, *_args); end
+  def keep_if(*args, &block); end
+  def key(*args, &block); end
+  def key?(*args, &block); end
+  def keys(*args, &block); end
+  def lazy(*args, &block); end
+  def length(*args, &block); end
+  def map(*args, &block); end
+  def max(*args, &block); end
+  def max_by(*args, &block); end
+  def member?(*args, &block); end
+  def merge!(*args, &block); end
+  def merge(*args, &block); end
+  def min(*args, &block); end
+  def min_by(*args, &block); end
+  def minmax(*args, &block); end
+  def minmax_by(*args, &block); end
+  def none?(*args, &block); end
+  def one?(*args, &block); end
+  def partition(*args, &block); end
+  def rassoc(*args, &block); end
+  def reduce(*args, &block); end
+  def rehash(*args, &block); end
+  def reject!(*args, &block); end
+  def reject(*args, &block); end
+  def rekey!(*args, &block); end
+  def rekey(*args, &block); end
+  def replace(*args, &block); end
+  def retrieve(*args, &block); end
+  def reverse_each(*args, &block); end
+  def select!(*args, &block); end
+  def select(*args, &block); end
+  def self.included(klass); end
+  def set_value(name, value); end
+  def shift(*args, &block); end
+  def size(*args, &block); end
+  def slice(*args, &block); end
+  def slice_after(*args, &block); end
+  def slice_before(*args, &block); end
+  def slice_when(*args, &block); end
+  def sort(*args, &block); end
+  def sort_by(*args, &block); end
+  def store(*args, &block); end
+  def sum(*args, &block); end
+  def take(*args, &block); end
+  def take_while(*args, &block); end
+  def tally(*args, &block); end
+  def to_a(*args, &block); end
+  def to_h; end
+  def to_hash(*args, &block); end
+  def to_proc(*args, &block); end
+  def to_set(*args, &block); end
+  def transform_keys!(*args, &block); end
+  def transform_keys(*args, &block); end
+  def transform_values!(*args, &block); end
+  def transform_values(*args, &block); end
+  def uniq(*args, &block); end
+  def update(*args, &block); end
+  def value?(*args, &block); end
+  def values(*args, &block); end
+  def values_at(*args, &block); end
+  def zip(*args, &block); end
+end
+module RSpec::Core::HashImitatable::ClassMethods
+  def attr_accessor(*names); end
+  def hash_attribute_names; end
+end
+class RSpec::Core::LegacyExampleGroupHash
+  def directly_supports_attribute?(name); end
+  def get_value(name); end
+  def initialize(metadata); end
+  def set_value(name, value); end
+  def to_h; end
+  extend RSpec::Core::HashImitatable::ClassMethods
+  include RSpec::Core::HashImitatable
+end
+module RSpec::Core::MetadataFilter
+  def self.apply?(predicate, filters, metadata); end
+  def self.filter_applies?(key, filter_value, metadata); end
+  def self.filter_applies_to_any_value?(key, value, metadata); end
+  def self.filters_apply?(key, value, metadata); end
+  def self.id_filter_applies?(rerun_paths_to_scoped_ids, metadata); end
+  def self.location_filter_applies?(locations, metadata); end
+  def self.proc_filter_applies?(key, proc, metadata); end
+  def self.silence_metadata_example_group_deprecations; end
+end
+module RSpec::Core::FilterableItemRepository
+end
+class RSpec::Core::FilterableItemRepository::UpdateOptimized
+  def append(item, metadata); end
+  def delete(item, metadata); end
+  def initialize(applies_predicate); end
+  def items_and_filters; end
+  def items_for(request_meta); end
+  def prepend(item, metadata); end
+end
+class RSpec::Core::FilterableItemRepository::QueryOptimized < RSpec::Core::FilterableItemRepository::UpdateOptimized
+  def append(item, metadata); end
+  def applicable_metadata_from(metadata); end
+  def delete(item, metadata); end
+  def find_items_for(request_meta); end
+  def handle_mutation(metadata); end
+  def initialize(applies_predicate); end
+  def items_for(metadata); end
+  def prepend(item, metadata); end
+  def proc_keys_from(metadata); end
+  def reconstruct_caches; end
+end
+module RSpec::Core::Pending
+  def pending(message = nil); end
+  def self.mark_fixed!(example); end
+  def self.mark_pending!(example, message_or_bool); end
+  def self.mark_skipped!(example, message_or_bool); end
+  def skip(message = nil); end
+end
+class RSpec::Core::Pending::SkipDeclaredInExample < StandardError
+  def argument; end
+  def initialize(argument); end
+end
+class RSpec::Core::Pending::PendingExampleFixedError < StandardError
+end
+class RSpec::Core::Formatters::Loader
+  def add(formatter_to_use, *paths); end
+  def built_in_formatter(key); end
+  def custom_formatter(formatter_ref); end
+  def default_formatter; end
+  def default_formatter=(arg0); end
+  def duplicate_formatter_exists?(new_formatter); end
+  def existing_formatter_implements?(notification); end
+  def find_formatter(formatter_to_use); end
+  def formatters; end
+  def initialize(reporter); end
+  def notifications_for(formatter_class); end
+  def open_stream(path_or_wrapper); end
+  def path_for(const_ref); end
+  def prepare_default(output_stream, deprecation_stream); end
+  def register(formatter, notifications); end
+  def reporter; end
+  def self.formatters; end
+  def setup_default(output_stream, deprecation_stream); end
+  def string_const?(str); end
+  def underscore(camel_cased_word); end
+  def underscore_with_fix_for_non_standard_rspec_naming(string); end
+end
+module RSpec::Core::Ordering
+end
+class RSpec::Core::Ordering::Identity
+  def order(items); end
+end
+class RSpec::Core::Ordering::Random
+  def initialize(configuration); end
+  def jenkins_hash_digest(string); end
+  def order(items); end
+  def used?; end
+end
+class RSpec::Core::Ordering::Custom
+  def initialize(callable); end
+  def order(list); end
+end
+class RSpec::Core::Ordering::Registry
+  def fetch(name, &fallback); end
+  def initialize(configuration); end
+  def register(sym, strategy); end
+  def used_random_seed?; end
+end
+class RSpec::Core::Ordering::ConfigurationManager
+  def force(hash); end
+  def initialize; end
+  def order=(type); end
+  def ordering_registry; end
+  def register_ordering(name, strategy = nil); end
+  def seed; end
+  def seed=(seed); end
+  def seed_used?; end
+end
+class RSpec::Core::World
+  def all_example_groups; end
+  def all_examples; end
+  def announce_exclusion_filter(announcements); end
+  def announce_filters; end
+  def announce_inclusion_filter(announcements); end
+  def descending_declaration_line_numbers_by_file; end
+  def everything_filtered_message; end
+  def example_count(groups = nil); end
+  def example_group_counts_by_spec_file; end
+  def example_groups; end
+  def exclusion_filter; end
+  def fail_if_config_and_cli_options_invalid; end
+  def filter_manager; end
+  def filtered_examples; end
+  def inclusion_filter; end
+  def initialize(configuration = nil); end
+  def non_example_failure; end
+  def non_example_failure=(arg0); end
+  def num_example_groups_defined_in(file); end
+  def ordered_example_groups; end
+  def preceding_declaration_line(absolute_file_name, filter_line); end
+  def prepare_example_filtering; end
+  def record(example_group); end
+  def registered_example_group_files; end
+  def report_filter_message(message); end
+  def reporter; end
+  def reset; end
+  def shared_example_group_registry; end
+  def source_from_file(path); end
+  def syntax_highlighter; end
+  def traverse_example_group_trees_until(&block); end
+  def wants_to_quit; end
+  def wants_to_quit=(arg0); end
+end
+module RSpec::Core::World::Null
+  def self.all_example_groups; end
+  def self.example_groups; end
+  def self.non_example_failure; end
+  def self.non_example_failure=(_); end
+  def self.registered_example_group_files; end
+  def self.traverse_example_group_trees_until; end
+end
+class RSpec::Core::BacktraceFormatter
+  def backtrace_line(line); end
+  def exclude?(line); end
+  def exclusion_patterns; end
+  def exclusion_patterns=(arg0); end
+  def filter_gem(gem_name); end
+  def format_backtrace(backtrace, options = nil); end
+  def full_backtrace=(arg0); end
+  def full_backtrace?; end
+  def inclusion_patterns; end
+  def inclusion_patterns=(arg0); end
+  def initialize; end
+  def matches?(patterns, line); end
+end
+module RSpec::Core::RubyProject
+  def add_dir_to_load_path(dir); end
+  def add_to_load_path(*dirs); end
+  def ascend_until; end
+  def determine_root; end
+  def find_first_parent_containing(dir); end
+  def root; end
+  def self.add_dir_to_load_path(dir); end
+  def self.add_to_load_path(*dirs); end
+  def self.ascend_until; end
+  def self.determine_root; end
+  def self.find_first_parent_containing(dir); end
+  def self.root; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter
+  def count; end
+  def deprecation(notification); end
+  def deprecation_message_for(data); end
+  def deprecation_stream; end
+  def deprecation_summary(_notification); end
+  def initialize(deprecation_stream, summary_stream); end
+  def output; end
+  def printer; end
+  def summary_stream; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::SpecifiedDeprecationMessage < Struct
+  def deprecation_type_for(data); end
+  def initialize(data); end
+  def output_formatted(str); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def to_s; end
+  def too_many_warnings_message; end
+  def type; end
+  def type=(_); end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::GeneratedDeprecationMessage < Struct
+  def initialize(data); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def to_s; end
+  def too_many_warnings_message; end
+  def type; end
+  def type=(_); end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::ImmediatePrinter
+  def deprecation_formatter; end
+  def deprecation_stream; end
+  def deprecation_summary; end
+  def initialize(deprecation_stream, summary_stream, deprecation_formatter); end
+  def print_deprecation_message(data); end
+  def summary_stream; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::DelayedPrinter
+  def deprecation_formatter; end
+  def deprecation_stream; end
+  def deprecation_summary; end
+  def initialize(deprecation_stream, summary_stream, deprecation_formatter); end
+  def print_deferred_deprecation_warnings; end
+  def print_deprecation_message(data); end
+  def stash_deprecation_message(deprecation_message); end
+  def summary_stream; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::RaiseErrorStream
+  def puts(message); end
+  def summarize(summary_stream, deprecation_count); end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::FileStream
+  def initialize(file); end
+  def puts(*args); end
+  def summarize(summary_stream, deprecation_count); end
+end
+class RSpec::Core::DeprecationError < StandardError
+end
+class RSpec::Core::OutputWrapper
+  def <<(*args, &block); end
+  def advise(*args, &block); end
+  def autoclose=(*args, &block); end
+  def autoclose?(*args, &block); end
+  def beep(*args, &block); end
+  def binmode(*args, &block); end
+  def binmode?(*args, &block); end
+  def bytes(*args, &block); end
+  def chars(*args, &block); end
+  def check_winsize_changed(*args, &block); end
+  def clear_screen(*args, &block); end
+  def close(*args, &block); end
+  def close_on_exec=(*args, &block); end
+  def close_on_exec?(*args, &block); end
+  def close_read(*args, &block); end
+  def close_write(*args, &block); end
+  def closed?(*args, &block); end
+  def codepoints(*args, &block); end
+  def console_mode(*args, &block); end
+  def console_mode=(*args, &block); end
+  def cooked!(*args, &block); end
+  def cooked(*args, &block); end
+  def cursor(*args, &block); end
+  def cursor=(*args, &block); end
+  def cursor_down(*args, &block); end
+  def cursor_left(*args, &block); end
+  def cursor_right(*args, &block); end
+  def cursor_up(*args, &block); end
+  def each(*args, &block); end
+  def each_byte(*args, &block); end
+  def each_char(*args, &block); end
+  def each_codepoint(*args, &block); end
+  def each_line(*args, &block); end
+  def echo=(*args, &block); end
+  def echo?(*args, &block); end
+  def eof(*args, &block); end
+  def eof?(*args, &block); end
+  def erase_line(*args, &block); end
+  def erase_screen(*args, &block); end
+  def external_encoding(*args, &block); end
+  def fcntl(*args, &block); end
+  def fdatasync(*args, &block); end
+  def fileno(*args, &block); end
+  def flush(*args, &block); end
+  def fsync(*args, &block); end
+  def getbyte(*args, &block); end
+  def getc(*args, &block); end
+  def getch(*args, &block); end
+  def getpass(*args, &block); end
+  def gets(*args, &block); end
+  def goto(*args, &block); end
+  def goto_column(*args, &block); end
+  def iflush(*args, &block); end
+  def initialize(output); end
+  def inspect(*args, &block); end
+  def internal_encoding(*args, &block); end
+  def ioctl(*args, &block); end
+  def ioflush(*args, &block); end
+  def isatty(*args, &block); end
+  def lineno(*args, &block); end
+  def lineno=(*args, &block); end
+  def lines(*args, &block); end
+  def method_missing(name, *args, &block); end
+  def noecho(*args, &block); end
+  def nonblock(*args, &block); end
+  def nonblock=(*args, &block); end
+  def nonblock?(*args, &block); end
+  def nread(*args, &block); end
+  def oflush(*args, &block); end
+  def output; end
+  def output=(arg0); end
+  def pathconf(*args, &block); end
+  def pid(*args, &block); end
+  def pos(*args, &block); end
+  def pos=(*args, &block); end
+  def pread(*args, &block); end
+  def pressed?(*args, &block); end
+  def print(*args, &block); end
+  def printf(*args, &block); end
+  def putc(*args, &block); end
+  def puts(*args, &block); end
+  def pwrite(*args, &block); end
+  def raw!(*args, &block); end
+  def raw(*args, &block); end
+  def read(*args, &block); end
+  def read_nonblock(*args, &block); end
+  def readbyte(*args, &block); end
+  def readchar(*args, &block); end
+  def readline(*args, &block); end
+  def readlines(*args, &block); end
+  def readpartial(*args, &block); end
+  def ready?(*args, &block); end
+  def reopen(*args, &block); end
+  def respond_to?(name, priv = nil); end
+  def rewind(*args, &block); end
+  def scroll_backward(*args, &block); end
+  def scroll_forward(*args, &block); end
+  def seek(*args, &block); end
+  def set_encoding(*args, &block); end
+  def set_encoding_by_bom(*args, &block); end
+  def stat(*args, &block); end
+  def sync(*args, &block); end
+  def sync=(*args, &block); end
+  def sysread(*args, &block); end
+  def sysseek(*args, &block); end
+  def syswrite(*args, &block); end
+  def tell(*args, &block); end
+  def to_i(*args, &block); end
+  def to_io(*args, &block); end
+  def tty?(*args, &block); end
+  def ungetbyte(*args, &block); end
+  def ungetc(*args, &block); end
+  def wait(*args, &block); end
+  def wait_readable(*args, &block); end
+  def wait_writable(*args, &block); end
+  def winsize(*args, &block); end
+  def winsize=(*args, &block); end
+  def write(*args, &block); end
+  def write_nonblock(*args, &block); end
+end
+class RSpec::Core::Configuration
+  def absolute_pattern?(pattern); end
+  def add_formatter(formatter, output = nil); end
+  def add_hook_to_existing_matching_groups(meta, scope, &block); end
+  def add_setting(name, opts = nil); end
+  def after(scope = nil, *meta, &block); end
+  def alias_example_group_to(new_name, *args); end
+  def alias_example_to(name, *args); end
+  def alias_it_behaves_like_to(new_name, report_label = nil); end
+  def alias_it_should_behave_like_to(new_name, report_label = nil); end
+  def append_after(scope = nil, *meta, &block); end
+  def append_before(scope = nil, *meta, &block); end
+  def apply_derived_metadata_to(metadata); end
+  def around(scope = nil, *meta, &block); end
+  def assert_no_example_groups_defined(config_option); end
+  def backtrace_exclusion_patterns; end
+  def backtrace_exclusion_patterns=(patterns); end
+  def backtrace_formatter; end
+  def backtrace_inclusion_patterns; end
+  def backtrace_inclusion_patterns=(patterns); end
+  def before(scope = nil, *meta, &block); end
+  def bisect_runner; end
+  def bisect_runner=(value); end
+  def bisect_runner_class; end
+  def clear_values_derived_from_example_status_persistence_file_path; end
+  def color; end
+  def color=(arg0); end
+  def color_enabled?(output = nil); end
+  def color_mode; end
+  def color_mode=(arg0); end
+  def command; end
+  def conditionally_disable_expectations_monkey_patching; end
+  def conditionally_disable_mocks_monkey_patching; end
+  def configure_example(example, example_hooks); end
+  def configure_expectation_framework; end
+  def configure_group(group); end
+  def configure_group_with(group, module_list, application_method); end
+  def configure_mock_framework; end
+  def default_color; end
+  def default_color=(arg0); end
+  def default_color?; end
+  def default_formatter; end
+  def default_formatter=(value); end
+  def default_path; end
+  def default_path=(path); end
+  def default_path?; end
+  def define_built_in_hooks; end
+  def define_derived_metadata(*filters, &block); end
+  def define_mixed_in_module(mod, filters, mod_list, config_method, &block); end
+  def deprecation_stream; end
+  def deprecation_stream=(value); end
+  def detail_color; end
+  def detail_color=(arg0); end
+  def detail_color?; end
+  def disable_monkey_patching!; end
+  def disable_monkey_patching; end
+  def disable_monkey_patching=(arg0); end
+  def drb; end
+  def drb=(arg0); end
+  def drb?; end
+  def drb_port; end
+  def drb_port=(arg0); end
+  def drb_port?; end
+  def dry_run; end
+  def dry_run=(arg0); end
+  def dry_run?; end
+  def error_exit_code; end
+  def error_exit_code=(arg0); end
+  def error_exit_code?; end
+  def error_stream; end
+  def error_stream=(arg0); end
+  def error_stream?; end
+  def example_status_persistence_file_path; end
+  def example_status_persistence_file_path=(value); end
+  def exclude_pattern; end
+  def exclude_pattern=(value); end
+  def exclusion_filter; end
+  def exclusion_filter=(filter); end
+  def expect_with(*frameworks); end
+  def expectation_framework=(framework); end
+  def expectation_frameworks; end
+  def expose_current_running_example_as(method_name); end
+  def expose_dsl_globally=(value); end
+  def expose_dsl_globally?; end
+  def extend(mod, *filters); end
+  def extract_location(path); end
+  def fail_fast; end
+  def fail_fast=(value); end
+  def fail_if_no_examples; end
+  def fail_if_no_examples=(arg0); end
+  def fail_if_no_examples?; end
+  def failure_color; end
+  def failure_color=(arg0); end
+  def failure_color?; end
+  def failure_exit_code; end
+  def failure_exit_code=(arg0); end
+  def failure_exit_code?; end
+  def file_glob_from(path, pattern); end
+  def files_or_directories_to_run=(*files); end
+  def files_to_run; end
+  def files_to_run=(arg0); end
+  def filter; end
+  def filter=(filter); end
+  def filter_gems_from_backtrace(*gem_names); end
+  def filter_manager; end
+  def filter_manager=(arg0); end
+  def filter_run(*args); end
+  def filter_run_excluding(*args); end
+  def filter_run_including(*args); end
+  def filter_run_when_matching(*args); end
+  def fixed_color; end
+  def fixed_color=(arg0); end
+  def fixed_color?; end
+  def force(hash); end
+  def format_docstrings(&block); end
+  def format_docstrings_block; end
+  def formatter=(formatter, output = nil); end
+  def formatter_loader; end
+  def formatters; end
+  def full_backtrace=(true_or_false); end
+  def full_backtrace?; end
+  def full_description; end
+  def full_description=(description); end
+  def gather_directories(path); end
+  def get_files_to_run(paths); end
+  def get_matching_files(path, pattern); end
+  def handle_suite_hook(scope, meta); end
+  def hooks; end
+  def in_project_source_dir_regex; end
+  def include(mod, *filters); end
+  def include_context(shared_group_name, *filters); end
+  def inclusion_filter; end
+  def inclusion_filter=(filter); end
+  def initialize; end
+  def last_run_statuses; end
+  def libs; end
+  def libs=(libs); end
+  def load_file_handling_errors(method, file); end
+  def load_spec_files; end
+  def loaded_spec_files; end
+  def max_displayed_failure_line_count; end
+  def max_displayed_failure_line_count=(arg0); end
+  def max_displayed_failure_line_count?; end
+  def metadata_applies_to_group?(meta, group); end
+  def mock_framework; end
+  def mock_framework=(framework); end
+  def mock_with(framework); end
+  def on_example_group_definition(&block); end
+  def on_example_group_definition_callbacks; end
+  def on_existing_matching_groups(meta); end
+  def only_failures; end
+  def only_failures?; end
+  def only_failures_but_not_configured?; end
+  def order=(*args, &block); end
+  def ordering_manager; end
+  def ordering_registry(*args, &block); end
+  def output_stream; end
+  def output_stream=(value); end
+  def output_to_tty?(output = nil); end
+  def output_wrapper; end
+  def paths_to_check(paths); end
+  def pattern; end
+  def pattern=(value); end
+  def pattern_might_load_specs_from_vendored_dirs?; end
+  def pending_color; end
+  def pending_color=(arg0); end
+  def pending_color?; end
+  def prepend(mod, *filters); end
+  def prepend_after(scope = nil, *meta, &block); end
+  def prepend_before(scope = nil, *meta, &block); end
+  def profile_examples; end
+  def profile_examples=(arg0); end
+  def profile_examples?; end
+  def project_source_dirs; end
+  def project_source_dirs=(arg0); end
+  def project_source_dirs?; end
+  def raise_errors_for_deprecations!; end
+  def raise_on_warning=(value); end
+  def register_ordering(*args, &block); end
+  def reporter; end
+  def requires; end
+  def requires=(paths); end
+  def reset; end
+  def reset_filters; end
+  def reset_reporter; end
+  def rspec_expectations_loaded?; end
+  def rspec_mocks_loaded?; end
+  def run_all_when_everything_filtered; end
+  def run_all_when_everything_filtered=(arg0); end
+  def run_all_when_everything_filtered?; end
+  def run_suite_hooks(hook_description, hooks); end
+  def safe_extend(mod, host); end
+  def safe_include(mod, host); end
+  def safe_prepend(mod, host); end
+  def seed(*args, &block); end
+  def seed=(*args, &block); end
+  def seed_used?(*args, &block); end
+  def self.add_read_only_setting(name, opts = nil); end
+  def self.add_setting(name, opts = nil); end
+  def self.define_alias(name, alias_name); end
+  def self.define_predicate(name); end
+  def self.define_reader(name); end
+  def self.delegate_to_ordering_manager(*methods); end
+  def shared_context_metadata_behavior; end
+  def shared_context_metadata_behavior=(value); end
+  def silence_filter_announcements; end
+  def silence_filter_announcements=(arg0); end
+  def silence_filter_announcements?; end
+  def spec_files_with_failures; end
+  def start_time; end
+  def start_time=(arg0); end
+  def start_time?; end
+  def static_config_filter_manager; end
+  def static_config_filter_manager=(arg0); end
+  def success_color; end
+  def success_color=(arg0); end
+  def success_color?; end
+  def threadsafe; end
+  def threadsafe=(arg0); end
+  def threadsafe?; end
+  def treat_symbols_as_metadata_keys_with_true_values=(_value); end
+  def tty; end
+  def tty=(arg0); end
+  def tty?; end
+  def update_pattern_attr(name, value); end
+  def value_for(key); end
+  def warnings=(value); end
+  def warnings?; end
+  def when_first_matching_example_defined(*filters); end
+  def with_suite_hooks; end
+  def world; end
+  def world=(arg0); end
+  include RSpec::Core::Configuration::Readers
+  include RSpec::Core::Hooks
+end
+module RSpec::Core::Configuration::Readers
+  def default_color; end
+  def default_path; end
+  def deprecation_stream; end
+  def detail_color; end
+  def drb; end
+  def drb_port; end
+  def dry_run; end
+  def error_exit_code; end
+  def error_stream; end
+  def example_status_persistence_file_path; end
+  def exclude_pattern; end
+  def fail_fast; end
+  def fail_if_no_examples; end
+  def failure_color; end
+  def failure_exit_code; end
+  def fixed_color; end
+  def libs; end
+  def max_displayed_failure_line_count; end
+  def only_failures; end
+  def output_stream; end
+  def pattern; end
+  def pending_color; end
+  def project_source_dirs; end
+  def requires; end
+  def run_all_when_everything_filtered; end
+  def shared_context_metadata_behavior; end
+  def silence_filter_announcements; end
+  def start_time; end
+  def success_color; end
+  def threadsafe; end
+  def tty; end
+end
+class RSpec::Core::Configuration::MustBeConfiguredBeforeExampleGroupsError < StandardError
+end
+class RSpec::Core::Configuration::DeprecationReporterBuffer
+  def deprecation(*args); end
+  def initialize; end
+  def play_onto(reporter); end
+end
+module RSpec::Core::Configuration::ExposeCurrentExample
+end
+class RSpec::Core::Parser
+  def add_tag_filter(options, filter_type, tag_name, value = nil); end
+  def configure_only_failures(options); end
+  def initialize(original_args); end
+  def original_args; end
+  def parse(source = nil); end
+  def parser(options); end
+  def self.parse(args, source = nil); end
+  def set_fail_fast(options, value); end
+end
+class RSpec::Core::ConfigurationOptions
+  def args; end
+  def args_from_options_file(path); end
+  def command_line_options; end
+  def configure(config); end
+  def configure_filter_manager(filter_manager); end
+  def custom_options; end
+  def custom_options_file; end
+  def env_options; end
+  def file_options; end
+  def force?(key); end
+  def global_options; end
+  def global_options_file; end
+  def home_options_file_path; end
+  def initialize(args); end
+  def load_formatters_into(config); end
+  def local_options; end
+  def local_options_file; end
+  def options; end
+  def options_file_as_erb_string(path); end
+  def options_from(path); end
+  def order(keys); end
+  def organize_options; end
+  def parse_args_ignoring_files_or_dirs_to_run(args, source); end
+  def process_options_into(config); end
+  def project_options; end
+  def project_options_file; end
+  def resolve_xdg_config_home; end
+  def xdg_options_file_if_exists; end
+  def xdg_options_file_path; end
+end
+class RSpec::Core::Runner
+  def configuration; end
+  def configure(err, out); end
+  def exit_code(examples_passed = nil); end
+  def initialize(options, configuration = nil, world = nil); end
+  def options; end
+  def persist_example_statuses; end
+  def run(err, out); end
+  def run_specs(example_groups); end
+  def self.autorun; end
+  def self.autorun_disabled?; end
+  def self.disable_autorun!; end
+  def self.handle_interrupt; end
+  def self.installed_at_exit?; end
+  def self.invoke; end
+  def self.perform_at_exit; end
+  def self.run(args, err = nil, out = nil); end
+  def self.running_in_drb?; end
+  def self.trap_interrupt; end
+  def setup(err, out); end
+  def world; end
+end
+module RSpec::Core::Invocations
+end
+class RSpec::Core::Invocations::InitializeProject
+  def call(*_args); end
+end
+class RSpec::Core::Invocations::DRbWithFallback
+  def call(options, err, out); end
+end
+class RSpec::Core::Invocations::Bisect
+  def bisect_formatter_klass_for(argument); end
+  def call(options, err, out); end
+end
+class RSpec::Core::Invocations::PrintVersion
+  def call(_options, _err, out); end
+end
+class RSpec::Core::Invocations::PrintHelp < Struct
+  def call(_options, _err, out); end
+  def hidden_options; end
+  def hidden_options=(_); end
+  def parser; end
+  def parser=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Example
+  def assign_generated_description; end
+  def clock; end
+  def clock=(arg0); end
+  def description; end
+  def display_exception; end
+  def display_exception=(ex); end
+  def duplicate_with(metadata_overrides = nil); end
+  def example_group; end
+  def example_group_instance; end
+  def exception; end
+  def execution_result; end
+  def fail_with_exception(reporter, exception); end
+  def file_path; end
+  def finish(reporter); end
+  def full_description; end
+  def generate_description; end
+  def hooks; end
+  def id; end
+  def initialize(example_group_class, description, user_metadata, example_block = nil); end
+  def inspect; end
+  def inspect_output; end
+  def instance_exec(*args, &block); end
+  def location; end
+  def location_description; end
+  def location_rerun_argument; end
+  def metadata; end
+  def mocks_need_verification?; end
+  def pending; end
+  def pending?; end
+  def record_finished(status, reporter); end
+  def reporter; end
+  def rerun_argument; end
+  def run(example_group_instance, reporter); end
+  def run_after_example; end
+  def run_before_example; end
+  def self.delegate_to_metadata(key); end
+  def self.parse_id(id); end
+  def set_aggregate_failures_exception(exception); end
+  def set_exception(exception); end
+  def skip; end
+  def skip_with_exception(reporter, exception); end
+  def skipped?; end
+  def start(reporter); end
+  def to_s; end
+  def update_inherited_metadata(updates); end
+  def verify_mocks; end
+  def with_around_and_singleton_context_hooks; end
+  def with_around_example_hooks; end
+end
+class RSpec::Core::Example::Procsy
+  def <<(*a, &b); end
+  def ===(*a, &b); end
+  def >>(*a, &b); end
+  def [](*a, &b); end
+  def arity(*a, &b); end
+  def binding(*a, &b); end
+  def call(*args, &block); end
+  def clock(*a, &b); end
+  def clock=(*a, &b); end
+  def clone(*a, &b); end
+  def curry(*a, &b); end
+  def description(*a, &b); end
+  def dup(*a, &b); end
+  def duplicate_with(*a, &b); end
+  def example; end
+  def example_group(*a, &b); end
+  def example_group_instance(*a, &b); end
+  def exception(*a, &b); end
+  def executed?; end
+  def execution_result(*a, &b); end
+  def file_path(*a, &b); end
+  def full_description(*a, &b); end
+  def hash(*a, &b); end
+  def id(*a, &b); end
+  def initialize(example, &block); end
+  def inspect; end
+  def inspect_output(*a, &b); end
+  def lambda?(*a, &b); end
+  def location(*a, &b); end
+  def location_rerun_argument(*a, &b); end
+  def metadata(*a, &b); end
+  def parameters(*a, &b); end
+  def pending(*a, &b); end
+  def pending?(*a, &b); end
+  def reporter(*a, &b); end
+  def rerun_argument(*a, &b); end
+  def ruby2_keywords(*a, &b); end
+  def run(*args, &block); end
+  def skip(*a, &b); end
+  def skipped?(*a, &b); end
+  def source_location(*a, &b); end
+  def to_proc; end
+  def update_inherited_metadata(*a, &b); end
+  def wrap(&block); end
+  def yield(*a, &b); end
+end
+class RSpec::Core::Example::ExecutionResult
+  def calculate_run_time(finished_at); end
+  def ensure_timing_set(clock); end
+  def example_skipped?; end
+  def exception; end
+  def exception=(arg0); end
+  def finished_at; end
+  def finished_at=(arg0); end
+  def get_value(name); end
+  def hash_for_delegation; end
+  def issue_deprecation(_method_name, *_args); end
+  def pending_exception; end
+  def pending_exception=(arg0); end
+  def pending_fixed; end
+  def pending_fixed=(arg0); end
+  def pending_fixed?; end
+  def pending_message; end
+  def pending_message=(arg0); end
+  def record_finished(status, finished_at); end
+  def run_time; end
+  def run_time=(arg0); end
+  def set_value(name, value); end
+  def started_at; end
+  def started_at=(arg0); end
+  def status; end
+  def status=(arg0); end
+  extend RSpec::Core::HashImitatable::ClassMethods
+  include RSpec::Core::HashImitatable
+end
+class RSpec::Core::SuiteHookContext < RSpec::Core::Example
+  def initialize(hook_description, reporter); end
+  def set_exception(exception); end
+end
+class RSpec::Core::SharedExampleGroupModule < Module
+  def definition; end
+  def include_in(klass, inclusion_line, args, customization_block); end
+  def included(klass); end
+  def initialize(description, definition, metadata); end
+  def inspect; end
+  def to_s; end
+end
+module RSpec::Core::SharedExampleGroup
+  def shared_context(name, *args, &block); end
+  def shared_examples(name, *args, &block); end
+  def shared_examples_for(name, *args, &block); end
+end
+module RSpec::Core::SharedExampleGroup::TopLevelDSL
+  def self.definitions; end
+  def self.expose_globally!; end
+  def self.exposed_globally?; end
+  def self.remove_globally!; end
+end
+class RSpec::Core::SharedExampleGroup::Registry
+  def add(context, name, *metadata_args, &block); end
+  def ensure_block_has_source_location(_block); end
+  def find(lookup_contexts, name); end
+  def formatted_location(block); end
+  def legacy_add(context, name, *metadata_args, &block); end
+  def shared_example_groups; end
+  def valid_name?(candidate); end
+  def warn_if_key_taken(context, key, new_block); end
+end
+class RSpec::Core::ExampleGroup
+  def described_class; end
+  def initialize(inspect_output = nil); end
+  def inspect; end
+  def method_missing(name, *args); end
+  def self.add_example(example); end
+  def self.before_context_ivars; end
+  def self.children; end
+  def self.context(*args, &example_group_block); end
+  def self.currently_executing_a_context_hook?; end
+  def self.declaration_locations; end
+  def self.define_example_group_method(name, metadata = nil); end
+  def self.define_example_method(name, extra_options = nil); end
+  def self.define_nested_shared_group_method(new_name, report_label = nil); end
+  def self.delegate_to_metadata(*names); end
+  def self.descendant_filtered_examples; end
+  def self.descendants; end
+  def self.describe(*args, &example_group_block); end
+  def self.described_class; end
+  def self.description; end
+  def self.each_instance_variable_for_example(group); end
+  def self.ensure_example_groups_are_configured; end
+  def self.example(*all_args, &block); end
+  def self.example_group(*args, &example_group_block); end
+  def self.examples; end
+  def self.fcontext(*args, &example_group_block); end
+  def self.fdescribe(*args, &example_group_block); end
+  def self.fexample(*all_args, &block); end
+  def self.file_path; end
+  def self.filtered_examples; end
+  def self.find_and_eval_shared(label, name, inclusion_location, *args, &customization_block); end
+  def self.fit(*all_args, &block); end
+  def self.focus(*all_args, &block); end
+  def self.for_filtered_examples(reporter, &block); end
+  def self.fspecify(*all_args, &block); end
+  def self.id; end
+  def self.idempotently_define_singleton_method(name, &definition); end
+  def self.include_context(name, *args, &block); end
+  def self.include_examples(name, *args, &block); end
+  def self.it(*all_args, &block); end
+  def self.it_behaves_like(name, *args, &customization_block); end
+  def self.it_should_behave_like(name, *args, &customization_block); end
+  def self.location; end
+  def self.metadata; end
+  def self.method_missing(name, *args); end
+  def self.next_runnable_index_for(file); end
+  def self.ordering_strategy; end
+  def self.parent_groups; end
+  def self.pending(*all_args, &block); end
+  def self.remove_example(example); end
+  def self.reset_memoized; end
+  def self.run(reporter = nil); end
+  def self.run_after_context_hooks(example_group_instance); end
+  def self.run_before_context_hooks(example_group_instance); end
+  def self.run_examples(reporter); end
+  def self.set_it_up(description, args, registration_collection, &example_group_block); end
+  def self.set_ivars(instance, ivars); end
+  def self.skip(*all_args, &block); end
+  def self.specify(*all_args, &block); end
+  def self.store_before_context_ivars(example_group_instance); end
+  def self.subclass(parent, description, args, registration_collection, &example_group_block); end
+  def self.superclass_before_context_ivars; end
+  def self.superclass_metadata; end
+  def self.top_level?; end
+  def self.top_level_description; end
+  def self.traverse_tree_until(&block); end
+  def self.update_inherited_metadata(updates); end
+  def self.with_replaced_metadata(meta); end
+  def self.xcontext(*args, &example_group_block); end
+  def self.xdescribe(*args, &example_group_block); end
+  def self.xexample(*all_args, &block); end
+  def self.xit(*all_args, &block); end
+  def self.xspecify(*all_args, &block); end
+  extend RSpec::Core::Hooks
+  extend RSpec::Core::MemoizedHelpers::ClassMethods
+  extend RSpec::Core::SharedExampleGroup
+  include RSpec::Core::MemoizedHelpers
+  include RSpec::Core::MockingAdapters::RSpec
+  include RSpec::Core::Pending
+  include RSpec::Matchers
+end
+class RSpec::Core::ExampleGroup::WrongScopeError < NoMethodError
+end
+class RSpec::Core::AnonymousExampleGroup < RSpec::Core::ExampleGroup
+  def self.metadata; end
+end
+class RSpec::Core::SharedExampleGroupInclusionStackFrame
+  def description; end
+  def formatted_inclusion_location; end
+  def inclusion_location; end
+  def initialize(shared_group_name, inclusion_location); end
+  def self.current_backtrace; end
+  def self.shared_example_group_inclusions; end
+  def self.with_frame(name, location); end
+  def shared_group_name; end
+end
+module RSpec::ExampleGroups
+  def self.assign_const(group); end
+  def self.base_name_for(group); end
+  def self.constant_scope_for(group); end
+  def self.disambiguate(name, const_scope); end
+  def self.remove_all_constants; end
+  extend RSpec::Support::RecursiveConstMethods
+end
+module RSpec::Support
+  def self.require_rspec_core(f); end
+end
+class RSpec::Core::Time
+  def self.now(*arg0); end
+end
+class Module
+  def context(*a, &b); end
+  def describe(*a, &b); end
+  def example_group(*a, &b); end
+  def fcontext(*a, &b); end
+  def fdescribe(*a, &b); end
+  def shared_context(name, *args, &block); end
+  def shared_examples(name, *args, &block); end
+  def shared_examples_for(name, *args, &block); end
+  def xcontext(*a, &b); end
+  def xdescribe(*a, &b); end
+end
+module RSpec::Core::SharedContext
+  def __shared_context_recordings; end
+  def after(*args, &block); end
+  def append_after(*args, &block); end
+  def append_before(*args, &block); end
+  def around(*args, &block); end
+  def before(*args, &block); end
+  def context(*args, &block); end
+  def describe(*args, &block); end
+  def hooks(*args, &block); end
+  def included(group); end
+  def let!(*args, &block); end
+  def let(*args, &block); end
+  def prepend_after(*args, &block); end
+  def prepend_before(*args, &block); end
+  def self.record(methods); end
+  def subject!(*args, &block); end
+  def subject(*args, &block); end
+end
+class RSpec::Core::SharedContext::Recording < Struct
+  def args; end
+  def args=(_); end
+  def block; end
+  def block=(_); end
+  def method_name; end
+  def method_name=(_); end
+  def playback_onto(group); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::ExampleStatusPersister
+  def dump_statuses(unparsed_previous_runs); end
+  def initialize(examples, file_name); end
+  def persist; end
+  def self.load_from(file_name); end
+  def self.persist(examples, file_name); end
+  def statuses_from_this_run; end
+end
+class RSpec::Core::ExampleStatusMerger
+  def delete_previous_examples_that_no_longer_exist; end
+  def example_must_no_longer_exist?(ex_id); end
+  def hash_from(example_list); end
+  def initialize(this_run, from_previous_runs); end
+  def loaded_spec_files; end
+  def merge; end
+  def self.merge(this_run, from_previous_runs); end
+  def sort_value_from(example); end
+  def spec_file_from(ex_id); end
+end
+class RSpec::Core::ExampleStatusDumper
+  def column_widths; end
+  def dump; end
+  def formatted_header_rows; end
+  def formatted_row_from(row_values); end
+  def formatted_value_rows; end
+  def headers; end
+  def initialize(examples); end
+  def rows; end
+  def self.dump(examples); end
+end
+class RSpec::Core::ExampleStatusParser
+  def headers; end
+  def initialize(string); end
+  def parse; end
+  def parse_row(line); end
+  def self.parse(string); end
+  def split_line(line); end
+end
+class RSpec::Core::Profiler
+  def example_group_finished(notification); end
+  def example_group_started(notification); end
+  def example_groups; end
+  def example_started(notification); end
+  def initialize; end
+end
+class RSpec::Core::DidYouMean
+  def call; end
+  def formats(probables); end
+  def initialize(relative_file_name); end
+  def red_font(mytext); end
+  def relative_file_name; end
+  def top_and_tail(rspec_format); end
+end
+class RSpec::Core::Formatters::BaseFormatter
+  def close(_notification); end
+  def example_group; end
+  def example_group=(arg0); end
+  def example_group_started(notification); end
+  def initialize(output); end
+  def output; end
+  def output_supports_sync; end
+  def restore_sync_output; end
+  def start(notification); end
+  def start_sync_output; end
+end
+class RSpec::Core::Formatters::BaseTextFormatter < RSpec::Core::Formatters::BaseFormatter
+  def close(_notification); end
+  def dump_failures(notification); end
+  def dump_pending(notification); end
+  def dump_summary(summary); end
+  def message(notification); end
+  def seed(notification); end
+end
+class RSpec::Core::Formatters::DocumentationFormatter < RSpec::Core::Formatters::BaseTextFormatter
+  def current_indentation(offset = nil); end
+  def example_failed(failure); end
+  def example_group_finished(_notification); end
+  def example_group_started(notification); end
+  def example_passed(passed); end
+  def example_pending(pending); end
+  def example_started(_notification); end
+  def failure_output(example); end
+  def flush_messages; end
+  def initialize(output); end
+  def message(notification); end
+  def next_failure_index; end
+  def passed_output(example); end
+  def pending_output(example, message); end
+end
+class RSpec::Core::Formatters::HtmlPrinter
+  def flush; end
+  def indentation_style(number_of_parents); end
+  def initialize(output); end
+  def make_example_group_header_red(group_id); end
+  def make_example_group_header_yellow(group_id); end
+  def make_header_red; end
+  def make_header_yellow; end
+  def move_progress(percent_done); end
+  def print_example_failed(pending_fixed, description, run_time, failure_id, exception, extra_content); end
+  def print_example_group_end; end
+  def print_example_group_start(group_id, description, number_of_parents); end
+  def print_example_passed(description, run_time); end
+  def print_example_pending(description, pending_message); end
+  def print_html_start; end
+  def print_summary(duration, example_count, failure_count, pending_count); end
+  include ERB::Util
+end
+class RSpec::Core::Formatters::HtmlFormatter < RSpec::Core::Formatters::BaseFormatter
+  def dump_summary(summary); end
+  def example_failed(failure); end
+  def example_group_number; end
+  def example_group_started(notification); end
+  def example_number; end
+  def example_passed(passed); end
+  def example_pending(pending); end
+  def example_started(_notification); end
+  def extra_failure_content(failure); end
+  def initialize(output); end
+  def percent_done; end
+  def start(notification); end
+  def start_dump(_notification); end
+end
+class RSpec::Core::Formatters::FallbackMessageFormatter
+  def initialize(output); end
+  def message(notification); end
+  def output; end
+end
+class RSpec::Core::Formatters::ProgressFormatter < RSpec::Core::Formatters::BaseTextFormatter
+  def example_failed(_notification); end
+  def example_passed(_notification); end
+  def example_pending(_notification); end
+  def start_dump(_notification); end
+end
+class RSpec::Core::Formatters::ProfileFormatter
+  def bold(text); end
+  def dump_profile(profile); end
+  def dump_profile_slowest_example_groups(profile); end
+  def dump_profile_slowest_examples(profile); end
+  def format_caller(caller_info); end
+  def initialize(output); end
+  def output; end
+end
+class RSpec::Core::Formatters::JsonFormatter < RSpec::Core::Formatters::BaseFormatter
+  def close(_notification); end
+  def dump_profile(profile); end
+  def dump_profile_slowest_example_groups(profile); end
+  def dump_profile_slowest_examples(profile); end
+  def dump_summary(summary); end
+  def format_example(example); end
+  def initialize(output); end
+  def message(notification); end
+  def output_hash; end
+  def seed(notification); end
+  def stop(notification); end
+end
+module RSpec::Core::Bisect
+end
+class RSpec::Core::Bisect::ExampleSetDescriptor < Struct
+  def all_example_ids; end
+  def all_example_ids=(_); end
+  def failed_example_ids; end
+  def failed_example_ids=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Bisect::BisectFailedError < StandardError
+  def self.for_failed_spec_run(spec_output); end
+end
+class RSpec::Core::Bisect::Notifier
+  def initialize(formatter); end
+  def publish(event, *args); end
+end
+class RSpec::Core::Bisect::Channel
+  def close; end
+  def initialize; end
+  def receive; end
+  def send(message); end
+end
+class RSpec::Core::Formatters::BaseBisectFormatter
+  def example_failed(notification); end
+  def example_finished(notification); end
+  def initialize(expected_failures); end
+  def self.inherited(formatter); end
+  def start_dump(_notification); end
+end
+class RSpec::Core::Formatters::BisectDRbFormatter < RSpec::Core::Formatters::BaseBisectFormatter
+  def initialize(_output); end
+  def notify_results(results); end
+end
+class RSpec::Core::Formatters::FailureListFormatter < RSpec::Core::Formatters::BaseFormatter
+  def dump_profile(_profile); end
+  def example_failed(failure); end
+  def message(_message); end
+end
+module RSpec::Core::MockingAdapters
+end
+module RSpec::Core::MockingAdapters::RSpec
+  def self.configuration; end
+  def self.framework_name; end
+  def setup_mocks_for_rspec; end
+  def teardown_mocks_for_rspec; end
+  def verify_mocks_for_rspec; end
+  include RSpec::Mocks::ExampleMethods
+  include RSpec::Mocks::ExampleMethods::ExpectHost
+end
+class RSpec::ExampleGroups::PDFReaderBufferTokenMethod < RSpec::Core::ExampleGroup
+  extend RSpec::Matchers::DSL
+end
+class RSpec::Expectations::MultipleExpectationsNotMetError < RSpec::Expectations::ExpectationNotMetError
+  include RSpec::Core::MultipleExceptionError::InterfaceTag
+end
+class RSpec::ExampleGroups::PDFReader < RSpec::Core::ExampleGroup
+  extend RSpec::Matchers::DSL
+end
diff --git a/sorbet/rbi/gems/rspec-expectations.rbi b/sorbet/rbi/gems/rspec-expectations.rbi
new file mode 100644
index 0000000..24a7e5c
--- /dev/null
+++ b/sorbet/rbi/gems/rspec-expectations.rbi
@@ -0,0 +1,1148 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rspec-expectations/all/rspec-expectations.rbi
+#
+# rspec-expectations-3.10.1
+
+module RSpec
+end
+module RSpec::Matchers
+  def a_block_changing(*args, &block); end
+  def a_block_outputting(*args, &block); end
+  def a_block_raising(*args, &block); end
+  def a_block_throwing(*args, &block); end
+  def a_block_yielding_control(*args, &block); end
+  def a_block_yielding_successive_args(*args, &block); end
+  def a_block_yielding_with_args(*args, &block); end
+  def a_block_yielding_with_no_args(*args, &block); end
+  def a_collection_containing_exactly(*args, &block); end
+  def a_collection_ending_with(*args, &block); end
+  def a_collection_including(*args, &block); end
+  def a_collection_starting_with(*args, &block); end
+  def a_falsey_value(*args, &block); end
+  def a_falsy_value(*args, &block); end
+  def a_hash_including(*args, &block); end
+  def a_kind_of(*args, &block); end
+  def a_nil_value(*args, &block); end
+  def a_range_covering(*args, &block); end
+  def a_string_ending_with(*args, &block); end
+  def a_string_including(*args, &block); end
+  def a_string_matching(*args, &block); end
+  def a_string_starting_with(*args, &block); end
+  def a_truthy_value(*args, &block); end
+  def a_value(*args, &block); end
+  def a_value_between(*args, &block); end
+  def a_value_within(*args, &block); end
+  def aggregate_failures(label = nil, metadata = nil, &block); end
+  def all(expected); end
+  def an_instance_of(*args, &block); end
+  def an_object_eq_to(*args, &block); end
+  def an_object_eql_to(*args, &block); end
+  def an_object_equal_to(*args, &block); end
+  def an_object_existing(*args, &block); end
+  def an_object_having_attributes(*args, &block); end
+  def an_object_matching(*args, &block); end
+  def an_object_responding_to(*args, &block); end
+  def an_object_satisfying(*args, &block); end
+  def be(*args); end
+  def be_a(klass); end
+  def be_a_kind_of(expected); end
+  def be_an(klass); end
+  def be_an_instance_of(expected); end
+  def be_between(min, max); end
+  def be_falsey; end
+  def be_falsy(*args, &block); end
+  def be_instance_of(expected); end
+  def be_kind_of(expected); end
+  def be_nil; end
+  def be_truthy; end
+  def be_within(delta); end
+  def change(receiver = nil, message = nil, &block); end
+  def changing(*args, &block); end
+  def contain_exactly(*items); end
+  def containing_exactly(*args, &block); end
+  def cover(*values); end
+  def covering(*args, &block); end
+  def end_with(*expected); end
+  def ending_with(*args, &block); end
+  def eq(expected); end
+  def eq_to(*args, &block); end
+  def eql(expected); end
+  def eql_to(*args, &block); end
+  def equal(expected); end
+  def equal_to(*args, &block); end
+  def exist(*args); end
+  def existing(*args, &block); end
+  def expect(value = nil, &block); end
+  def have_attributes(expected); end
+  def having_attributes(*args, &block); end
+  def include(*expected); end
+  def including(*args, &block); end
+  def match(expected); end
+  def match_array(items); end
+  def match_regex(*args, &block); end
+  def matching(*args, &block); end
+  def method_missing(method, *args, &block); end
+  def output(expected = nil); end
+  def raise_error(error = nil, message = nil, &block); end
+  def raise_exception(error = nil, message = nil, &block); end
+  def raising(*args, &block); end
+  def respond_to(*names); end
+  def respond_to_missing?(method, *arg1); end
+  def responding_to(*args, &block); end
+  def satisfy(description = nil, &block); end
+  def satisfying(*args, &block); end
+  def self.alias_matcher(*args, &block); end
+  def self.clear_generated_description; end
+  def self.configuration; end
+  def self.generated_description; end
+  def self.is_a_describable_matcher?(obj); end
+  def self.is_a_matcher?(obj); end
+  def self.last_description; end
+  def self.last_expectation_handler; end
+  def self.last_expectation_handler=(arg0); end
+  def self.last_matcher; end
+  def self.last_matcher=(arg0); end
+  def start_with(*expected); end
+  def starting_with(*args, &block); end
+  def throw_symbol(expected_symbol = nil, expected_arg = nil); end
+  def throwing(*args, &block); end
+  def within(*args, &block); end
+  def yield_control; end
+  def yield_successive_args(*args); end
+  def yield_with_args(*args); end
+  def yield_with_no_args; end
+  def yielding_control(*args, &block); end
+  def yielding_successive_args(*args, &block); end
+  def yielding_with_args(*args, &block); end
+  def yielding_with_no_args(*args, &block); end
+  extend RSpec::Matchers::DSL
+end
+module RSpec::Matchers::EnglishPhrasing
+  def self.list(obj); end
+  def self.split_words(sym); end
+end
+module RSpec::Matchers::Composable
+  def &(matcher); end
+  def ===(value); end
+  def and(matcher); end
+  def description_of(object); end
+  def or(matcher); end
+  def self.should_enumerate?(item); end
+  def self.surface_descriptions_in(item); end
+  def self.unreadable_io?(object); end
+  def should_enumerate?(item); end
+  def surface_descriptions_in(item); end
+  def unreadable_io?(object); end
+  def values_match?(expected, actual); end
+  def with_matchers_cloned(object); end
+  def |(matcher); end
+end
+class RSpec::Matchers::Composable::DescribableItem < Struct
+  def inspect; end
+  def item; end
+  def item=(_); end
+  def pretty_print(pp); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+module RSpec::Matchers::BuiltIn
+end
+class RSpec::Matchers::BuiltIn::BaseMatcher
+  def actual; end
+  def actual_formatted; end
+  def assert_ivars(*expected_ivars); end
+  def description; end
+  def diffable?; end
+  def expected; end
+  def expected_formatted; end
+  def expects_call_stack_jump?; end
+  def initialize(expected = nil); end
+  def match_unless_raises(*exceptions); end
+  def matcher_name; end
+  def matcher_name=(arg0); end
+  def matches?(actual); end
+  def present_ivars; end
+  def rescued_exception; end
+  def self.matcher_name; end
+  def self.underscore(camel_cased_word); end
+  def supports_block_expectations?; end
+  include RSpec::Matchers::BuiltIn::BaseMatcher::DefaultFailureMessages
+  include RSpec::Matchers::BuiltIn::BaseMatcher::HashFormatting
+  include RSpec::Matchers::Composable
+end
+module RSpec::Matchers::BuiltIn::BaseMatcher::HashFormatting
+  def improve_hash_formatting(inspect_string); end
+  def self.improve_hash_formatting(inspect_string); end
+end
+module RSpec::Matchers::BuiltIn::BaseMatcher::DefaultFailureMessages
+  def failure_message; end
+  def failure_message_when_negated; end
+  def self.has_default_failure_messages?(matcher); end
+end
+module RSpec::Matchers::DSL
+  def alias_matcher(new_name, old_name, options = nil, &description_override); end
+  def define(name, &declarations); end
+  def define_negated_matcher(negated_name, base_name, &description_override); end
+  def matcher(name, &declarations); end
+  def warn_about_block_args(name, declarations); end
+end
+module RSpec::Matchers::DSL::Macros
+  def assign_attributes(attr_names); end
+  def chain(method_name, *attr_names, &definition); end
+  def define_user_override(method_name, user_def, &our_def); end
+  def description(&definition); end
+  def diffable; end
+  def failure_message(&definition); end
+  def failure_message_when_negated(&definition); end
+  def match(options = nil, &match_block); end
+  def match_unless_raises(expected_exception = nil, &match_block); end
+  def match_when_negated(options = nil, &match_block); end
+  def supports_block_expectations; end
+end
+module RSpec::Matchers::DSL::Macros::Deprecated
+  def failure_message_for_should(&definition); end
+  def failure_message_for_should_not(&definition); end
+  def match_for_should(&definition); end
+  def match_for_should_not(&definition); end
+end
+module RSpec::Matchers::DSL::DefaultImplementations
+  def chained_method_clause_sentences; end
+  def description; end
+  def diffable?; end
+  def expects_call_stack_jump?; end
+  def supports_block_expectations?; end
+  include RSpec::Matchers::BuiltIn::BaseMatcher::DefaultFailureMessages
+end
+class RSpec::Matchers::DSL::Matcher
+  def actual; end
+  def actual_arg_for(block); end
+  def block_arg; end
+  def expected; end
+  def expected_as_array; end
+  def initialize(name, declarations, matcher_execution_context, *expected, &block_arg); end
+  def inspect; end
+  def method_missing(method, *args, &block); end
+  def name; end
+  def rescued_exception; end
+  def respond_to_missing?(method, include_private = nil); end
+  extend RSpec::Matchers::DSL::Macros
+  extend RSpec::Matchers::DSL::Macros::Deprecated
+  include RSpec::Matchers
+  include RSpec::Matchers::Composable
+  include RSpec::Matchers::DSL::DefaultImplementations
+end
+class RSpec::Matchers::MatcherDelegator
+  def base_matcher; end
+  def initialize(base_matcher); end
+  def initialize_copy(other); end
+  def method_missing(*args, &block); end
+  def respond_to_missing?(name, include_all = nil); end
+  include RSpec::Matchers::Composable
+end
+class RSpec::Matchers::AliasedMatcher < RSpec::Matchers::MatcherDelegator
+  def description; end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def initialize(base_matcher, description_block); end
+  def method_missing(*arg0); end
+end
+class RSpec::Matchers::AliasedMatcherWithOperatorSupport < RSpec::Matchers::AliasedMatcher
+end
+class RSpec::Matchers::AliasedNegatedMatcher < RSpec::Matchers::AliasedMatcher
+  def does_not_match?(*args, &block); end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def matches?(*args, &block); end
+  def optimal_failure_message(same, inverted); end
+end
+class RSpec::Matchers::ExpectedsForMultipleDiffs
+  def diffs(differ, actual); end
+  def initialize(expected_list); end
+  def message_with_diff(message, differ, actual); end
+  def self.diff_label_for(matcher); end
+  def self.for_many_matchers(matchers); end
+  def self.from(expected); end
+  def self.truncated(description); end
+end
+module RSpec::Support
+  def self.require_rspec_expectations(f); end
+  def self.require_rspec_matchers(f); end
+end
+module RSpec::Expectations
+  def self.configuration; end
+  def self.differ; end
+  def self.fail_with(message, expected = nil, actual = nil); end
+end
+class RSpec::Expectations::ExpectationTarget
+  def initialize(value); end
+  def self.for(value, block); end
+  def target; end
+  include RSpec::Expectations::ExpectationTarget::InstanceMethods
+end
+module RSpec::Expectations::ExpectationTarget::UndefinedValue
+end
+module RSpec::Expectations::ExpectationTarget::InstanceMethods
+  def not_to(matcher = nil, message = nil, &block); end
+  def prevent_operator_matchers(verb); end
+  def to(matcher = nil, message = nil, &block); end
+  def to_not(matcher = nil, message = nil, &block); end
+end
+class RSpec::Expectations::BlockExpectationTarget < RSpec::Expectations::ExpectationTarget
+  def enforce_block_expectation(matcher); end
+  def not_to(matcher, message = nil, &block); end
+  def supports_block_expectations?(matcher); end
+  def to(matcher, message = nil, &block); end
+  def to_not(matcher, message = nil, &block); end
+end
+module RSpec::Expectations::Syntax
+  def default_should_host; end
+  def disable_expect(syntax_host = nil); end
+  def disable_should(syntax_host = nil); end
+  def enable_expect(syntax_host = nil); end
+  def enable_should(syntax_host = nil); end
+  def expect_enabled?(syntax_host = nil); end
+  def self.default_should_host; end
+  def self.disable_expect(syntax_host = nil); end
+  def self.disable_should(syntax_host = nil); end
+  def self.enable_expect(syntax_host = nil); end
+  def self.enable_should(syntax_host = nil); end
+  def self.expect_enabled?(syntax_host = nil); end
+  def self.should_enabled?(syntax_host = nil); end
+  def self.warn_about_should!; end
+  def self.warn_about_should_unless_configured(method_name); end
+  def should_enabled?(syntax_host = nil); end
+  def warn_about_should!; end
+  def warn_about_should_unless_configured(method_name); end
+end
+class BasicObject
+end
+class RSpec::Expectations::Configuration
+  def add_should_and_should_not_to(*modules); end
+  def backtrace_formatter; end
+  def backtrace_formatter=(arg0); end
+  def color?; end
+  def false_positives_handler; end
+  def include_chain_clauses_in_custom_matcher_descriptions=(arg0); end
+  def include_chain_clauses_in_custom_matcher_descriptions?; end
+  def initialize; end
+  def max_formatted_output_length=(length); end
+  def on_potential_false_positives; end
+  def on_potential_false_positives=(behavior); end
+  def reset_syntaxes_to_default; end
+  def strict_predicate_matchers; end
+  def strict_predicate_matchers=(flag); end
+  def strict_predicate_matchers?; end
+  def syntax; end
+  def syntax=(values); end
+  def warn_about_potential_false_positives=(boolean); end
+  def warn_about_potential_false_positives?; end
+end
+module RSpec::Expectations::Configuration::NullBacktraceFormatter
+  def self.format_backtrace(backtrace); end
+end
+class InvalidName___Class_0x00___Differ_11
+end
+module RSpec::Expectations::ExpectationHelper
+  def self.check_message(msg); end
+  def self.handle_failure(matcher, message, failure_message_method); end
+  def self.modern_matcher_from(matcher); end
+  def self.with_matcher(handler, matcher, message); end
+end
+class RSpec::Expectations::PositiveExpectationHandler
+  def self.handle_matcher(actual, initial_matcher, custom_message = nil, &block); end
+  def self.opposite_should_method; end
+  def self.should_method; end
+  def self.verb; end
+end
+class RSpec::Expectations::NegativeExpectationHandler
+  def self.does_not_match?(matcher, actual, &block); end
+  def self.handle_matcher(actual, initial_matcher, custom_message = nil, &block); end
+  def self.opposite_should_method; end
+  def self.should_method; end
+  def self.verb; end
+end
+class RSpec::Expectations::LegacyMatcherAdapter < RSpec::Matchers::MatcherDelegator
+  def initialize(matcher); end
+  def self.wrap(matcher); end
+end
+class RSpec::Expectations::LegacyMatcherAdapter::RSpec2 < RSpec::Expectations::LegacyMatcherAdapter
+  def failure_message; end
+  def failure_message_when_negated; end
+  def self.interface_matches?(matcher); end
+end
+class RSpec::Expectations::LegacyMatcherAdapter::RSpec1 < RSpec::Expectations::LegacyMatcherAdapter
+  def failure_message; end
+  def failure_message_when_negated; end
+  def self.interface_matches?(matcher); end
+end
+module RSpec::Expectations::Version
+end
+class RSpec::Expectations::ExpectationNotMetError < Exception
+end
+class RSpec::Expectations::MultipleExpectationsNotMetError < RSpec::Expectations::ExpectationNotMetError
+  def aggregation_block_label; end
+  def aggregation_metadata; end
+  def all_exceptions; end
+  def backtrace_line(line); end
+  def block_description; end
+  def enumerated(exceptions, index_offset); end
+  def enumerated_errors; end
+  def enumerated_failures; end
+  def exception_count_description; end
+  def exclusion_patterns; end
+  def failures; end
+  def format_backtrace(backtrace); end
+  def indentation; end
+  def indented(failure_message, index); end
+  def index_label(index); end
+  def initialize(failure_aggregator); end
+  def longest_index_label_width; end
+  def message; end
+  def other_errors; end
+  def pluralize(noun, count); end
+  def summary; end
+  def width_of_label(index); end
+end
+class RSpec::Expectations::BlockSnippetExtractor
+  def beginning_line_number; end
+  def block_token_extractor; end
+  def body_content_lines; end
+  def file_path; end
+  def initialize(proc, method_name); end
+  def method_name; end
+  def proc; end
+  def raw_body_lines; end
+  def raw_body_snippet; end
+  def self.try_extracting_single_line_body_of(proc, method_name); end
+  def source; end
+  def source_location; end
+end
+class RSpec::Expectations::BlockSnippetExtractor::Error < StandardError
+end
+class RSpec::Expectations::BlockSnippetExtractor::TargetNotFoundError < RSpec::Expectations::BlockSnippetExtractor::Error
+end
+class RSpec::Expectations::BlockSnippetExtractor::AmbiguousTargetError < RSpec::Expectations::BlockSnippetExtractor::Error
+end
+class RSpec::Expectations::BlockSnippetExtractor::BlockTokenExtractor < Struct
+  def after_beginning_of_args_state(token); end
+  def after_beginning_of_body_state(token); end
+  def after_method_call_state(token); end
+  def after_opener_state(token); end
+  def beginning_line_number; end
+  def beginning_line_number=(_); end
+  def block_locator; end
+  def body_tokens; end
+  def correct_block?(body_tokens); end
+  def finalize_pending_tokens!; end
+  def finish!; end
+  def finish_or_find_next_block_if_incorrect!; end
+  def handle_closer_token(token); end
+  def handle_opener_token(token); end
+  def initial_state(token); end
+  def initialize(*arg0); end
+  def invoke_state_handler(token); end
+  def method_name; end
+  def method_name=(_); end
+  def opener_token?(token); end
+  def opener_token_stack; end
+  def parse!; end
+  def pending_tokens; end
+  def pipe_token?(token); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def source; end
+  def source=(_); end
+  def state; end
+end
+class RSpec::Expectations::BlockSnippetExtractor::BlockLocator < Struct
+  def beginning_line_number; end
+  def beginning_line_number=(_); end
+  def block_body_node; end
+  def block_wrapper_node; end
+  def body_content_locations; end
+  def candidate_block_wrapper_nodes; end
+  def candidate_method_ident_nodes; end
+  def method_call_location; end
+  def method_ident_node; end
+  def method_ident_node?(node); end
+  def method_name; end
+  def method_name=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def source; end
+  def source=(_); end
+end
+class RSpec::Expectations::FailureAggregator
+  def aggregate; end
+  def assign_backtrace(failure); end
+  def block_label; end
+  def call(failure, options); end
+  def failures; end
+  def initialize(block_label, metadata); end
+  def metadata; end
+  def notify_aggregated_failures; end
+  def other_errors; end
+end
+class RSpec::Matchers::BuiltIn::BeAKindOf < RSpec::Matchers::BuiltIn::BaseMatcher
+  def match(expected, actual); end
+end
+class RSpec::Matchers::BuiltIn::BeAnInstanceOf < RSpec::Matchers::BuiltIn::BaseMatcher
+  def description; end
+  def match(expected, actual); end
+end
+class RSpec::Matchers::BuiltIn::BeBetween < RSpec::Matchers::BuiltIn::BaseMatcher
+  def comparable?; end
+  def compare; end
+  def description; end
+  def exclusive; end
+  def failure_message; end
+  def inclusive; end
+  def initialize(min, max); end
+  def matches?(actual); end
+  def not_comparable_clause; end
+end
+class RSpec::Matchers::BuiltIn::BeTruthy < RSpec::Matchers::BuiltIn::BaseMatcher
+  def failure_message; end
+  def failure_message_when_negated; end
+  def match(_, actual); end
+end
+class RSpec::Matchers::BuiltIn::BeFalsey < RSpec::Matchers::BuiltIn::BaseMatcher
+  def failure_message; end
+  def failure_message_when_negated; end
+  def match(_, actual); end
+end
+class RSpec::Matchers::BuiltIn::BeNil < RSpec::Matchers::BuiltIn::BaseMatcher
+  def failure_message; end
+  def failure_message_when_negated; end
+  def match(_, actual); end
+end
+module RSpec::Matchers::BuiltIn::BeHelpers
+  def args_to_s; end
+  def args_to_sentence; end
+  def expected_to_sentence; end
+  def inspected_args; end
+  def parenthesize(string); end
+end
+class RSpec::Matchers::BuiltIn::Be < RSpec::Matchers::BuiltIn::BaseMatcher
+  def <(operand); end
+  def <=(operand); end
+  def ==(operand); end
+  def ===(operand); end
+  def =~(operand); end
+  def >(operand); end
+  def >=(operand); end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def initialize(*args); end
+  def match(_, actual); end
+  include RSpec::Matchers::BuiltIn::BeHelpers
+end
+class RSpec::Matchers::BuiltIn::BeComparedTo < RSpec::Matchers::BuiltIn::BaseMatcher
+  def description; end
+  def does_not_match?(actual); end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def initialize(operand, operator); end
+  def matches?(actual); end
+  def perform_match(actual); end
+  include RSpec::Matchers::BuiltIn::BeHelpers
+end
+class RSpec::Matchers::BuiltIn::DynamicPredicate < RSpec::Matchers::BuiltIn::BaseMatcher
+  def description; end
+  def does_not_match?(actual, &block); end
+  def expectation_of(value); end
+  def failure_message; end
+  def failure_message_expecting(value); end
+  def failure_message_when_negated; end
+  def failure_to_respond_explanation; end
+  def initialize(method_name, *args, &block); end
+  def matches?(actual, &block); end
+  def method_description; end
+  def predicate_accessible?; end
+  def predicate_matches?(value = nil); end
+  def predicate_method_name; end
+  def predicate_result; end
+  def private_predicate?; end
+  def root; end
+  def validity_message; end
+  include RSpec::Matchers::BuiltIn::BeHelpers
+end
+class RSpec::Matchers::BuiltIn::Has < RSpec::Matchers::BuiltIn::DynamicPredicate
+  def predicate; end
+end
+class RSpec::Matchers::BuiltIn::BePredicate < RSpec::Matchers::BuiltIn::DynamicPredicate
+  def failure_to_respond_explanation; end
+  def predicate; end
+  def predicate_accessible?; end
+  def predicate_method_name; end
+  def present_tense_predicate; end
+end
+class RSpec::Matchers::BuiltIn::BeWithin < RSpec::Matchers::BuiltIn::BaseMatcher
+  def description; end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def initialize(delta); end
+  def matches?(actual); end
+  def needs_expected; end
+  def not_numeric_clause; end
+  def numeric?; end
+  def of(expected); end
+  def percent_of(expected); end
+end
+class RSpec::Matchers::BuiltIn::Change < RSpec::Matchers::BuiltIn::BaseMatcher
+  def by(expected_delta); end
+  def by_at_least(minimum); end
+  def by_at_most(maximum); end
+  def change_details; end
+  def description; end
+  def does_not_match?(event_proc); end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def from(value); end
+  def initialize(receiver = nil, message = nil, &block); end
+  def matches?(event_proc); end
+  def negative_failure_reason; end
+  def perform_change(event_proc); end
+  def positive_failure_reason; end
+  def raise_block_syntax_error; end
+  def supports_block_expectations?; end
+  def to(value); end
+end
+class RSpec::Matchers::BuiltIn::ChangeRelatively < RSpec::Matchers::BuiltIn::BaseMatcher
+  def description; end
+  def does_not_match?(_event_proc); end
+  def failure_message; end
+  def failure_reason; end
+  def initialize(change_details, expected_delta, relativity, &comparer); end
+  def matches?(event_proc); end
+  def supports_block_expectations?; end
+end
+class RSpec::Matchers::BuiltIn::SpecificValuesChange < RSpec::Matchers::BuiltIn::BaseMatcher
+  def after_value_failure; end
+  def before_value_failure; end
+  def description; end
+  def did_change_failure; end
+  def did_not_change_failure; end
+  def failure_message; end
+  def initialize(change_details, from, to); end
+  def matches?(event_proc); end
+  def matches_after?; end
+  def not_given_a_block_failure; end
+  def perform_change(event_proc); end
+  def supports_block_expectations?; end
+end
+class RSpec::Matchers::BuiltIn::ChangeFromValue < RSpec::Matchers::BuiltIn::SpecificValuesChange
+  def change_description; end
+  def does_not_match?(event_proc); end
+  def failure_message_when_negated; end
+  def initialize(change_details, expected_before); end
+  def to(value); end
+end
+class RSpec::Matchers::BuiltIn::ChangeToValue < RSpec::Matchers::BuiltIn::SpecificValuesChange
+  def change_description; end
+  def does_not_match?(_event_proc); end
+  def from(value); end
+  def initialize(change_details, expected_after); end
+end
+class RSpec::Matchers::BuiltIn::ChangeDetails
+  def actual_after; end
+  def actual_delta; end
+  def changed?; end
+  def evaluate_value_proc; end
+  def extract_value_block_snippet; end
+  def initialize(matcher_name, receiver = nil, message = nil, &block); end
+  def message_notation(receiver, message); end
+  def perform_change(event_proc); end
+  def value_representation; end
+end
+class RSpec::Matchers::BuiltIn::Compound < RSpec::Matchers::BuiltIn::BaseMatcher
+  def compound_failure_message; end
+  def description; end
+  def diffable?; end
+  def diffable_matcher_list; end
+  def diffable_matcher_list_for(matcher); end
+  def does_not_match?(_actual); end
+  def evaluator; end
+  def expected; end
+  def expects_call_stack_jump?; end
+  def indent_multiline_message(message); end
+  def initialize(matcher_1, matcher_2); end
+  def initialize_copy(other); end
+  def match(_expected, actual); end
+  def matcher_1; end
+  def matcher_1_matches?; end
+  def matcher_2; end
+  def matcher_2_matches?; end
+  def matcher_is_diffable?(matcher); end
+  def matcher_supports_block_expectations?(matcher); end
+  def supports_block_expectations?; end
+end
+class RSpec::Matchers::BuiltIn::Compound::SequentialEvaluator
+  def initialize(actual, *arg1); end
+  def matcher_matches?(matcher); end
+end
+class RSpec::Matchers::BuiltIn::Compound::NestedEvaluator
+  def initialize(actual, matcher_1, matcher_2); end
+  def inner_matcher_block(outer_args); end
+  def matcher_matches?(matcher); end
+  def order_block_matchers; end
+  def self.matcher_expects_call_stack_jump?(matcher); end
+end
+class RSpec::Matchers::BuiltIn::Compound::And < RSpec::Matchers::BuiltIn::Compound
+  def conjunction; end
+  def failure_message; end
+  def match(*arg0); end
+end
+class RSpec::Matchers::BuiltIn::Compound::Or < RSpec::Matchers::BuiltIn::Compound
+  def conjunction; end
+  def failure_message; end
+  def match(*arg0); end
+end
+class RSpec::Matchers::BuiltIn::ContainExactly < RSpec::Matchers::BuiltIn::BaseMatcher
+  def actual_collection_line; end
+  def best_solution; end
+  def convert_actual_to_an_array; end
+  def describe_collection(collection, surface_descriptions = nil); end
+  def description; end
+  def expected_collection_line; end
+  def extra_elements_line; end
+  def extra_items; end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def generate_failure_message; end
+  def match(_expected, _actual); end
+  def match_when_sorted?; end
+  def message_line(prefix, collection, surface_descriptions = nil); end
+  def missing_elements_line; end
+  def missing_items; end
+  def pairings_maximizer; end
+  def safe_sort(array); end
+  def to_a_disallowed?(object); end
+end
+class RSpec::Matchers::BuiltIn::ContainExactly::PairingsMaximizer
+  def actual_to_expected_matched_indexes; end
+  def apply_pairing_to(indeterminates, original_matches, other_list_index); end
+  def best_solution_for_pairing(expected_index, actual_index); end
+  def categorize_indexes(indexes_to_categorize, other_indexes); end
+  def expected_to_actual_matched_indexes; end
+  def find_best_solution; end
+  def initialize(expected_to_actual_matched_indexes, actual_to_expected_matched_indexes); end
+  def reciprocal_single_match?(matches, index, other_list); end
+  def solution; end
+end
+class RSpec::Matchers::BuiltIn::ContainExactly::PairingsMaximizer::Solution < Struct
+  def +(derived_candidate_solution); end
+  def candidate?; end
+  def ideal?; end
+  def indeterminate_actual_indexes; end
+  def indeterminate_actual_indexes=(_); end
+  def indeterminate_expected_indexes; end
+  def indeterminate_expected_indexes=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def unmatched_actual_indexes; end
+  def unmatched_actual_indexes=(_); end
+  def unmatched_expected_indexes; end
+  def unmatched_expected_indexes=(_); end
+  def unmatched_item_count; end
+  def worse_than?(other); end
+end
+class RSpec::Matchers::BuiltIn::ContainExactly::PairingsMaximizer::NullSolution
+  def self.worse_than?(_other); end
+end
+class RSpec::Matchers::BuiltIn::Cover < RSpec::Matchers::BuiltIn::BaseMatcher
+  def does_not_match?(range); end
+  def initialize(*expected); end
+  def matches?(range); end
+end
+class RSpec::Matchers::BuiltIn::StartOrEndWith < RSpec::Matchers::BuiltIn::BaseMatcher
+  def description; end
+  def failure_message; end
+  def initialize(*expected); end
+  def match(_expected, actual); end
+  def subsets_comparable?; end
+end
+class RSpec::Matchers::BuiltIn::StartWith < RSpec::Matchers::BuiltIn::StartOrEndWith
+  def element_matches?; end
+  def subset_matches?; end
+end
+class RSpec::Matchers::BuiltIn::EndWith < RSpec::Matchers::BuiltIn::StartOrEndWith
+  def element_matches?; end
+  def subset_matches?; end
+end
+class RSpec::Matchers::BuiltIn::Eq < RSpec::Matchers::BuiltIn::BaseMatcher
+  def description; end
+  def diffable?; end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def match(expected, actual); end
+end
+class RSpec::Matchers::BuiltIn::Eql < RSpec::Matchers::BuiltIn::BaseMatcher
+  def diffable?; end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def match(expected, actual); end
+end
+class RSpec::Matchers::BuiltIn::Equal < RSpec::Matchers::BuiltIn::BaseMatcher
+  def actual_inspected; end
+  def detailed_failure_message; end
+  def diffable?; end
+  def expected_is_a_literal_singleton?; end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def inspect_object(o); end
+  def match(expected, actual); end
+  def simple_failure_message; end
+end
+class RSpec::Matchers::BuiltIn::Exist < RSpec::Matchers::BuiltIn::BaseMatcher
+  def does_not_match?(actual); end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def initialize(*expected); end
+  def matches?(actual); end
+end
+class Anonymous_Struct_12 < Struct
+  def actual; end
+  def actual=(_); end
+  def expected; end
+  def expected=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Matchers::BuiltIn::Exist::ExistenceTest < Anonymous_Struct_12
+  def actual_exists?; end
+  def deprecated(predicate, actual); end
+  def existence_values; end
+  def predicates; end
+  def uniq_truthy_values; end
+  def valid_test?; end
+  def validity_message; end
+end
+class RSpec::Matchers::BuiltIn::HaveAttributes < RSpec::Matchers::BuiltIn::BaseMatcher
+  def actual; end
+  def actual_has_attribute?(attribute_key, attribute_value); end
+  def cache_all_values; end
+  def description; end
+  def diffable?; end
+  def does_not_match?(actual); end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def formatted_values; end
+  def initialize(expected); end
+  def matches?(actual); end
+  def perform_match(predicate); end
+  def respond_to_attributes?; end
+  def respond_to_failed; end
+  def respond_to_failure_message_or; end
+  def respond_to_matcher; end
+end
+module RSpec::Matchers::BuiltIn::CountExpectation
+  def at_least(number); end
+  def at_most(number); end
+  def count_constraint_to_number(n); end
+  def count_expectation_description; end
+  def count_expectation_type; end
+  def count_failure_reason(action); end
+  def cover?(count, number); end
+  def exactly(number); end
+  def expected_count; end
+  def expected_count_matches?(actual_count); end
+  def has_expected_count?; end
+  def human_readable_count(count); end
+  def human_readable_expectation_type; end
+  def once; end
+  def raise_impossible_count_expectation(count); end
+  def raise_unsupported_count_expectation; end
+  def set_expected_count(relativity, n); end
+  def thrice; end
+  def times; end
+  def twice; end
+  def unsupported_count_expectation?(relativity); end
+end
+class RSpec::Matchers::BuiltIn::Include < RSpec::Matchers::BuiltIn::BaseMatcher
+  def actual_collection_includes?(expected_item); end
+  def actual_hash_has_key?(expected_key); end
+  def actual_hash_includes?(expected_key, expected_value); end
+  def check_actual?(actual); end
+  def check_expected_count?; end
+  def comparing_hash_keys?(expected_item); end
+  def comparing_hash_to_a_subset?(expected_item); end
+  def convert_to_hash?(obj); end
+  def count_enumerable(expected_item); end
+  def count_inclusions; end
+  def description; end
+  def diff_would_wrongly_highlight_matched_item?; end
+  def diffable?; end
+  def does_not_match?(actual); end
+  def excluded_from_actual; end
+  def expected; end
+  def expecteds; end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def format_failure_message(preposition); end
+  def initialize(*expecteds); end
+  def matches?(actual); end
+  def perform_match(&block); end
+  def readable_list_of(items); end
+  include RSpec::Matchers::BuiltIn::CountExpectation
+end
+class RSpec::Matchers::BuiltIn::All < RSpec::Matchers::BuiltIn::BaseMatcher
+  def add_new_line_if_needed(message); end
+  def description; end
+  def does_not_match?(_actual); end
+  def failed_objects; end
+  def failure_message; end
+  def failure_message_for_item(index, failure_message); end
+  def indent_multiline_message(message); end
+  def index_failed_objects; end
+  def initialize(matcher); end
+  def initialize_copy(other); end
+  def iterable?; end
+  def match(_expected, _actual); end
+  def matcher; end
+end
+class RSpec::Matchers::BuiltIn::Match < RSpec::Matchers::BuiltIn::BaseMatcher
+  def can_safely_call_match?(expected, actual); end
+  def description; end
+  def diffable?; end
+  def initialize(expected); end
+  def match(expected, actual); end
+  def match_captures(expected, actual); end
+  def with_captures(*captures); end
+end
+class RSpec::Matchers::BuiltIn::ReliableMatchData
+  def captures; end
+  def initialize(match_data); end
+  def match_data; end
+  def names; end
+end
+class RSpec::Matchers::BuiltIn::OperatorMatcher
+  def !=(_expected); end
+  def !~(_expected); end
+  def <(expected); end
+  def <=(expected); end
+  def ==(expected); end
+  def ===(expected); end
+  def =~(expected); end
+  def >(expected); end
+  def >=(expected); end
+  def description; end
+  def eval_match(actual, operator, expected); end
+  def fail_with_message(message); end
+  def has_non_generic_implementation_of?(op); end
+  def initialize(actual); end
+  def self.get(klass, operator); end
+  def self.register(klass, operator, matcher); end
+  def self.registry; end
+  def self.unregister(klass, operator); end
+  def self.use_custom_matcher_or_delegate(operator); end
+end
+class RSpec::Matchers::BuiltIn::PositiveOperatorMatcher < RSpec::Matchers::BuiltIn::OperatorMatcher
+  def __delegate_operator(actual, operator, expected); end
+end
+class RSpec::Matchers::BuiltIn::NegativeOperatorMatcher < RSpec::Matchers::BuiltIn::OperatorMatcher
+  def __delegate_operator(actual, operator, expected); end
+end
+class RSpec::Matchers::BuiltIn::Output < RSpec::Matchers::BuiltIn::BaseMatcher
+  def actual_output_description; end
+  def captured?; end
+  def description; end
+  def diffable?; end
+  def does_not_match?(block); end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def initialize(expected); end
+  def matches?(block); end
+  def negative_failure_reason; end
+  def positive_failure_reason; end
+  def supports_block_expectations?; end
+  def to_stderr; end
+  def to_stderr_from_any_process; end
+  def to_stdout; end
+  def to_stdout_from_any_process; end
+end
+module RSpec::Matchers::BuiltIn::NullCapture
+  def self.capture(_block); end
+  def self.name; end
+end
+module RSpec::Matchers::BuiltIn::CaptureStdout
+  def self.capture(block); end
+  def self.name; end
+end
+module RSpec::Matchers::BuiltIn::CaptureStderr
+  def self.capture(block); end
+  def self.name; end
+end
+class Anonymous_Struct_13 < Struct
+  def name; end
+  def name=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def stream; end
+  def stream=(_); end
+end
+class RSpec::Matchers::BuiltIn::CaptureStreamToTempfile < Anonymous_Struct_13
+  def capture(block); end
+end
+class RSpec::Matchers::BuiltIn::RaiseError
+  def block_matches?; end
+  def description; end
+  def does_not_match?(given_proc); end
+  def error_and_message_match?; end
+  def eval_block; end
+  def expectation_matched?; end
+  def expected_error; end
+  def expecting_specific_exception?; end
+  def expects_call_stack_jump?; end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def format_backtrace(backtrace); end
+  def given_error; end
+  def handle_warning(message); end
+  def initialize(expected_error_or_message, expected_message, &block); end
+  def matches?(given_proc, negative_expectation = nil, &block); end
+  def raise_message_already_set; end
+  def ready_to_eval_block?; end
+  def supports_block_expectations?; end
+  def verify_message; end
+  def warn_about_bare_error!; end
+  def warn_about_bare_error?; end
+  def warn_about_negative_false_positive!(expression); end
+  def warn_about_nil_error!; end
+  def warn_about_nil_error?; end
+  def warn_for_negative_false_positives!; end
+  def warning; end
+  def with_message(expected_message); end
+  include RSpec::Matchers::Composable
+end
+class RSpec::Matchers::BuiltIn::RespondTo < RSpec::Matchers::BuiltIn::BaseMatcher
+  def and_any_keywords; end
+  def and_keywords(*keywords); end
+  def and_unlimited_arguments; end
+  def argument; end
+  def arguments; end
+  def description; end
+  def does_not_match?(actual); end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def find_failing_method_names(actual, filter_method); end
+  def ignoring_method_signature_failure!; end
+  def initialize(*names); end
+  def matches?(actual); end
+  def matches_arity?(actual, name); end
+  def pp_names; end
+  def with(n); end
+  def with_any_keywords; end
+  def with_arity; end
+  def with_arity_string; end
+  def with_keywords(*keywords); end
+  def with_keywords_string; end
+  def with_unlimited_arguments; end
+end
+class RSpec::Matchers::BuiltIn::RespondTo::ArityCheck
+  def initialize(expected_arity, expected_keywords, arbitrary_keywords, unlimited_arguments); end
+  def matches?(actual, name); end
+  def method_signature_for(actual, name); end
+  def verifier_for(actual, name); end
+end
+class RSpec::Matchers::BuiltIn::Satisfy < RSpec::Matchers::BuiltIn::BaseMatcher
+  def block_representation; end
+  def description; end
+  def extract_block_snippet; end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def initialize(description = nil, &block); end
+  def matches?(actual, &block); end
+end
+class RSpec::Matchers::BuiltIn::ThrowSymbol
+  def actual_result; end
+  def caught; end
+  def description; end
+  def does_not_match?(given_proc); end
+  def expected(symbol_desc = nil); end
+  def expects_call_stack_jump?; end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def initialize(expected_symbol = nil, expected_arg = nil); end
+  def matches?(given_proc); end
+  def supports_block_expectations?; end
+  def throw_description(symbol, arg); end
+  include RSpec::Matchers::Composable
+end
+class RSpec::Matchers::BuiltIn::YieldProbe
+  def assert_used!; end
+  def assert_valid_expect_block!; end
+  def has_block?; end
+  def initialize(block, &callback); end
+  def num_yields; end
+  def num_yields=(arg0); end
+  def probe; end
+  def self.probe(block, &callback); end
+  def single_yield_args; end
+  def to_proc; end
+  def yielded_args; end
+  def yielded_args=(arg0); end
+  def yielded_once?(matcher_name); end
+end
+class RSpec::Matchers::BuiltIn::YieldControl < RSpec::Matchers::BuiltIn::BaseMatcher
+  def does_not_match?(block); end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def failure_reason; end
+  def matches?(block); end
+  def supports_block_expectations?; end
+  include RSpec::Matchers::BuiltIn::CountExpectation
+end
+class RSpec::Matchers::BuiltIn::YieldWithNoArgs < RSpec::Matchers::BuiltIn::BaseMatcher
+  def does_not_match?(block); end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def matches?(block); end
+  def negative_failure_reason; end
+  def positive_failure_reason; end
+  def supports_block_expectations?; end
+end
+class RSpec::Matchers::BuiltIn::YieldWithArgs < RSpec::Matchers::BuiltIn::BaseMatcher
+  def all_args_match?; end
+  def args_currently_match?; end
+  def description; end
+  def does_not_match?(block); end
+  def expected_arg_description; end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def initialize(*args); end
+  def matches?(block); end
+  def negative_failure_reason; end
+  def positive_failure_reason; end
+  def supports_block_expectations?; end
+end
+class RSpec::Matchers::BuiltIn::YieldSuccessiveArgs < RSpec::Matchers::BuiltIn::BaseMatcher
+  def description; end
+  def does_not_match?(block); end
+  def expected_arg_description; end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def initialize(*args); end
+  def matches?(block); end
+  def negative_failure_reason; end
+  def positive_failure_reason; end
+  def supports_block_expectations?; end
+end
diff --git a/sorbet/rbi/gems/rspec-mocks.rbi b/sorbet/rbi/gems/rspec-mocks.rbi
new file mode 100644
index 0000000..a1a647e
--- /dev/null
+++ b/sorbet/rbi/gems/rspec-mocks.rbi
@@ -0,0 +1,1091 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rspec-mocks/all/rspec-mocks.rbi
+#
+# rspec-mocks-3.10.2
+
+module RSpec
+end
+module RSpec::Mocks
+  def self.allow_message(subject, message, opts = nil, &block); end
+  def self.configuration; end
+  def self.error_generator; end
+  def self.expect_message(subject, message, opts = nil, &block); end
+  def self.setup; end
+  def self.space; end
+  def self.teardown; end
+  def self.verify; end
+  def self.with_temporary_scope; end
+end
+class RSpec::Mocks::InstanceMethodStasher
+  def handle_restoration_failures; end
+  def initialize(object, method); end
+  def method_defined_directly_on_klass?; end
+  def method_defined_on_klass?(klass = nil); end
+  def method_is_stashed?; end
+  def method_owned_by_klass?; end
+  def original_method; end
+  def restore; end
+  def stash; end
+end
+class RSpec::Mocks::MethodDouble
+  def add_default_stub(*args, &implementation); end
+  def add_expectation(error_generator, expectation_ordering, expected_from, opts, &implementation); end
+  def add_simple_expectation(method_name, response, error_generator, backtrace_line); end
+  def add_simple_stub(method_name, response); end
+  def add_stub(error_generator, expectation_ordering, expected_from, opts = nil, &implementation); end
+  def build_expectation(error_generator, expectation_ordering); end
+  def clear; end
+  def configure_method; end
+  def define_proxy_method; end
+  def definition_target; end
+  def expectations; end
+  def initialize(object, method_name, proxy); end
+  def message_expectation_class; end
+  def method_name; end
+  def method_stasher; end
+  def new_rspec_prepended_module; end
+  def object; end
+  def object_singleton_class; end
+  def original_implementation_callable; end
+  def original_method; end
+  def proxy_method_invoked(_obj, *args, &block); end
+  def raise_method_not_stubbed_error; end
+  def remove_method_from_definition_target; end
+  def remove_stub; end
+  def remove_stub_if_present; end
+  def reset; end
+  def restore_original_method; end
+  def restore_original_visibility; end
+  def save_original_implementation_callable!; end
+  def setup_simple_method_double(method_name, response, collection, error_generator = nil, backtrace_line = nil); end
+  def show_frozen_warning; end
+  def stubs; end
+  def usable_rspec_prepended_module; end
+  def verify; end
+  def visibility; end
+end
+class RSpec::Mocks::MethodDouble::RSpecPrependedModule < Module
+end
+module RSpec::Mocks::ArgumentMatchers
+  def a_kind_of(klass); end
+  def an_instance_of(klass); end
+  def any_args; end
+  def anything; end
+  def array_including(*args); end
+  def boolean; end
+  def duck_type(*args); end
+  def hash_excluding(*args); end
+  def hash_including(*args); end
+  def hash_not_including(*args); end
+  def instance_of(klass); end
+  def kind_of(klass); end
+  def no_args; end
+  def self.anythingize_lonely_keys(*args); end
+end
+class RSpec::Mocks::ArgumentMatchers::SingletonMatcher
+  def self.inherited(subklass); end
+  def self.new(*arg0); end
+end
+class RSpec::Mocks::ArgumentMatchers::AnyArgsMatcher < RSpec::Mocks::ArgumentMatchers::SingletonMatcher
+  def description; end
+end
+class RSpec::Mocks::ArgumentMatchers::AnyArgMatcher < RSpec::Mocks::ArgumentMatchers::SingletonMatcher
+  def ===(_other); end
+  def description; end
+end
+class RSpec::Mocks::ArgumentMatchers::NoArgsMatcher < RSpec::Mocks::ArgumentMatchers::SingletonMatcher
+  def description; end
+end
+class RSpec::Mocks::ArgumentMatchers::BooleanMatcher < RSpec::Mocks::ArgumentMatchers::SingletonMatcher
+  def ===(value); end
+  def description; end
+end
+class RSpec::Mocks::ArgumentMatchers::BaseHashMatcher
+  def ===(predicate, actual); end
+  def description(name); end
+  def formatted_expected_hash; end
+  def initialize(expected); end
+end
+class RSpec::Mocks::ArgumentMatchers::HashIncludingMatcher < RSpec::Mocks::ArgumentMatchers::BaseHashMatcher
+  def ===(actual); end
+  def description; end
+end
+class RSpec::Mocks::ArgumentMatchers::HashExcludingMatcher < RSpec::Mocks::ArgumentMatchers::BaseHashMatcher
+  def ===(actual); end
+  def description; end
+end
+class RSpec::Mocks::ArgumentMatchers::ArrayIncludingMatcher
+  def ===(actual); end
+  def description; end
+  def formatted_expected_values; end
+  def initialize(expected); end
+end
+class RSpec::Mocks::ArgumentMatchers::DuckTypeMatcher
+  def ===(value); end
+  def description; end
+  def initialize(*methods_to_respond_to); end
+end
+class RSpec::Mocks::ArgumentMatchers::InstanceOf
+  def ===(actual); end
+  def description; end
+  def initialize(klass); end
+end
+class RSpec::Mocks::ArgumentMatchers::KindOf
+  def ===(actual); end
+  def description; end
+  def initialize(klass); end
+end
+class RSpec::Mocks::ObjectReference
+  def self.anonymous_module?(mod); end
+  def self.for(object_module_or_name, allow_direct_object_refs = nil); end
+  def self.name_of(mod); end
+end
+class RSpec::Mocks::DirectObjectReference
+  def const_to_replace; end
+  def defined?; end
+  def description; end
+  def initialize(object); end
+  def target; end
+  def when_loaded; end
+end
+class RSpec::Mocks::NamedObjectReference
+  def const_to_replace; end
+  def defined?; end
+  def description; end
+  def initialize(const_name); end
+  def object; end
+  def target; end
+  def when_loaded; end
+end
+module RSpec::Mocks::ExampleMethods
+  def allow(target); end
+  def allow_any_instance_of(klass); end
+  def allow_message_expectations_on_nil; end
+  def class_double(doubled_class, *args); end
+  def class_spy(*args); end
+  def double(*args); end
+  def expect_any_instance_of(klass); end
+  def have_received(method_name, &block); end
+  def hide_const(constant_name); end
+  def instance_double(doubled_class, *args); end
+  def instance_spy(*args); end
+  def object_double(object_or_name, *args); end
+  def object_spy(*args); end
+  def receive(method_name, &block); end
+  def receive_message_chain(*messages, &block); end
+  def receive_messages(message_return_value_hash); end
+  def self.declare_double(type, *args); end
+  def self.declare_verifying_double(type, ref, *args); end
+  def self.extended(object); end
+  def self.included(klass); end
+  def spy(*args); end
+  def stub_const(constant_name, value, options = nil); end
+  def without_partial_double_verification; end
+  include RSpec::Mocks::ArgumentMatchers
+end
+module RSpec::Mocks::ExampleMethods::ExpectHost
+  def expect(target); end
+end
+class RSpec::Mocks::Proxy
+  def add_message_expectation(method_name, opts = nil, &block); end
+  def add_simple_expectation(method_name, response, location); end
+  def add_simple_stub(method_name, response); end
+  def add_stub(method_name, opts = nil, &implementation); end
+  def as_null_object; end
+  def build_expectation(method_name); end
+  def check_for_unexpected_arguments(expectation); end
+  def ensure_can_be_proxied!(object); end
+  def ensure_implemented(*_args); end
+  def find_almost_matching_expectation(method_name, *args); end
+  def find_almost_matching_stub(method_name, *args); end
+  def find_best_matching_expectation_for(method_name); end
+  def find_matching_expectation(method_name, *args); end
+  def find_matching_method_stub(method_name, *args); end
+  def has_negative_expectation?(message); end
+  def initialize(object, order_group, options = nil); end
+  def message_received(message, *args, &block); end
+  def messages_arg_list; end
+  def method_double_for(message); end
+  def method_double_if_exists_for_message(message); end
+  def null_object?; end
+  def object; end
+  def original_method_handle_for(_message); end
+  def prepended_modules_of_singleton_class; end
+  def raise_missing_default_stub_error(expectation, args_for_multiple_calls); end
+  def raise_unexpected_message_error(method_name, args); end
+  def received_message?(method_name, *args, &block); end
+  def record_message_received(message, *args, &block); end
+  def remove_stub(method_name); end
+  def remove_stub_if_present(method_name); end
+  def replay_received_message_on(expectation, &block); end
+  def reset; end
+  def self.prepended_modules_of(klass); end
+  def verify; end
+  def visibility_for(_method_name); end
+end
+class RSpec::Mocks::Proxy::SpecificMessage < Struct
+  def ==(expectation); end
+  def args; end
+  def args=(_); end
+  def message; end
+  def message=(_); end
+  def object; end
+  def object=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Mocks::TestDoubleProxy < RSpec::Mocks::Proxy
+  def reset; end
+end
+class RSpec::Mocks::PartialDoubleProxy < RSpec::Mocks::Proxy
+  def add_simple_expectation(method_name, response, location); end
+  def add_simple_stub(method_name, response); end
+  def any_instance_class_recorder_observing_method?(klass, method_name); end
+  def message_received(message, *args, &block); end
+  def original_method_handle_for(message); end
+  def reset; end
+  def visibility_for(method_name); end
+end
+module RSpec::Mocks::PartialClassDoubleProxyMethods
+  def initialize(source_space, *args); end
+  def method_double_from_ancestor_for(message); end
+  def original_method_handle_for(message); end
+  def original_unbound_method_handle_from_ancestor_for(message); end
+  def superclass_proxy; end
+end
+class RSpec::Mocks::PartialClassDoubleProxy < RSpec::Mocks::PartialDoubleProxy
+  include RSpec::Mocks::PartialClassDoubleProxyMethods
+end
+class RSpec::Mocks::ProxyForNil < RSpec::Mocks::PartialDoubleProxy
+  def add_message_expectation(method_name, opts = nil, &block); end
+  def add_stub(method_name, opts = nil, &implementation); end
+  def disallow_expectations; end
+  def disallow_expectations=(arg0); end
+  def initialize(order_group); end
+  def raise_error(method_name); end
+  def set_expectation_behavior; end
+  def warn(method_name); end
+  def warn_about_expectations; end
+  def warn_about_expectations=(arg0); end
+  def warn_or_raise!(method_name); end
+end
+module RSpec::Mocks::TestDouble
+  def ==(other); end
+  def __build_mock_proxy(order_group); end
+  def __build_mock_proxy_unless_expired(order_group); end
+  def __disallow_further_usage!; end
+  def __mock_proxy; end
+  def __raise_expired_error; end
+  def as_null_object; end
+  def assign_stubs(stubs); end
+  def freeze; end
+  def initialize(name = nil, stubs = nil); end
+  def initialize_copy(other); end
+  def inspect; end
+  def method_missing(message, *args, &block); end
+  def null_object?; end
+  def respond_to?(message, incl_private = nil); end
+  def to_s; end
+end
+class RSpec::Mocks::Double
+  include RSpec::Mocks::TestDouble
+end
+module RSpec::Mocks::TestDoubleFormatter
+  def self.format(dbl, unwrap = nil); end
+  def self.name_desc(dbl); end
+  def self.type_desc(dbl); end
+  def self.verified_module_desc(dbl); end
+end
+class RSpec::Mocks::ArgumentListMatcher
+  def args_match?(*args); end
+  def ensure_expected_args_valid!; end
+  def expected_args; end
+  def initialize(*expected_args); end
+  def replace_any_args_with_splat_of_anything(before_count, actual_args_count); end
+  def resolve_expected_args_based_on(actual_args); end
+end
+class RSpec::Mocks::SimpleMessageExpectation
+  def called_max_times?; end
+  def initialize(message, response, error_generator, backtrace_line = nil); end
+  def invoke(*_); end
+  def matches?(message, *_); end
+  def unadvise(_); end
+  def verify_messages_received; end
+end
+class RSpec::Mocks::MessageExpectation
+  def and_call_original; end
+  def and_raise(*args); end
+  def and_return(first_value, *values); end
+  def and_throw(*args); end
+  def and_wrap_original(&block); end
+  def and_yield(*args, &block); end
+  def at_least(n, &block); end
+  def at_most(n, &block); end
+  def exactly(n, &block); end
+  def inspect; end
+  def never; end
+  def once(&block); end
+  def ordered(&block); end
+  def thrice(&block); end
+  def time(&block); end
+  def times(&block); end
+  def to_s; end
+  def twice(&block); end
+  def with(*args, &block); end
+  include RSpec::Mocks::MessageExpectation::ImplementationDetails
+end
+module RSpec::Mocks::MessageExpectation::ImplementationDetails
+  def actual_received_count_matters?; end
+  def additional_expected_calls; end
+  def advise(*args); end
+  def and_yield_receiver_to_implementation; end
+  def argument_list_matcher=(arg0); end
+  def called_max_times?; end
+  def description_for(verb); end
+  def ensure_expected_ordering_received!; end
+  def error_generator; end
+  def error_generator=(arg0); end
+  def exception_source_id; end
+  def expectation_count_type; end
+  def expected_args; end
+  def expected_from=(arg0); end
+  def expected_messages_received?; end
+  def expected_received_count=(arg0); end
+  def generate_error; end
+  def has_been_invoked?; end
+  def ignoring_args?; end
+  def implementation; end
+  def implementation=(arg0); end
+  def increase_actual_received_count!; end
+  def initial_implementation_action=(action); end
+  def initialize(error_generator, expectation_ordering, expected_from, method_double, type = nil, opts = nil, &implementation_block); end
+  def inner_implementation_action=(action); end
+  def invoke(parent_stub, *args, &block); end
+  def invoke_incrementing_actual_calls_by(increment, allowed_to_fail, parent_stub, *args, &block); end
+  def invoke_without_incrementing_received_count(parent_stub, *args, &block); end
+  def matches?(message, *args); end
+  def matches_at_least_count?; end
+  def matches_at_most_count?; end
+  def matches_exact_count?; end
+  def matches_name_but_not_args(message, *args); end
+  def message; end
+  def negative?; end
+  def negative_expectation_for?(message); end
+  def ordered?; end
+  def orig_object; end
+  def raise_already_invoked_error_if_necessary(calling_customization); end
+  def raise_out_of_order_error; end
+  def raise_unexpected_message_args_error(args_for_multiple_calls); end
+  def safe_invoke(parent_stub, *args, &block); end
+  def set_expected_received_count(relativity, n); end
+  def similar_messages; end
+  def terminal_implementation_action=(action); end
+  def type; end
+  def unadvise(args); end
+  def verify_messages_received; end
+  def warn_about_stub_override; end
+  def wrap_original(method_name, &block); end
+  def yield_receiver_to_implementation_block?; end
+end
+class RSpec::Mocks::AndYieldImplementation
+  def call(*_args_to_ignore, &block); end
+  def initialize(args_to_yield, eval_context, error_generator); end
+end
+class RSpec::Mocks::AndReturnImplementation
+  def call(*_args_to_ignore, &_block); end
+  def initialize(values_to_return); end
+end
+class RSpec::Mocks::Implementation
+  def actions; end
+  def call(*args, &block); end
+  def initial_action; end
+  def initial_action=(arg0); end
+  def inner_action; end
+  def inner_action=(arg0); end
+  def present?; end
+  def terminal_action; end
+  def terminal_action=(arg0); end
+end
+class RSpec::Mocks::AndWrapOriginalImplementation
+  def call(*args, &block); end
+  def cannot_modify_further_error; end
+  def initial_action=(_value); end
+  def initialize(method, block); end
+  def inner_action; end
+  def inner_action=(_value); end
+  def present?; end
+  def terminal_action=(_value); end
+end
+class RSpec::Mocks::AndWrapOriginalImplementation::CannotModifyFurtherError < StandardError
+end
+class RSpec::Mocks::OrderGroup
+  def clear; end
+  def consume; end
+  def empty?; end
+  def expectation_for(message); end
+  def expectations_invoked_in_order?; end
+  def expected_invocations; end
+  def handle_order_constraint(expectation); end
+  def initialize; end
+  def invoked(message); end
+  def invoked_expectations; end
+  def ready_for?(expectation); end
+  def register(expectation); end
+  def remaining_expectations; end
+  def verify_invocation_order(expectation); end
+end
+class RSpec::Mocks::MockExpectationError < Exception
+end
+class RSpec::Mocks::ExpiredTestDoubleError < RSpec::Mocks::MockExpectationError
+end
+class RSpec::Mocks::OutsideOfExampleError < StandardError
+end
+class RSpec::Mocks::MockExpectationAlreadyInvokedError < Exception
+end
+class RSpec::Mocks::CannotSupportArgMutationsError < StandardError
+end
+class RSpec::Mocks::UnsupportedMatcherError < StandardError
+end
+class RSpec::Mocks::NegationUnsupportedError < StandardError
+end
+class RSpec::Mocks::VerifyingDoubleNotDefinedError < StandardError
+end
+class RSpec::Mocks::ErrorGenerator
+  def __raise(message, backtrace_line = nil, source_id = nil); end
+  def arg_list(args); end
+  def count_message(count, expectation_count_type = nil); end
+  def default_error_message(expectation, expected_args, actual_args); end
+  def describe_expectation(verb, message, expected_received_count, _actual_received_count, args); end
+  def diff_message(expected_args, actual_args); end
+  def differ; end
+  def error_message(expectation, args_for_multiple_calls); end
+  def expectation_on_nil_message(method_name); end
+  def expected_part_of_expectation_error(expected_received_count, expectation_count_type, argument_list_matcher); end
+  def format_args(args); end
+  def format_received_args(args_for_multiple_calls); end
+  def group_count(index, args); end
+  def grouped_args(args); end
+  def initialize(target = nil); end
+  def intro(unwrapped = nil); end
+  def list_of_exactly_one_string?(args); end
+  def method_call_args_description(args, generic_prefix = nil, matcher_prefix = nil); end
+  def notify(*args); end
+  def opts; end
+  def opts=(arg0); end
+  def prepend_to_backtrace(exception, line); end
+  def raise_already_invoked_error(message, calling_customization); end
+  def raise_cant_constrain_count_for_negated_have_received_error(count_constraint); end
+  def raise_double_negation_error(wrapped_expression); end
+  def raise_expectation_error(message, expected_received_count, argument_list_matcher, actual_received_count, expectation_count_type, args, backtrace_line = nil, source_id = nil); end
+  def raise_expectation_on_mocked_method(method); end
+  def raise_expectation_on_nil_error(method_name); end
+  def raise_expectation_on_unstubbed_method(method); end
+  def raise_expired_test_double_error; end
+  def raise_have_received_disallowed(type, reason); end
+  def raise_invalid_arguments_error(verifier); end
+  def raise_method_not_stubbed_error(method_name); end
+  def raise_missing_block_error(args_to_yield); end
+  def raise_missing_default_stub_error(expectation, args_for_multiple_calls); end
+  def raise_non_public_error(method_name, visibility); end
+  def raise_only_valid_on_a_partial_double(method); end
+  def raise_out_of_order_error(message); end
+  def raise_similar_message_args_error(expectation, args_for_multiple_calls, backtrace_line = nil); end
+  def raise_unexpected_message_args_error(expectation, args_for_multiple_calls, source_id = nil); end
+  def raise_unexpected_message_error(message, args); end
+  def raise_unimplemented_error(doubled_module, method_name, object); end
+  def raise_verifying_double_not_defined_error(ref); end
+  def raise_wrong_arity_error(args_to_yield, signature); end
+  def received_part_of_expectation_error(actual_received_count, args); end
+  def times(count); end
+  def unexpected_arguments_message(expected_args_string, actual_args_string); end
+  def unpack_string_args(formatted_expected_args, actual_args); end
+end
+class RSpec::Mocks::RootSpace
+  def any_instance_proxy_for(*_args); end
+  def any_instance_recorder_for(*_args); end
+  def any_instance_recorders_from_ancestry_of(_object); end
+  def new_scope; end
+  def proxy_for(*_args); end
+  def raise_lifecycle_message; end
+  def register_constant_mutator(_mutator); end
+  def registered?(_object); end
+  def reset_all; end
+  def superclass_proxy_for(*_args); end
+  def verify_all; end
+end
+class RSpec::Mocks::Space
+  def any_instance_mutex; end
+  def any_instance_proxy_for(klass); end
+  def any_instance_recorder_for(klass, only_return_existing = nil); end
+  def any_instance_recorder_not_found_for(id, klass); end
+  def any_instance_recorders; end
+  def any_instance_recorders_from_ancestry_of(object); end
+  def class_proxy_with_callback_verification_strategy(object, strategy); end
+  def constant_mutator_for(name); end
+  def ensure_registered(object); end
+  def id_for(object); end
+  def initialize; end
+  def new_mutex; end
+  def new_scope; end
+  def proxies; end
+  def proxies_of(klass); end
+  def proxy_for(object); end
+  def proxy_mutex; end
+  def proxy_not_found_for(id, object); end
+  def register_constant_mutator(mutator); end
+  def registered?(object); end
+  def reset_all; end
+  def superclass_proxy_for(klass); end
+  def superclass_proxy_not_found_for(id, object); end
+  def verify_all; end
+end
+class RSpec::Mocks::NestedSpace < RSpec::Mocks::Space
+  def any_instance_recorder_not_found_for(id, klass); end
+  def constant_mutator_for(name); end
+  def initialize(parent); end
+  def proxies_of(klass); end
+  def proxy_not_found_for(id, object); end
+  def registered?(object); end
+end
+class RSpec::Mocks::Constant
+  def hidden=(arg0); end
+  def hidden?; end
+  def initialize(name); end
+  def inspect; end
+  def mutated?; end
+  def name; end
+  def original_value; end
+  def original_value=(arg0); end
+  def previously_defined=(arg0); end
+  def previously_defined?; end
+  def self.original(name); end
+  def self.unmutated(name); end
+  def stubbed=(arg0); end
+  def stubbed?; end
+  def to_s; end
+  def valid_name=(arg0); end
+  def valid_name?; end
+  extend RSpec::Support::RecursiveConstMethods
+end
+class RSpec::Mocks::ConstantMutator
+  def self.hide(constant_name); end
+  def self.mutate(mutator); end
+  def self.raise_on_invalid_const; end
+  def self.stub(constant_name, value, options = nil); end
+  extend RSpec::Support::RecursiveConstMethods
+end
+class RSpec::Mocks::ConstantMutator::BaseMutator
+  def full_constant_name; end
+  def idempotently_reset; end
+  def initialize(full_constant_name, mutated_value, transfer_nested_constants); end
+  def original_value; end
+  def to_constant; end
+  include RSpec::Support::RecursiveConstMethods
+end
+class RSpec::Mocks::ConstantMutator::ConstantHider < RSpec::Mocks::ConstantMutator::BaseMutator
+  def mutate; end
+  def reset; end
+  def to_constant; end
+end
+class RSpec::Mocks::ConstantMutator::DefinedConstantReplacer < RSpec::Mocks::ConstantMutator::BaseMutator
+  def initialize(*args); end
+  def mutate; end
+  def reset; end
+  def should_transfer_nested_constants?; end
+  def to_constant; end
+  def transfer_nested_constants; end
+  def verify_constants_to_transfer!; end
+end
+class RSpec::Mocks::ConstantMutator::UndefinedConstantSetter < RSpec::Mocks::ConstantMutator::BaseMutator
+  def mutate; end
+  def name_for(parent, name); end
+  def reset; end
+  def to_constant; end
+end
+module RSpec::Mocks::TargetDelegationClassMethods
+  def delegate_not_to(matcher_method, options = nil); end
+  def delegate_to(matcher_method); end
+  def disallow_negation(method_name); end
+end
+module RSpec::Mocks::TargetDelegationInstanceMethods
+  def define_matcher(matcher, name, &block); end
+  def matcher_allowed?(matcher); end
+  def raise_negation_unsupported(method_name, matcher); end
+  def raise_unsupported_matcher(method_name, matcher); end
+  def target; end
+end
+class RSpec::Mocks::TargetBase
+  def initialize(target); end
+  extend RSpec::Mocks::TargetDelegationClassMethods
+  include RSpec::Mocks::TargetDelegationInstanceMethods
+end
+module RSpec::Mocks::ExpectationTargetMethods
+  def expression; end
+  def not_to(matcher, &block); end
+  def to(matcher, &block); end
+  def to_not(matcher, &block); end
+  extend RSpec::Mocks::TargetDelegationClassMethods
+  include RSpec::Mocks::TargetDelegationInstanceMethods
+end
+class RSpec::Mocks::ExpectationTarget < RSpec::Mocks::TargetBase
+  include RSpec::Mocks::ExpectationTargetMethods
+end
+class RSpec::Mocks::AllowanceTarget < RSpec::Mocks::TargetBase
+  def expression; end
+  def not_to(matcher, *_args); end
+  def to(matcher, &block); end
+  def to_not(matcher, *_args); end
+end
+class RSpec::Mocks::AnyInstanceAllowanceTarget < RSpec::Mocks::TargetBase
+  def expression; end
+  def not_to(matcher, *_args); end
+  def to(matcher, &block); end
+  def to_not(matcher, *_args); end
+end
+class RSpec::Mocks::AnyInstanceExpectationTarget < RSpec::Mocks::TargetBase
+  def expression; end
+  def not_to(matcher, &block); end
+  def to(matcher, &block); end
+  def to_not(matcher, &block); end
+end
+module RSpec::Mocks::Syntax
+  def self.default_should_syntax_host; end
+  def self.disable_expect(syntax_host = nil); end
+  def self.disable_should(syntax_host = nil); end
+  def self.enable_expect(syntax_host = nil); end
+  def self.enable_should(syntax_host = nil); end
+  def self.expect_enabled?(syntax_host = nil); end
+  def self.should_enabled?(syntax_host = nil); end
+  def self.warn_about_should!; end
+  def self.warn_unless_should_configured(method_name, replacement = nil); end
+end
+class BasicObject
+end
+class Class < Module
+end
+class RSpec::Mocks::Configuration
+  def add_stub_and_should_receive_to(*modules); end
+  def allow_message_expectations_on_nil; end
+  def allow_message_expectations_on_nil=(arg0); end
+  def before_verifying_doubles(&block); end
+  def color?; end
+  def initialize; end
+  def patch_marshal_to_support_partial_doubles=(val); end
+  def reset_syntaxes_to_default; end
+  def syntax; end
+  def syntax=(*values); end
+  def temporarily_suppress_partial_double_verification; end
+  def temporarily_suppress_partial_double_verification=(arg0); end
+  def transfer_nested_constants=(arg0); end
+  def transfer_nested_constants?; end
+  def verify_doubled_constant_names=(arg0); end
+  def verify_doubled_constant_names?; end
+  def verify_partial_doubles=(val); end
+  def verify_partial_doubles?; end
+  def verifying_double_callbacks; end
+  def when_declaring_verifying_double(&block); end
+  def yield_receiver_to_any_instance_implementation_blocks=(arg0); end
+  def yield_receiver_to_any_instance_implementation_blocks?; end
+end
+class RSpec::Mocks::VerifyingMessageExpectation < RSpec::Mocks::MessageExpectation
+  def initialize(*args); end
+  def method_reference; end
+  def method_reference=(arg0); end
+  def validate_expected_arguments!; end
+  def with(*args, &block); end
+end
+class RSpec::Mocks::MethodReference
+  def defined?; end
+  def implemented?; end
+  def initialize(object_reference, method_name); end
+  def original_method; end
+  def self.for(object_reference, method_name); end
+  def self.instance_method_visibility_for(klass, method_name); end
+  def self.method_defined_at_any_visibility?(klass, method_name); end
+  def self.method_visibility_for(object, method_name); end
+  def unimplemented?; end
+  def visibility; end
+  def with_signature; end
+end
+class RSpec::Mocks::InstanceMethodReference < RSpec::Mocks::MethodReference
+  def find_method(mod); end
+  def method_defined?(mod); end
+  def method_implemented?(mod); end
+  def visibility_from(mod); end
+end
+class RSpec::Mocks::ObjectMethodReference < RSpec::Mocks::MethodReference
+  def find_method(object); end
+  def method_defined?(object); end
+  def method_implemented?(object); end
+  def self.for(object_reference, method_name); end
+  def visibility_from(object); end
+end
+class RSpec::Mocks::ClassNewMethodReference < RSpec::Mocks::ObjectMethodReference
+  def self.applies_to?(method_name); end
+  def with_signature; end
+end
+class RSpec::Mocks::CallbackInvocationStrategy
+  def call(doubled_module); end
+end
+class RSpec::Mocks::NoCallbackInvocationStrategy
+  def call(_doubled_module); end
+end
+module RSpec::Mocks::VerifyingProxyMethods
+  def add_message_expectation(method_name, opts = nil, &block); end
+  def add_simple_stub(method_name, *args); end
+  def add_stub(method_name, opts = nil, &implementation); end
+  def ensure_implemented(method_name); end
+  def ensure_publicly_implemented(method_name, _object); end
+end
+class RSpec::Mocks::VerifyingProxy < RSpec::Mocks::TestDoubleProxy
+  def initialize(object, order_group, doubled_module, method_reference_class); end
+  def method_reference; end
+  def validate_arguments!(method_name, args); end
+  def visibility_for(method_name); end
+  include RSpec::Mocks::VerifyingProxyMethods
+end
+class RSpec::Mocks::VerifyingPartialDoubleProxy < RSpec::Mocks::PartialDoubleProxy
+  def ensure_implemented(_method_name); end
+  def initialize(object, expectation_ordering, optional_callback_invocation_strategy = nil); end
+  def method_reference; end
+  include RSpec::Mocks::VerifyingProxyMethods
+end
+class RSpec::Mocks::VerifyingPartialClassDoubleProxy < RSpec::Mocks::VerifyingPartialDoubleProxy
+  include RSpec::Mocks::PartialClassDoubleProxyMethods
+end
+class RSpec::Mocks::VerifyingMethodDouble < RSpec::Mocks::MethodDouble
+  def add_expectation(*args, &block); end
+  def add_stub(*args, &block); end
+  def initialize(object, method_name, proxy, method_reference); end
+  def message_expectation_class; end
+  def proxy_method_invoked(obj, *args, &block); end
+  def validate_arguments!(actual_args); end
+end
+class RSpec::Mocks::VerifyingExistingMethodDouble < RSpec::Mocks::VerifyingMethodDouble
+  def initialize(object, method_name, proxy); end
+  def self.for(object, method_name, proxy); end
+  def unimplemented?; end
+  def with_signature; end
+end
+class RSpec::Mocks::VerifyingExistingClassNewMethodDouble < RSpec::Mocks::VerifyingExistingMethodDouble
+  def with_signature; end
+end
+module RSpec::Mocks::VerifyingDouble
+  def __send__(name, *args, &block); end
+  def initialize(doubled_module, *args); end
+  def method_missing(message, *args, &block); end
+  def respond_to?(message, include_private = nil); end
+  def send(name, *args, &block); end
+end
+module RSpec::Mocks::VerifyingDouble::SilentIO
+  def self.method_missing(*arg0); end
+  def self.respond_to?(*arg0); end
+end
+class RSpec::Mocks::InstanceVerifyingDouble
+  def __build_mock_proxy(order_group); end
+  include RSpec::Mocks::TestDouble
+  include RSpec::Mocks::VerifyingDouble
+end
+module RSpec::Mocks::ObjectVerifyingDoubleMethods
+  def __build_mock_proxy(order_group); end
+  def as_stubbed_const(options = nil); end
+  include RSpec::Mocks::TestDouble
+  include RSpec::Mocks::VerifyingDouble
+end
+class RSpec::Mocks::ObjectVerifyingDouble
+  include RSpec::Mocks::ObjectVerifyingDoubleMethods
+end
+class RSpec::Mocks::ClassVerifyingDouble < Module
+  include RSpec::Mocks::ObjectVerifyingDoubleMethods
+end
+module RSpec::Mocks::Version
+end
+module RSpec::Support
+  def self.require_rspec_mocks(f); end
+end
+module RSpec::Mocks::Matchers
+end
+module RSpec::Mocks::Matchers::Matcher
+end
+module RSpec::Mocks::AnyInstance
+  def self.error_generator; end
+end
+class RSpec::Mocks::AnyInstance::Chain
+  def constrained_to_any_of?(*constraints); end
+  def expectation_fulfilled!; end
+  def initialize(recorder, *args, &block); end
+  def last_message; end
+  def matches_args?(*args); end
+  def messages; end
+  def negated?; end
+  def never; end
+  def playback!(instance); end
+  def record(rspec_method_name, *args, &block); end
+  def with(*args, &block); end
+  include RSpec::Mocks::AnyInstance::Chain::Customizations
+end
+module RSpec::Mocks::AnyInstance::Chain::Customizations
+  def and_call_original(*args, &block); end
+  def and_raise(*args, &block); end
+  def and_return(*args, &block); end
+  def and_throw(*args, &block); end
+  def and_wrap_original(*args, &block); end
+  def and_yield(*args, &block); end
+  def at_least(*args, &block); end
+  def at_most(*args, &block); end
+  def exactly(*args, &block); end
+  def never(*args, &block); end
+  def once(*args, &block); end
+  def self.record(method_name); end
+  def thrice(*args, &block); end
+  def time(*args, &block); end
+  def times(*args, &block); end
+  def twice(*args, &block); end
+  def with(*args, &block); end
+end
+class RSpec::Mocks::AnyInstance::ErrorGenerator < RSpec::Mocks::ErrorGenerator
+  def raise_does_not_implement_error(klass, method_name); end
+  def raise_message_already_received_by_other_instance_error(method_name, object_inspect, invoked_instance); end
+  def raise_not_supported_with_prepend_error(method_name, problem_mod); end
+  def raise_second_instance_received_message_error(unfulfilled_expectations); end
+end
+class RSpec::Mocks::AnyInstance::StubChain < RSpec::Mocks::AnyInstance::Chain
+  def create_message_expectation_on(instance); end
+  def expectation_fulfilled?; end
+  def invocation_order; end
+  def verify_invocation_order(rspec_method_name, *_args, &_block); end
+end
+class RSpec::Mocks::AnyInstance::StubChainChain < RSpec::Mocks::AnyInstance::StubChain
+  def create_message_expectation_on(instance); end
+  def initialize(*args); end
+  def invocation_order; end
+end
+class RSpec::Mocks::AnyInstance::ExpectChainChain < RSpec::Mocks::AnyInstance::StubChain
+  def create_message_expectation_on(instance); end
+  def expectation_fulfilled?; end
+  def initialize(*args); end
+  def invocation_order; end
+  def playback!(instance); end
+end
+class RSpec::Mocks::AnyInstance::ExpectationChain < RSpec::Mocks::AnyInstance::Chain
+  def expectation_fulfilled?; end
+  def initialize(*args, &block); end
+  def verify_invocation_order(_rspec_method_name, *_args, &_block); end
+end
+class RSpec::Mocks::AnyInstance::PositiveExpectationChain < RSpec::Mocks::AnyInstance::ExpectationChain
+  def create_message_expectation_on(instance); end
+  def invocation_order; end
+end
+class RSpec::Mocks::AnyInstance::MessageChains
+  def [](method_name); end
+  def add(method_name, chain); end
+  def all_expectations_fulfilled?; end
+  def each_unfulfilled_expectation_matching(method_name, *args); end
+  def has_expectation?(method_name); end
+  def initialize; end
+  def playback!(instance, method_name); end
+  def raise_if_second_instance_to_receive_message(instance); end
+  def received_expected_message!(method_name); end
+  def remove_stub_chains_for!(method_name); end
+  def unfulfilled_expectations; end
+end
+class RSpec::Mocks::AnyInstance::Recorder
+  def allow_no_prepended_module_definition_of(method_name); end
+  def already_observing?(method_name); end
+  def ancestor_is_an_observer?(method_name); end
+  def backup_method!(method_name); end
+  def build_alias_method_name(method_name); end
+  def expect_chain(*method_names_and_optional_return_values, &block); end
+  def initialize(klass); end
+  def instance_that_received(method_name); end
+  def klass; end
+  def mark_invoked!(method_name); end
+  def message_chains; end
+  def normalize_chain(*args); end
+  def notify_received_message(_object, message, args, _blk); end
+  def observe!(method_name); end
+  def playback!(instance, method_name); end
+  def public_protected_or_private_method_defined?(method_name); end
+  def received_expected_message!(method_name); end
+  def remove_dummy_method!(method_name); end
+  def restore_method!(method_name); end
+  def restore_original_method!(method_name); end
+  def should_not_receive(method_name, &block); end
+  def should_receive(method_name, &block); end
+  def stop_all_observation!; end
+  def stop_observing!(method_name); end
+  def stub(method_name, &block); end
+  def stub_chain(*method_names_and_optional_return_values, &block); end
+  def stubs; end
+  def super_class_observers_for(method_name); end
+  def super_class_observing?(method_name); end
+  def unstub(method_name); end
+  def verify; end
+end
+class RSpec::Mocks::AnyInstance::Proxy
+  def expect_chain(*chain, &block); end
+  def initialize(recorder, target_proxies); end
+  def klass; end
+  def perform_proxying(method_name, args, block, &target_proxy_block); end
+  def should_not_receive(method_name, &block); end
+  def should_receive(method_name, &block); end
+  def stub(method_name_or_method_map, &block); end
+  def stub_chain(*chain, &block); end
+  def unstub(method_name); end
+end
+class RSpec::Mocks::AnyInstance::FluentInterfaceProxy
+  def initialize(targets); end
+  def method_missing(*args, &block); end
+  def respond_to_missing?(method_name, include_private = nil); end
+end
+class RSpec::Mocks::MessageChain
+  def block; end
+  def chain; end
+  def chain_on(object, *chain, &block); end
+  def find_matching_expectation; end
+  def find_matching_stub; end
+  def format_chain(*chain, &blk); end
+  def initialize(object, *chain, &blk); end
+  def object; end
+  def setup_chain; end
+end
+class RSpec::Mocks::ExpectChain < RSpec::Mocks::MessageChain
+  def expectation(object, message, &return_block); end
+  def self.expect_chain_on(object, *chain, &blk); end
+end
+class RSpec::Mocks::StubChain < RSpec::Mocks::MessageChain
+  def expectation(object, message, &return_block); end
+  def self.stub_chain_on(object, *chain, &blk); end
+end
+class RSpec::Mocks::MarshalExtension
+  def self.patch!; end
+  def self.unpatch!; end
+end
+class RSpec::Mocks::Matchers::HaveReceived
+  def apply_constraints_to(expectation); end
+  def at_least(*args); end
+  def at_most(*args); end
+  def capture_failure_message; end
+  def count_constraint; end
+  def description; end
+  def disallow(type, reason = nil); end
+  def does_not_match?(subject); end
+  def ensure_count_unconstrained; end
+  def exactly(*args); end
+  def expect; end
+  def expected_messages_received_in_order?; end
+  def failure_message; end
+  def failure_message_when_negated; end
+  def initialize(method_name, &block); end
+  def matches?(subject, &block); end
+  def mock_proxy; end
+  def name; end
+  def notify_failure_message; end
+  def once(*args); end
+  def ordered(*args); end
+  def setup_allowance(_subject, &_block); end
+  def setup_any_instance_allowance(_subject, &_block); end
+  def setup_any_instance_expectation(_subject, &_block); end
+  def setup_any_instance_negative_expectation(_subject, &_block); end
+  def setup_expectation(subject, &block); end
+  def setup_negative_expectation(subject, &block); end
+  def thrice(*args); end
+  def time(*args); end
+  def times(*args); end
+  def twice(*args); end
+  def with(*args); end
+  include RSpec::Mocks::Matchers::Matcher
+end
+class RSpec::Mocks::Matchers::ExpectationCustomization
+  def block; end
+  def block=(arg0); end
+  def initialize(method_name, args, block); end
+  def playback_onto(expectation); end
+end
+class RSpec::Mocks::Matchers::Receive
+  def and_call_original(*args, &block); end
+  def and_raise(*args, &block); end
+  def and_return(*args, &block); end
+  def and_throw(*args, &block); end
+  def and_wrap_original(*args, &block); end
+  def and_yield(*args, &block); end
+  def at_least(*args, &block); end
+  def at_most(*args, &block); end
+  def describable; end
+  def description; end
+  def does_not_match?(subject, &block); end
+  def exactly(*args, &block); end
+  def initialize(message, block); end
+  def matches?(subject, &block); end
+  def move_block_to_last_customization(block); end
+  def name; end
+  def never(*args, &block); end
+  def once(*args, &block); end
+  def ordered(*args, &block); end
+  def setup_allowance(subject, &block); end
+  def setup_any_instance_allowance(subject, &block); end
+  def setup_any_instance_expectation(subject, &block); end
+  def setup_any_instance_method_substitute(subject, method, block); end
+  def setup_any_instance_negative_expectation(subject, &block); end
+  def setup_expectation(subject, &block); end
+  def setup_method_substitute(host, method, block, *args); end
+  def setup_mock_proxy_method_substitute(subject, method, block); end
+  def setup_negative_expectation(subject, &block); end
+  def thrice(*args, &block); end
+  def time(*args, &block); end
+  def times(*args, &block); end
+  def twice(*args, &block); end
+  def warn_if_any_instance(expression, subject); end
+  def with(*args, &block); end
+  include RSpec::Mocks::Matchers::Matcher
+end
+class RSpec::Mocks::Matchers::Receive::DefaultDescribable
+  def description_for(verb); end
+  def initialize(message); end
+end
+class RSpec::Mocks::Matchers::ReceiveMessageChain
+  def and_call_original(*args, &block); end
+  def and_raise(*args, &block); end
+  def and_return(*args, &block); end
+  def and_throw(*args, &block); end
+  def and_yield(*args, &block); end
+  def description; end
+  def does_not_match?(*_args); end
+  def formatted_chain; end
+  def initialize(chain, &block); end
+  def matches?(subject, &block); end
+  def name; end
+  def replay_customizations(chain); end
+  def setup_allowance(subject, &block); end
+  def setup_any_instance_allowance(subject, &block); end
+  def setup_any_instance_expectation(subject, &block); end
+  def setup_expectation(subject, &block); end
+  def setup_negative_expectation(*_args); end
+  def with(*args, &block); end
+  include RSpec::Mocks::Matchers::Matcher
+end
+class RSpec::Mocks::Matchers::ReceiveMessages
+  def any_instance_of(subject); end
+  def description; end
+  def does_not_match?(_subject); end
+  def each_message_on(host); end
+  def initialize(message_return_value_hash); end
+  def matches?(subject); end
+  def name; end
+  def proxy_on(subject); end
+  def setup_allowance(subject); end
+  def setup_any_instance_allowance(subject); end
+  def setup_any_instance_expectation(subject); end
+  def setup_expectation(subject); end
+  def setup_negative_expectation(_subject); end
+  def warn_about_block; end
+  include RSpec::Mocks::Matchers::Matcher
+end
diff --git a/sorbet/rbi/gems/rspec-support.rbi b/sorbet/rbi/gems/rspec-support.rbi
new file mode 100644
index 0000000..5661344
--- /dev/null
+++ b/sorbet/rbi/gems/rspec-support.rbi
@@ -0,0 +1,280 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rspec-support/all/rspec-support.rbi
+#
+# rspec-support-3.10.2
+
+module RSpec
+  extend RSpec::Support::Warnings
+end
+module RSpec::Support
+  def self.class_of(object); end
+  def self.define_optimized_require_for_rspec(lib, &require_relative); end
+  def self.deregister_matcher_definition(&block); end
+  def self.failure_notifier; end
+  def self.failure_notifier=(callable); end
+  def self.is_a_matcher?(object); end
+  def self.matcher_definitions; end
+  def self.method_handle_for(object, method_name); end
+  def self.notify_failure(failure, options = nil); end
+  def self.register_matcher_definition(&block); end
+  def self.require_rspec_support(f); end
+  def self.rspec_description_for_object(object); end
+  def self.thread_local_data; end
+  def self.warning_notifier; end
+  def self.warning_notifier=(arg0); end
+  def self.with_failure_notifier(callable); end
+end
+module RSpec::Support::Version
+end
+class RSpec::Support::ComparableVersion
+  def <=>(other); end
+  def initialize(string); end
+  def segments; end
+  def string; end
+  include Comparable
+end
+module RSpec::Support::OS
+  def self.windows?; end
+  def self.windows_file_path?; end
+  def windows?; end
+  def windows_file_path?; end
+end
+module RSpec::Support::Ruby
+  def jruby?; end
+  def jruby_9000?; end
+  def jruby_version; end
+  def mri?; end
+  def non_mri?; end
+  def rbx?; end
+  def self.jruby?; end
+  def self.jruby_9000?; end
+  def self.jruby_version; end
+  def self.mri?; end
+  def self.non_mri?; end
+  def self.rbx?; end
+  def self.truffleruby?; end
+  def truffleruby?; end
+end
+module RSpec::Support::RubyFeatures
+  def caller_locations_supported?; end
+  def fork_supported?; end
+  def kw_args_supported?; end
+  def module_prepends_supported?; end
+  def module_refinement_supported?; end
+  def optional_and_splat_args_supported?; end
+  def required_kw_args_supported?; end
+  def ripper_supported?; end
+  def self.caller_locations_supported?; end
+  def self.fork_supported?; end
+  def self.kw_args_supported?; end
+  def self.module_prepends_supported?; end
+  def self.module_refinement_supported?; end
+  def self.optional_and_splat_args_supported?; end
+  def self.required_kw_args_supported?; end
+  def self.ripper_supported?; end
+  def self.supports_exception_cause?; end
+  def self.supports_rebinding_module_methods?; end
+  def self.supports_taint?; end
+  def supports_exception_cause?; end
+  def supports_rebinding_module_methods?; end
+  def supports_taint?; end
+end
+module RSpec::Support::AllExceptionsExceptOnesWeMustNotRescue
+  def self.===(exception); end
+end
+class RSpec::CallerFilter
+  def self.first_non_rspec_line(skip_frames = nil, increment = nil); end
+end
+module RSpec::Support::Warnings
+  def deprecate(deprecated, options = nil); end
+  def warn_deprecation(message, options = nil); end
+  def warn_with(message, options = nil); end
+  def warning(text, options = nil); end
+end
+class RSpec::Support::EncodedString
+  def <<(string); end
+  def ==(*args, &block); end
+  def detect_source_encoding(string); end
+  def empty?(*args, &block); end
+  def encoding(*args, &block); end
+  def eql?(*args, &block); end
+  def initialize(string, encoding = nil); end
+  def lines(*args, &block); end
+  def matching_encoding(string); end
+  def remove_invalid_bytes(string); end
+  def self.pick_encoding(source_a, source_b); end
+  def source_encoding; end
+  def split(regex_or_string); end
+  def to_s; end
+  def to_str; end
+end
+class RSpec::Support::ReentrantMutex
+  def enter; end
+  def exit; end
+  def initialize; end
+  def synchronize; end
+end
+class RSpec::Support::Mutex < Thread::Mutex
+  def self.new; end
+end
+class RSpec::Support::DirectoryMaker
+  def self.directory_exists?(dirname); end
+  def self.generate_path(stack, part); end
+  def self.generate_stack(path); end
+  def self.mkdir_p(path); end
+end
+class RSpec::Support::MethodSignature
+  def arbitrary_kw_args?; end
+  def classify_arity(arity = nil); end
+  def classify_parameters; end
+  def could_contain_kw_args?(args); end
+  def description; end
+  def has_kw_args_in?(args); end
+  def initialize(method); end
+  def invalid_kw_args_from(given_kw_args); end
+  def max_non_kw_args; end
+  def min_non_kw_args; end
+  def missing_kw_args_from(given_kw_args); end
+  def non_kw_args_arity_description; end
+  def optional_kw_args; end
+  def required_kw_args; end
+  def unlimited_args?; end
+  def valid_non_kw_args?(positional_arg_count, optional_max_arg_count = nil); end
+end
+class RSpec::Support::MethodSignatureExpectation
+  def empty?; end
+  def expect_arbitrary_keywords; end
+  def expect_arbitrary_keywords=(arg0); end
+  def expect_unlimited_arguments; end
+  def expect_unlimited_arguments=(arg0); end
+  def initialize; end
+  def keywords; end
+  def keywords=(values); end
+  def max_count; end
+  def max_count=(number); end
+  def min_count; end
+  def min_count=(number); end
+end
+class RSpec::Support::BlockSignature < RSpec::Support::MethodSignature
+  def classify_parameters; end
+end
+class RSpec::Support::MethodSignatureVerifier
+  def arbitrary_kw_args?; end
+  def error_message; end
+  def initialize(signature, args = nil); end
+  def invalid_kw_args; end
+  def kw_args; end
+  def max_non_kw_args; end
+  def min_non_kw_args; end
+  def missing_kw_args; end
+  def non_kw_args; end
+  def split_args(*args); end
+  def unlimited_args?; end
+  def valid?; end
+  def valid_non_kw_args?; end
+  def with_expectation(expectation); end
+end
+class RSpec::Support::LooseSignatureVerifier < RSpec::Support::MethodSignatureVerifier
+  def split_args(*args); end
+end
+class RSpec::Support::LooseSignatureVerifier::SignatureWithKeywordArgumentsMatcher
+  def has_kw_args_in?(args); end
+  def initialize(signature); end
+  def invalid_kw_args_from(_kw_args); end
+  def missing_kw_args_from(_kw_args); end
+  def non_kw_args_arity_description; end
+  def valid_non_kw_args?(*args); end
+end
+module RSpec::Support::WithKeywordsWhenNeeded
+  def class_exec(klass, *args, &block); end
+  def self.class_exec(klass, *args, &block); end
+end
+module RSpec::Support::RecursiveConstMethods
+  def const_defined_on?(mod, const_name); end
+  def constants_defined_on(mod); end
+  def get_const_defined_on(mod, const_name); end
+  def normalize_const_name(const_name); end
+  def recursive_const_defined?(const_name); end
+  def recursive_const_get(const_name); end
+end
+class RSpec::Support::ObjectFormatter
+  def format(object); end
+  def initialize(max_formatted_output_length = nil); end
+  def max_formatted_output_length; end
+  def max_formatted_output_length=(arg0); end
+  def prepare_array(array); end
+  def prepare_element(element); end
+  def prepare_for_inspection(object); end
+  def prepare_hash(input_hash); end
+  def recursive_structure?(object); end
+  def self.default_instance; end
+  def self.format(object); end
+  def self.prepare_for_inspection(object); end
+  def sort_hash_keys(input_hash); end
+  def truncate_string(str, start_index, end_index); end
+  def with_entering_structure(structure); end
+end
+class RSpec::Support::ObjectFormatter::InspectableItem < Struct
+  def inspect; end
+  def pretty_print(pp); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def text; end
+  def text=(_); end
+end
+class RSpec::Support::ObjectFormatter::BaseInspector < Struct
+  def formatter; end
+  def formatter=(_); end
+  def inspect; end
+  def object; end
+  def object=(_); end
+  def pretty_print(pp); end
+  def self.[](*arg0); end
+  def self.can_inspect?(_object); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Support::ObjectFormatter::TimeInspector < RSpec::Support::ObjectFormatter::BaseInspector
+  def inspect; end
+  def self.can_inspect?(object); end
+end
+class RSpec::Support::ObjectFormatter::DateTimeInspector < RSpec::Support::ObjectFormatter::BaseInspector
+  def inspect; end
+  def self.can_inspect?(object); end
+end
+class RSpec::Support::ObjectFormatter::BigDecimalInspector < RSpec::Support::ObjectFormatter::BaseInspector
+  def inspect; end
+  def self.can_inspect?(object); end
+end
+class RSpec::Support::ObjectFormatter::DescribableMatcherInspector < RSpec::Support::ObjectFormatter::BaseInspector
+  def inspect; end
+  def self.can_inspect?(object); end
+end
+class RSpec::Support::ObjectFormatter::UninspectableObjectInspector < RSpec::Support::ObjectFormatter::BaseInspector
+  def inspect; end
+  def klass; end
+  def native_object_id; end
+  def self.can_inspect?(object); end
+end
+class RSpec::Support::ObjectFormatter::DelegatorInspector < RSpec::Support::ObjectFormatter::BaseInspector
+  def inspect; end
+  def self.can_inspect?(object); end
+end
+class RSpec::Support::ObjectFormatter::InspectableObjectInspector < RSpec::Support::ObjectFormatter::BaseInspector
+  def inspect; end
+  def self.can_inspect?(object); end
+end
+module RSpec::Support::FuzzyMatcher
+  def self.arrays_match?(expected_list, actual_list); end
+  def self.hashes_match?(expected_hash, actual_hash); end
+  def self.values_match?(expected, actual); end
+end
diff --git a/sorbet/rbi/gems/rspec.rbi b/sorbet/rbi/gems/rspec.rbi
new file mode 100644
index 0000000..5e521c5
--- /dev/null
+++ b/sorbet/rbi/gems/rspec.rbi
@@ -0,0 +1,15 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/rspec/all/rspec.rbi
+#
+# rspec-3.10.0
+
+module RSpec
+end
+module RSpec::Version
+end
diff --git a/sorbet/rbi/gems/ruby-rc4.rbi b/sorbet/rbi/gems/ruby-rc4.rbi
new file mode 100644
index 0000000..56b016c
--- /dev/null
+++ b/sorbet/rbi/gems/ruby-rc4.rbi
@@ -0,0 +1,19 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: strict
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/ruby-rc4/all/ruby-rc4.rbi
+#
+# ruby-rc4-0.1.5
+
+class RC4
+  def decrypt(text); end
+  def encrypt!(text); end
+  def encrypt(text); end
+  def initialize(str); end
+  def process(text); end
+  def round; end
+end
diff --git a/sorbet/rbi/gems/ttfunk.rbi b/sorbet/rbi/gems/ttfunk.rbi
new file mode 100644
index 0000000..a9c2b5a
--- /dev/null
+++ b/sorbet/rbi/gems/ttfunk.rbi
@@ -0,0 +1,617 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi gems
+
+# typed: true
+#
+# If you would like to make changes to this file, great! Please create the gem's shim here:
+#
+#   https://github.com/sorbet/sorbet-typed/new/master?filename=lib/ttfunk/all/ttfunk.rbi
+#
+# ttfunk-1.7.0
+
+module TTFunk
+end
+class TTFunk::Aggregate
+  def coerce(other); end
+end
+class TTFunk::Directory
+  def initialize(io, offset = nil); end
+  def scaler_type; end
+  def tables; end
+end
+class TTFunk::ResourceFile
+  def [](type, index = nil); end
+  def initialize(io); end
+  def map; end
+  def parse_from(offset); end
+  def resources_for(type); end
+  def self.open(path); end
+end
+class TTFunk::Collection
+  def [](index); end
+  def count; end
+  def each; end
+  def initialize(io); end
+  def self.open(path); end
+  include Enumerable
+end
+class TTFunk::TTFEncoder
+  def align(data, width); end
+  def checksum(data); end
+  def cmap_table; end
+  def cvt_table; end
+  def dsig_table; end
+  def encode; end
+  def fpgm_table; end
+  def gasp_table; end
+  def glyf_table; end
+  def glyphs; end
+  def head_table; end
+  def hhea_table; end
+  def hmtx_table; end
+  def initialize(original, subset, options = nil); end
+  def kern_table; end
+  def loca_table; end
+  def maxp_table; end
+  def name_table; end
+  def new_to_old_glyph; end
+  def old_to_new_glyph; end
+  def optimal_table_order; end
+  def options; end
+  def original; end
+  def os2_table; end
+  def post_table; end
+  def prep_table; end
+  def raw(data); end
+  def subset; end
+  def tables; end
+  def vorg_table; end
+end
+class TTFunk::UnresolvedPlaceholderError < StandardError
+end
+class TTFunk::DuplicatePlaceholderError < StandardError
+end
+class TTFunk::EncodedString
+  def <<(obj); end
+  def add_placeholder(new_placeholder, pos = nil); end
+  def align!(width = nil); end
+  def bytes; end
+  def initialize; end
+  def io; end
+  def length; end
+  def placeholders; end
+  def resolve_placeholder(name, value); end
+  def string; end
+  def unresolved_string; end
+end
+class TTFunk::Placeholder
+  def initialize(name, length: nil); end
+  def length; end
+  def name; end
+  def position; end
+  def position=(arg0); end
+end
+class TTFunk::OTFEncoder < TTFunk::TTFEncoder
+  def base_table; end
+  def cff_table; end
+  def collect_glyphs(glyph_ids); end
+  def glyf_table; end
+  def loca_table; end
+  def optimal_table_order; end
+  def tables; end
+  def vorg_table; end
+end
+class TTFunk::SciForm
+  def ==(other); end
+  def eql?(arg0); end
+  def exponent; end
+  def initialize(significand, exponent = nil); end
+  def significand; end
+  def to_f; end
+end
+class TTFunk::BitField
+  def dup; end
+  def initialize(value = nil); end
+  def off(pos); end
+  def off?(pos); end
+  def on(pos); end
+  def on?(pos); end
+  def value; end
+end
+module TTFunk::BinUtils
+  def rangify(values); end
+  def slice_int(value, bit_width:, slice_count:); end
+  def stitch_int(arr, bit_width:); end
+  def twos_comp_to_int(num, bit_width:); end
+  extend TTFunk::BinUtils
+end
+module TTFunk::Reader
+  def hexdump(string); end
+  def io; end
+  def parse_from(position); end
+  def read(bytes, format); end
+  def read_signed(count); end
+  def to_signed(number); end
+end
+class TTFunk::SubTable
+  def eot?; end
+  def file; end
+  def initialize(file, offset, length = nil); end
+  def length; end
+  def read(*args); end
+  def table_offset; end
+  include TTFunk::Reader
+end
+class TTFunk::SubTable::EOTError < StandardError
+end
+class TTFunk::Min < TTFunk::Aggregate
+  def <<(new_value); end
+  def initialize(init_value = nil); end
+  def value; end
+  def value_or(default); end
+end
+class TTFunk::Max < TTFunk::Aggregate
+  def <<(new_value); end
+  def initialize(init_value = nil); end
+  def value; end
+  def value_or(default); end
+end
+class TTFunk::Sum < TTFunk::Aggregate
+  def <<(operand); end
+  def initialize(init_value = nil); end
+  def value; end
+  def value_or(_default); end
+end
+class TTFunk::OneBasedArray
+  def [](idx); end
+  def each(&block); end
+  def entries; end
+  def initialize(size = nil); end
+  def size; end
+  def to_ary; end
+  include Enumerable
+end
+class TTFunk::Table
+  def exists?; end
+  def file; end
+  def initialize(file); end
+  def length; end
+  def offset; end
+  def parse!; end
+  def raw; end
+  def tag; end
+  include TTFunk::Reader
+end
+class TTFunk::Table::Cff < TTFunk::Table
+  def encode(new_to_old, old_to_new); end
+  def global_subr_index; end
+  def header; end
+  def name_index; end
+  def parse!; end
+  def string_index; end
+  def tag; end
+  def top_index; end
+end
+class TTFunk::Table::Cmap < TTFunk::Table
+  def parse!; end
+  def self.encode(charmap, encoding); end
+  def tables; end
+  def unicode; end
+  def version; end
+end
+module TTFunk::Table::Cmap::Format00
+  def [](code); end
+  def code_map; end
+  def language; end
+  def parse_cmap!; end
+  def self.encode(charmap); end
+  def supported?; end
+end
+module TTFunk::Table::Cmap::Format04
+  def [](code); end
+  def code_map; end
+  def language; end
+  def parse_cmap!; end
+  def self.encode(charmap); end
+  def supported?; end
+end
+module TTFunk::Table::Cmap::Format06
+  def [](code); end
+  def code_map; end
+  def language; end
+  def parse_cmap!; end
+  def self.encode(charmap); end
+  def supported?; end
+end
+module TTFunk::Table::Cmap::Format10
+  def [](code); end
+  def code_map; end
+  def language; end
+  def parse_cmap!; end
+  def self.encode(charmap); end
+  def supported?; end
+end
+module TTFunk::Table::Cmap::Format12
+  def [](code); end
+  def code_map; end
+  def language; end
+  def parse_cmap!; end
+  def self.encode(charmap); end
+  def supported?; end
+end
+class TTFunk::Table::Cmap::Subtable
+  def [](_code); end
+  def encoding_id; end
+  def format; end
+  def initialize(file, table_start); end
+  def parse_cmap!; end
+  def platform_id; end
+  def self.encode(charmap, encoding); end
+  def supported?; end
+  def unicode?; end
+  include TTFunk::Reader
+end
+class TTFunk::Table::Dsig < TTFunk::Table
+  def flags; end
+  def parse!; end
+  def self.encode(dsig); end
+  def signatures; end
+  def tag; end
+  def version; end
+end
+class TTFunk::Table::Dsig::SignatureRecord
+  def format; end
+  def initialize(format, length, offset, signature); end
+  def length; end
+  def offset; end
+  def signature; end
+end
+class TTFunk::Table::Glyf < TTFunk::Table
+  def for(glyph_id); end
+  def parse!; end
+  def self.encode(glyphs, new_to_old, old_to_new); end
+end
+class TTFunk::Table::Glyf::Compound
+  def compound?; end
+  def glyph_ids; end
+  def id; end
+  def initialize(id, raw); end
+  def number_of_contours; end
+  def raw; end
+  def recode(mapping); end
+  def x_max; end
+  def x_min; end
+  def y_max; end
+  def y_min; end
+  include TTFunk::Reader
+end
+class TTFunk::Table::Glyf::Compound::Component < Struct
+  def arg1; end
+  def arg1=(_); end
+  def arg2; end
+  def arg2=(_); end
+  def flags; end
+  def flags=(_); end
+  def glyph_index; end
+  def glyph_index=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def transform; end
+  def transform=(_); end
+end
+class TTFunk::Table::Glyf::PathBased
+  def compound?; end
+  def horizontal_metrics; end
+  def initialize(path, horizontal_metrics); end
+  def left_side_bearing; end
+  def number_of_contours; end
+  def path; end
+  def right_side_bearing; end
+  def x_max; end
+  def x_min; end
+  def y_max; end
+  def y_min; end
+end
+class TTFunk::Table::Glyf::Simple
+  def compound?; end
+  def end_point_of_last_contour; end
+  def end_points_of_contours; end
+  def id; end
+  def initialize(id, raw); end
+  def instruction_length; end
+  def instructions; end
+  def number_of_contours; end
+  def raw; end
+  def recode(_mapping); end
+  def x_max; end
+  def x_min; end
+  def y_max; end
+  def y_min; end
+end
+class TTFunk::Table::Head < TTFunk::Table
+  def checksum_adjustment; end
+  def created; end
+  def flags; end
+  def font_direction_hint; end
+  def font_revision; end
+  def glyph_data_format; end
+  def index_to_loc_format; end
+  def lowest_rec_ppem; end
+  def mac_style; end
+  def magic_number; end
+  def modified; end
+  def parse!; end
+  def self.encode(head, loca, mapping); end
+  def self.min_max_values_for(head, mapping); end
+  def units_per_em; end
+  def version; end
+  def x_max; end
+  def x_min; end
+  def y_max; end
+  def y_min; end
+end
+class TTFunk::Table::Hhea < TTFunk::Table
+  def advance_width_max; end
+  def ascent; end
+  def caret_offset; end
+  def carot_slope_rise; end
+  def carot_slope_run; end
+  def descent; end
+  def line_gap; end
+  def metric_data_format; end
+  def min_left_side_bearing; end
+  def min_right_side_bearing; end
+  def number_of_metrics; end
+  def parse!; end
+  def self.encode(hhea, hmtx, original, mapping); end
+  def self.min_max_values_for(original, mapping); end
+  def version; end
+  def x_max_extent; end
+end
+class TTFunk::Table::Hmtx < TTFunk::Table
+  def for(glyph_id); end
+  def left_side_bearings; end
+  def metrics; end
+  def metrics_cache; end
+  def parse!; end
+  def self.encode(hmtx, mapping); end
+  def widths; end
+end
+class TTFunk::Table::Hmtx::HorizontalMetric < Struct
+  def advance_width; end
+  def advance_width=(_); end
+  def left_side_bearing; end
+  def left_side_bearing=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class TTFunk::Table::Kern < TTFunk::Table
+  def add_table(format, attributes = nil); end
+  def parse!; end
+  def parse_version_0_tables(_num_tables); end
+  def parse_version_1_tables(num_tables); end
+  def self.encode(kerning, mapping); end
+  def tables; end
+  def version; end
+end
+class TTFunk::Table::Kern::Format0
+  def attributes; end
+  def cross_stream?; end
+  def horizontal?; end
+  def initialize(attributes = nil); end
+  def pairs; end
+  def recode(mapping); end
+  def vertical?; end
+  include TTFunk::Reader
+end
+class TTFunk::Table::Loca < TTFunk::Table
+  def index_of(glyph_id); end
+  def offsets; end
+  def parse!; end
+  def self.encode(offsets); end
+  def size_of(glyph_id); end
+end
+class TTFunk::Table::Maxp < TTFunk::Table
+  def max_component_contours; end
+  def max_component_depth; end
+  def max_component_elements; end
+  def max_component_points; end
+  def max_contours; end
+  def max_function_defs; end
+  def max_instruction_defs; end
+  def max_points; end
+  def max_size_of_instructions; end
+  def max_stack_elements; end
+  def max_storage; end
+  def max_twilight_points; end
+  def max_zones; end
+  def num_glyphs; end
+  def parse!; end
+  def self.encode(maxp, mapping); end
+  def version; end
+end
+class TTFunk::Table::Name < TTFunk::Table
+  def compatible_full; end
+  def copyright; end
+  def description; end
+  def designer; end
+  def designer_url; end
+  def entries; end
+  def font_family; end
+  def font_name; end
+  def font_subfamily; end
+  def license; end
+  def license_url; end
+  def manufacturer; end
+  def parse!; end
+  def postscript_name; end
+  def preferred_family; end
+  def preferred_subfamily; end
+  def sample_text; end
+  def self.encode(names, key = nil); end
+  def strings; end
+  def trademark; end
+  def unique_subfamily; end
+  def vendor_url; end
+  def version; end
+end
+class TTFunk::Table::Name::NameString < String
+  def encoding_id; end
+  def initialize(text, platform_id, encoding_id, language_id); end
+  def language_id; end
+  def platform_id; end
+  def strip_extended; end
+end
+class TTFunk::Table::OS2 < TTFunk::Table
+  def ascent; end
+  def ave_char_width; end
+  def break_char; end
+  def cap_height; end
+  def char_range; end
+  def code_page_range; end
+  def default_char; end
+  def descent; end
+  def family_class; end
+  def first_char_index; end
+  def last_char_index; end
+  def line_gap; end
+  def max_context; end
+  def panose; end
+  def parse!; end
+  def selection; end
+  def self.avg_char_width_for(os2, subset); end
+  def self.avg_ms_symbol_char_width_for(os2, subset); end
+  def self.avg_weighted_char_width_for(os2, subset); end
+  def self.code_pages_for(subset); end
+  def self.encode(os2, subset); end
+  def self.group_original_code_points_by_bit(os2); end
+  def self.unicode_blocks_for(os2, original_field, subset); end
+  def tag; end
+  def type; end
+  def vendor_id; end
+  def version; end
+  def weight_class; end
+  def width_class; end
+  def win_ascent; end
+  def win_descent; end
+  def x_height; end
+  def y_strikeout_position; end
+  def y_strikeout_size; end
+  def y_subscript_x_offset; end
+  def y_subscript_x_size; end
+  def y_subscript_y_offset; end
+  def y_subscript_y_size; end
+  def y_superscript_x_offset; end
+  def y_superscript_x_size; end
+  def y_superscript_y_offset; end
+  def y_superscript_y_size; end
+end
+class TTFunk::Table::Post < TTFunk::Table
+  def fixed_pitch; end
+  def fixed_pitch?; end
+  def format; end
+  def glyph_for(_code); end
+  def italic_angle; end
+  def max_mem_type1; end
+  def max_mem_type42; end
+  def min_mem_type1; end
+  def min_mem_type42; end
+  def parse!; end
+  def parse_format!; end
+  def recode(mapping); end
+  def self.encode(post, mapping); end
+  def subtable; end
+  def underline_position; end
+  def underline_thickness; end
+end
+module TTFunk::Table::Post::Format10
+  def glyph_for(code); end
+  def parse_format!; end
+end
+module TTFunk::Table::Post::Format20
+  def glyph_for(code); end
+  def parse_format!; end
+  include TTFunk::Table::Post::Format10
+end
+module TTFunk::Table::Post::Format30
+  def glyph_for(_code); end
+  def parse_format!; end
+end
+module TTFunk::Table::Post::Format40
+  def glyph_for(code); end
+  def parse_format!; end
+end
+class TTFunk::Table::Sbix < TTFunk::Table
+  def all_bitmap_data_for(glyph_id); end
+  def bitmap_data_for(glyph_id, strike_index); end
+  def flags; end
+  def num_strikes; end
+  def parse!; end
+  def strikes; end
+  def version; end
+end
+class TTFunk::Table::Sbix::BitmapData < Struct
+  def data; end
+  def data=(_); end
+  def ppem; end
+  def ppem=(_); end
+  def resolution; end
+  def resolution=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def type; end
+  def type=(_); end
+  def x; end
+  def x=(_); end
+  def y; end
+  def y=(_); end
+end
+class TTFunk::Table::Vorg < TTFunk::Table
+  def count; end
+  def default_vert_origin_y; end
+  def for(glyph_id); end
+  def major_version; end
+  def minor_version; end
+  def origins; end
+  def parse!; end
+  def self.encode(vorg); end
+  def tag; end
+end
+class TTFunk::Error < StandardError
+end
+class TTFunk::File
+  def ascent; end
+  def bbox; end
+  def cff; end
+  def cmap; end
+  def contents; end
+  def descent; end
+  def digital_signature; end
+  def directory; end
+  def directory_info(tag); end
+  def find_glyph(glyph_id); end
+  def glyph_locations; end
+  def glyph_outlines; end
+  def header; end
+  def horizontal_header; end
+  def horizontal_metrics; end
+  def initialize(contents, offset = nil); end
+  def kerning; end
+  def line_gap; end
+  def maximum_profile; end
+  def name; end
+  def os2; end
+  def postscript; end
+  def sbix; end
+  def self.from_dfont(file, which = nil); end
+  def self.from_ttc(file, which = nil); end
+  def self.open(io_or_path); end
+  def self.verify_and_open(io_or_path); end
+  def vertical_origins; end
+end
diff --git a/sorbet/rbi/hidden-definitions/errors.txt b/sorbet/rbi/hidden-definitions/errors.txt
new file mode 100644
index 0000000..d44e131
--- /dev/null
+++ b/sorbet/rbi/hidden-definitions/errors.txt
@@ -0,0 +1,4605 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi hidden-definitions
+
+# typed: autogenerated
+
+# wrong constant name <DeclBuilderForProcs>
+# wrong constant name <DeclBuilderForProcs>
+# wrong constant name <Class:<DeclBuilderForProcs>>
+# wrong constant name <Magic>
+# wrong constant name <Magic>
+# wrong constant name <Class:<Magic>>
+# wrong constant name <PackageRegistry>
+# wrong constant name <PackageRegistry>
+# wrong constant name <PackageTests>
+# wrong constant name <PackageTests>
+# wrong constant name <RESERVED_0>
+# wrong constant name <RESERVED_10>
+# wrong constant name <RESERVED_11>
+# wrong constant name <RESERVED_1>
+# wrong constant name <RESERVED_2>
+# wrong constant name <RESERVED_3>
+# wrong constant name <RESERVED_4>
+# wrong constant name <RESERVED_5>
+# wrong constant name <RESERVED_6>
+# wrong constant name <RESERVED_7>
+# wrong constant name <RESERVED_8>
+# wrong constant name <RESERVED_9>
+# wrong constant name <TypeAlias>
+# wrong constant name <TypeAlias>
+# wrong constant name <root>
+# wrong constant name <Class:<root>>
+# wrong constant name <todo sym>
+# wrong constant name <todo sym>
+# wrong constant name <top>
+# wrong constant name <top>
+# wrong constant name connect_internal
+# wrong constant name abbrev
+# wrong constant name deconstruct
+# wrong constant name shelljoin
+# wrong constant name to_h
+# wrong constant name try_convert
+# wrong constant name <Class:BasicObject>
+# uninitialized constant BasicSocket::APPEND
+# uninitialized constant BasicSocket::BINARY
+# uninitialized constant BasicSocket::CREAT
+# uninitialized constant BasicSocket::DIRECT
+# uninitialized constant BasicSocket::DSYNC
+# Did you mean?  BasicSocket::RSYNC
+#                BasicSocket::SYNC
+# uninitialized constant BasicSocket::EXCL
+# uninitialized constant BasicSocket::FNM_CASEFOLD
+# uninitialized constant BasicSocket::FNM_DOTMATCH
+# uninitialized constant BasicSocket::FNM_EXTGLOB
+# uninitialized constant BasicSocket::FNM_NOESCAPE
+# uninitialized constant BasicSocket::FNM_PATHNAME
+# uninitialized constant BasicSocket::FNM_SHORTNAME
+# uninitialized constant BasicSocket::FNM_SYSCASE
+# uninitialized constant BasicSocket::LOCK_EX
+# Did you mean?  BasicSocket::LOCK_NB
+#                BasicSocket::LOCK_UN
+#                BasicSocket::LOCK_SH
+# uninitialized constant BasicSocket::LOCK_NB
+# Did you mean?  BasicSocket::LOCK_UN
+#                BasicSocket::LOCK_EX
+#                BasicSocket::LOCK_SH
+# uninitialized constant BasicSocket::LOCK_SH
+# Did you mean?  BasicSocket::LOCK_NB
+#                BasicSocket::LOCK_UN
+#                BasicSocket::LOCK_EX
+# uninitialized constant BasicSocket::LOCK_UN
+# Did you mean?  BasicSocket::LOCK_NB
+#                BasicSocket::LOCK_EX
+#                BasicSocket::LOCK_SH
+# uninitialized constant BasicSocket::NOATIME
+# uninitialized constant BasicSocket::NOCTTY
+# uninitialized constant BasicSocket::NOFOLLOW
+# uninitialized constant BasicSocket::NONBLOCK
+# uninitialized constant BasicSocket::NULL
+# uninitialized constant BasicSocket::RDONLY
+# Did you mean?  BasicSocket::WRONLY
+# uninitialized constant BasicSocket::RDWR
+# uninitialized constant BasicSocket::RSYNC
+# Did you mean?  BasicSocket::DSYNC
+#                BasicSocket::SYNC
+# uninitialized constant BasicSocket::SEEK_CUR
+# uninitialized constant BasicSocket::SEEK_DATA
+# Did you mean?  BasicSocket::SEEK_SET
+# uninitialized constant BasicSocket::SEEK_END
+# uninitialized constant BasicSocket::SEEK_HOLE
+# uninitialized constant BasicSocket::SEEK_SET
+# uninitialized constant BasicSocket::SHARE_DELETE
+# uninitialized constant BasicSocket::SYNC
+# Did you mean?  BasicSocket::RSYNC
+#                BasicSocket::DSYNC
+# uninitialized constant BasicSocket::TMPFILE
+# Did you mean?  Tempfile
+# uninitialized constant BasicSocket::TRUNC
+# Did you mean?  TRUE
+# uninitialized constant BasicSocket::WRONLY
+# Did you mean?  BasicSocket::RDONLY
+# wrong constant name read_nonblock
+# uninitialized constant Benchmark
+# uninitialized constant Benchmark
+# wrong constant name clone
+# wrong constant name interpret_loosely
+# wrong constant name clone
+# wrong constant name irb
+# wrong constant name status_code
+# wrong constant name <static-init>
+# wrong constant name jruby_30?
+# wrong constant name jruby_3?
+# wrong constant name maglev_30?
+# wrong constant name maglev_3?
+# wrong constant name mingw_30?
+# wrong constant name mingw_3?
+# wrong constant name mri_30?
+# wrong constant name mri_3?
+# wrong constant name mswin64_30?
+# wrong constant name mswin64_3?
+# wrong constant name mswin_30?
+# wrong constant name mswin_3?
+# wrong constant name on_30?
+# wrong constant name on_3?
+# wrong constant name rbx_30?
+# wrong constant name rbx_3?
+# wrong constant name ruby_30?
+# wrong constant name ruby_3?
+# wrong constant name truffleruby_30?
+# wrong constant name truffleruby_3?
+# wrong constant name x64_mingw_30?
+# wrong constant name x64_mingw_3?
+# uninitialized constant Bundler::Definition::GENERICS
+# uninitialized constant Bundler::Definition::GENERIC_CACHE
+# wrong constant name dependencies_for
+# wrong constant name locked_dependencies
+# wrong constant name most_specific_locked_platform
+# wrong constant name requested_dependencies
+# wrong constant name resolve_only_locally!
+# wrong constant name no_lock
+# wrong constant name no_lock=
+# wrong constant name clone
+# wrong constant name get_proxy
+# uninitialized constant Bundler::Dependency::TYPES
+# wrong constant name branch
+# wrong constant name expanded_platforms
+# wrong constant name git
+# wrong constant name github
+# wrong constant name ref
+# wrong constant name <static-init>
+# wrong constant name sha1
+# wrong constant name check_primary_source_safety
+# wrong constant name <static-init>
+# wrong constant name environment
+# wrong constant name report
+# wrong constant name write
+# wrong constant name replace_with_backup
+# wrong constant name env_to_hash
+# wrong constant name from_env
+# wrong constant name <Class:Base>
+# wrong constant name <Class:CompactIndex>
+# wrong constant name <Class:Dependency>
+# wrong constant name <Class:Downloader>
+# wrong constant name <Class:Index>
+# wrong constant name <Class:TooManyRequestsError>
+# wrong constant name fetch_spec
+# wrong constant name fetchers
+# wrong constant name http_proxy
+# wrong constant name initialize
+# wrong constant name specs
+# wrong constant name specs_with_retry
+# wrong constant name uri
+# wrong constant name use_api
+# wrong constant name user_agent
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name api_fetcher?
+# wrong constant name available?
+# wrong constant name display_uri
+# wrong constant name downloader
+# wrong constant name fetch_uri
+# wrong constant name initialize
+# wrong constant name remote
+# wrong constant name remote_uri
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name <Class:ClientFetcher>
+# wrong constant name available?
+# wrong constant name specs
+# wrong constant name specs_for_names
+# uninitialized constant Bundler::Fetcher::CompactIndex::ClientFetcher::Elem
+# wrong constant name call
+# wrong constant name fetcher
+# wrong constant name fetcher=
+# wrong constant name ui
+# wrong constant name ui=
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name <static-init>
+# wrong constant name compact_index_request
+# wrong constant name dependency_api_uri
+# wrong constant name dependency_specs
+# wrong constant name get_formatted_specs_and_deps
+# wrong constant name specs
+# wrong constant name unmarshalled_dep_gems
+# wrong constant name <static-init>
+# wrong constant name connection
+# wrong constant name fetch
+# wrong constant name initialize
+# wrong constant name redirect_limit
+# wrong constant name request
+# wrong constant name <static-init>
+# wrong constant name specs
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name api_timeout
+# wrong constant name api_timeout=
+# wrong constant name disable_endpoint
+# wrong constant name disable_endpoint=
+# wrong constant name max_retries
+# wrong constant name max_retries=
+# wrong constant name redirect_limit
+# wrong constant name redirect_limit=
+# wrong constant name link
+# wrong constant name cp_lr
+# wrong constant name link_entry
+# uninitialized constant Bundler::GemHelper::DEFAULT
+# uninitialized constant Bundler::GemHelper::LN_SUPPORTED
+# uninitialized constant Bundler::GemHelper::LOW_METHODS
+# Did you mean?  Bundler::GemHelper::LowMethods
+# uninitialized constant Bundler::GemHelper::METHODS
+# Did you mean?  Method
+# uninitialized constant Bundler::GemHelper::OPT_TABLE
+# uninitialized constant Bundler::GemHelper::RUBY
+# uninitialized constant Bundler::GemHelper::VERSION
+# Did you mean?  Bundler::VERSION
+# wrong constant name allowed_push_host
+# wrong constant name already_tagged?
+# wrong constant name base
+# wrong constant name build_checksum
+# wrong constant name build_gem
+# wrong constant name built_gem_path
+# wrong constant name clean?
+# wrong constant name committed?
+# wrong constant name current_branch
+# wrong constant name default_remote
+# wrong constant name gem_command
+# wrong constant name gem_key
+# wrong constant name gem_push?
+# wrong constant name gem_push_host
+# wrong constant name gemspec
+# wrong constant name git_push
+# wrong constant name guard_clean
+# wrong constant name initialize
+# wrong constant name install
+# wrong constant name install_gem
+# wrong constant name name
+# wrong constant name rubygem_push
+# wrong constant name sh
+# wrong constant name sh_with_input
+# wrong constant name sh_with_status
+# wrong constant name spec_path
+# wrong constant name tag_prefix=
+# wrong constant name tag_version
+# wrong constant name version
+# wrong constant name version_tag
+# wrong constant name <static-init>
+# wrong constant name gemspec
+# wrong constant name install_tasks
+# wrong constant name instance
+# wrong constant name instance=
+# wrong constant name tag_prefix=
+# wrong constant name specificity_score
+# wrong constant name local_platform
+# wrong constant name same_deps
+# wrong constant name same_specificity
+# wrong constant name initialize
+# wrong constant name level
+# wrong constant name level=
+# wrong constant name locked_specs
+# wrong constant name major?
+# wrong constant name minor?
+# wrong constant name prerelease_specified
+# wrong constant name prerelease_specified=
+# wrong constant name sort_versions
+# wrong constant name strict
+# wrong constant name strict=
+# wrong constant name unlock_gems
+# wrong constant name <static-init>
+# wrong constant name <Class:GraphVizClient>
+# wrong constant name edge_options
+# wrong constant name groups
+# wrong constant name initialize
+# wrong constant name node_options
+# wrong constant name output_file
+# wrong constant name output_format
+# wrong constant name relations
+# wrong constant name viz
+# wrong constant name g
+# wrong constant name initialize
+# wrong constant name run
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name inject
+# wrong constant name remove
+# wrong constant name <static-init>
+# wrong constant name inject
+# wrong constant name remove
+# uninitialized constant Bundler::LazySpecification::GENERICS
+# uninitialized constant Bundler::LazySpecification::GENERIC_CACHE
+# wrong constant name eql?
+# wrong constant name platform_string
+# uninitialized constant Bundler::LazySpecification::Identifier
+# uninitialized constant Bundler::LazySpecification::Identifier
+# wrong constant name bundled_with
+# uninitialized constant Bundler::Molinillo::Compatibility
+# Did you mean?  Comparable
+# uninitialized constant Bundler::Molinillo::Compatibility
+# Did you mean?  Comparable
+# wrong constant name dependencies_equal?
+# wrong constant name parent_folder
+# wrong constant name permission_type
+# wrong constant name ==
+# wrong constant name add_dependency_names
+# wrong constant name app_cache_dirname
+# wrong constant name app_cache_path
+# wrong constant name bundler_plugin_api_source?
+# wrong constant name cache
+# wrong constant name cached!
+# wrong constant name can_lock?
+# wrong constant name dependency_names
+# wrong constant name dependency_names=
+# wrong constant name double_check_for
+# wrong constant name eql?
+# wrong constant name fetch_gemspec_files
+# wrong constant name gem_install_dir
+# wrong constant name hash
+# wrong constant name identifier
+# wrong constant name include?
+# wrong constant name initialize
+# wrong constant name install
+# wrong constant name install_path
+# wrong constant name installed?
+# wrong constant name local!
+# wrong constant name name
+# wrong constant name options
+# wrong constant name options_to_lock
+# wrong constant name post_install
+# wrong constant name remote!
+# wrong constant name root
+# wrong constant name spec_names
+# wrong constant name specs
+# wrong constant name to_lock
+# wrong constant name to_s
+# wrong constant name unlock!
+# wrong constant name unmet_deps
+# wrong constant name uri
+# wrong constant name uri_hash
+# wrong constant name <static-init>
+# wrong constant name <Class:CommandConflict>
+# wrong constant name <Class:SourceConflict>
+# wrong constant name installed_plugins
+# wrong constant name plugin_commands
+# wrong constant name unregister_plugin
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name <Class:Git>
+# wrong constant name <Class:Rubygems>
+# wrong constant name install
+# wrong constant name install_definition
+# uninitialized constant Bundler::Plugin::Installer::Git::DEFAULT_GLOB
+# wrong constant name generate_bin
+# wrong constant name <static-init>
+# uninitialized constant Bundler::Plugin::Installer::Rubygems::API_REQUEST_LIMIT
+# Did you mean?  Bundler::Plugin::Installer::Rubygems::API_REQUEST_SIZE
+# uninitialized constant Bundler::Plugin::Installer::Rubygems::API_REQUEST_SIZE
+# Did you mean?  Bundler::Plugin::Installer::Rubygems::API_REQUEST_LIMIT
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name list
+# wrong constant name save_plugin
+# wrong constant name uninstall
+# wrong constant name <static-init>
+# wrong constant name lock
+# uninitialized constant Bundler::Resolver::GENERICS
+# uninitialized constant Bundler::Resolver::GENERIC_CACHE
+# wrong constant name results_for
+# wrong constant name source_for
+# wrong constant name activated_platforms
+# wrong constant name activated_platforms=
+# wrong constant name sorted_activated_platforms
+# wrong constant name create_for
+# wrong constant name attempt
+# wrong constant name attempts
+# wrong constant name current_run
+# wrong constant name current_run=
+# wrong constant name initialize
+# wrong constant name name
+# wrong constant name name=
+# wrong constant name total_runs
+# wrong constant name total_runs=
+# wrong constant name <static-init>
+# wrong constant name attempts
+# wrong constant name default_attempts
+# wrong constant name default_retries
+# wrong constant name add_default_gems_to
+# wrong constant name add_to_load_path
+# wrong constant name all_specs
+# wrong constant name backport_ext_builder_monitor
+# wrong constant name correct_for_windows_path
+# wrong constant name default_stubs
+# wrong constant name find_bundler
+# wrong constant name find_name
+# wrong constant name gem_remote_fetcher
+# wrong constant name load_env_plugins
+# wrong constant name plain_specs
+# wrong constant name plain_specs=
+# wrong constant name stub_rubygems
+# wrong constant name supports_bundler_trampolining?
+# uninitialized constant Bundler::RubygemsIntegration::AlmostModern
+# uninitialized constant Bundler::RubygemsIntegration::AlmostModern
+# uninitialized constant Bundler::RubygemsIntegration::Ancient
+# uninitialized constant Bundler::RubygemsIntegration::Ancient
+# uninitialized constant Bundler::RubygemsIntegration::Future
+# uninitialized constant Bundler::RubygemsIntegration::Future
+# uninitialized constant Bundler::RubygemsIntegration::Legacy
+# uninitialized constant Bundler::RubygemsIntegration::Legacy
+# uninitialized constant Bundler::RubygemsIntegration::Modern
+# Did you mean?  Module
+# uninitialized constant Bundler::RubygemsIntegration::Modern
+# Did you mean?  Module
+# uninitialized constant Bundler::RubygemsIntegration::MoreFuture
+# uninitialized constant Bundler::RubygemsIntegration::MoreFuture
+# uninitialized constant Bundler::RubygemsIntegration::MoreModern
+# Did you mean?  Morecane
+# uninitialized constant Bundler::RubygemsIntegration::MoreModern
+# Did you mean?  Morecane
+# uninitialized constant Bundler::RubygemsIntegration::Transitional
+# uninitialized constant Bundler::RubygemsIntegration::Transitional
+# wrong constant name install_locked_bundler_and_restart_with_it_if_needed
+# wrong constant name restart_with_locked_bundler_if_needed
+# wrong constant name update_bundler_and_restart_with_it_if_needed
+# wrong constant name <static-init>
+# wrong constant name <Class:Mirror>
+# wrong constant name <Class:Mirrors>
+# wrong constant name <Class:Validator>
+# wrong constant name processor_count
+# wrong constant name ==
+# wrong constant name fallback_timeout
+# wrong constant name fallback_timeout=
+# wrong constant name initialize
+# wrong constant name uri
+# wrong constant name uri=
+# wrong constant name valid?
+# wrong constant name validate!
+# wrong constant name <static-init>
+# wrong constant name each
+# wrong constant name for
+# wrong constant name initialize
+# wrong constant name parse
+# wrong constant name <static-init>
+# wrong constant name <Class:Rule>
+# wrong constant name description
+# wrong constant name fail!
+# wrong constant name initialize
+# wrong constant name k
+# wrong constant name set
+# wrong constant name validate!
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name validate!
+# wrong constant name key_for
+# wrong constant name <Class:RubygemsAggregate>
+# wrong constant name add_dependency_names
+# wrong constant name cached!
+# wrong constant name identifier
+# wrong constant name local!
+# wrong constant name local_only!
+# wrong constant name remote!
+# wrong constant name spec_names
+# uninitialized constant Bundler::Source::Git::DEFAULT_GLOB
+# wrong constant name glob
+# wrong constant name local?
+# wrong constant name default_cache_path_for
+# wrong constant name dependency_api_available?
+# wrong constant name multiple_remotes?
+# wrong constant name no_remotes?
+# wrong constant name remote_names
+# wrong constant name identifier
+# wrong constant name initialize
+# wrong constant name source_map
+# wrong constant name sources
+# wrong constant name specs
+# wrong constant name <static-init>
+# wrong constant name add_global_rubygems_remote
+# wrong constant name aggregate_global_source?
+# wrong constant name expired_sources?
+# wrong constant name global_path_source
+# wrong constant name implicit_global_source?
+# wrong constant name local_only!
+# wrong constant name lock_other_sources
+# wrong constant name lock_rubygems_sources
+# wrong constant name merged_gem_lockfile_sections!
+# wrong constant name merged_gem_lockfile_sections?
+# wrong constant name non_default_explicit_sources
+# wrong constant name non_global_rubygems_sources
+# wrong constant name all_requirements
+# wrong constant name dependencies
+# wrong constant name direct_requirements
+# wrong constant name initialize
+# wrong constant name pinned_spec_names
+# wrong constant name sources
+# wrong constant name <static-init>
+# wrong constant name missing_specs
+# uninitialized constant Bundler::StubSpecification::GENERICS
+# uninitialized constant Bundler::StubSpecification::GENERIC_CACHE
+# wrong constant name extensions
+# wrong constant name gem_build_complete_path
+# wrong constant name manually_installed?
+# wrong constant name <Class:Cyclic>
+# wrong constant name each_strongly_connected_component
+# wrong constant name each_strongly_connected_component_from
+# wrong constant name strongly_connected_components
+# wrong constant name tsort
+# wrong constant name tsort_each
+# wrong constant name tsort_each_child
+# wrong constant name tsort_each_node
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name each_strongly_connected_component
+# wrong constant name each_strongly_connected_component_from
+# wrong constant name strongly_connected_components
+# wrong constant name tsort
+# wrong constant name tsort_each
+# wrong constant name <Class:Actions>
+# wrong constant name <Class:AmbiguousCommandError>
+# wrong constant name <Class:Argument>
+# wrong constant name <Class:Arguments>
+# wrong constant name <Class:Base>
+# wrong constant name <Class:Command>
+# wrong constant name <Class:CoreExt>
+# wrong constant name <Class:DynamicCommand>
+# wrong constant name <Class:Error>
+# wrong constant name <Class:Group>
+# wrong constant name <Class:HiddenCommand>
+# wrong constant name <Class:Invocation>
+# wrong constant name <Class:InvocationError>
+# wrong constant name <Class:LineEditor>
+# wrong constant name <Class:MalformattedArgumentError>
+# wrong constant name <Class:NestedContext>
+# wrong constant name <Class:NoKwargSpellChecker>
+# wrong constant name <Class:Option>
+# wrong constant name <Class:Options>
+# wrong constant name <Class:RakeCompat>
+# wrong constant name <Class:RequiredArgumentMissingError>
+# uninitialized constant Bundler::Thor::SHELL_DELEGATED_METHODS
+# wrong constant name <Class:Sandbox>
+# wrong constant name <Class:Shell>
+# wrong constant name <Class:UndefinedCommandError>
+# wrong constant name <Class:UnknownArgumentError>
+# wrong constant name <Class:Util>
+# wrong constant name help
+# wrong constant name <Class:CapturableERB>
+# wrong constant name <Class:ClassMethods>
+# wrong constant name <Class:CreateFile>
+# wrong constant name <Class:CreateLink>
+# wrong constant name <Class:Directory>
+# wrong constant name <Class:EmptyDirectory>
+# wrong constant name <Class:InjectIntoFile>
+# wrong constant name _cleanup_options_and_set
+# wrong constant name _shared_configuration
+# wrong constant name action
+# wrong constant name add_file
+# wrong constant name add_link
+# wrong constant name append_file
+# wrong constant name append_to_file
+# wrong constant name apply
+# wrong constant name behavior
+# wrong constant name behavior=
+# wrong constant name chmod
+# wrong constant name comment_lines
+# wrong constant name copy_file
+# wrong constant name create_file
+# wrong constant name create_link
+# wrong constant name destination_root
+# wrong constant name destination_root=
+# wrong constant name directory
+# wrong constant name empty_directory
+# wrong constant name find_in_source_paths
+# wrong constant name get
+# wrong constant name gsub_file
+# wrong constant name in_root
+# wrong constant name initialize
+# wrong constant name inject_into_class
+# wrong constant name inject_into_file
+# wrong constant name inject_into_module
+# wrong constant name insert_into_file
+# wrong constant name inside
+# wrong constant name link_file
+# wrong constant name prepend_file
+# wrong constant name prepend_to_file
+# wrong constant name relative_to_original_destination_root
+# wrong constant name remove_dir
+# wrong constant name remove_file
+# wrong constant name run
+# wrong constant name run_ruby_script
+# wrong constant name source_paths
+# wrong constant name template
+# wrong constant name thor
+# wrong constant name uncomment_lines
+# uninitialized constant Bundler::Thor::Actions::CapturableERB::Revision
+# wrong constant name <static-init>
+# wrong constant name add_runtime_options!
+# wrong constant name source_paths
+# wrong constant name source_paths_for_search
+# wrong constant name source_root
+# wrong constant name <static-init>
+# wrong constant name data
+# wrong constant name force_on_collision?
+# wrong constant name force_or_skip_or_conflict
+# wrong constant name identical?
+# wrong constant name initialize
+# wrong constant name on_conflict_behavior
+# wrong constant name render
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name execute!
+# wrong constant name file_level_lookup
+# wrong constant name files
+# wrong constant name initialize
+# wrong constant name source
+# wrong constant name <static-init>
+# wrong constant name base
+# wrong constant name config
+# wrong constant name convert_encoded_instructions
+# wrong constant name destination
+# wrong constant name destination=
+# wrong constant name exists?
+# wrong constant name given_destination
+# wrong constant name initialize
+# wrong constant name invoke!
+# wrong constant name invoke_with_conflict_check
+# wrong constant name on_conflict_behavior
+# wrong constant name on_file_clash_behavior
+# wrong constant name pretend?
+# wrong constant name relative_destination
+# wrong constant name revoke!
+# wrong constant name say_status
+# wrong constant name <static-init>
+# wrong constant name behavior
+# wrong constant name flag
+# wrong constant name initialize
+# wrong constant name replace!
+# wrong constant name replacement
+# wrong constant name say_status
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name included
+# wrong constant name <static-init>
+# wrong constant name banner
+# wrong constant name default
+# wrong constant name default_banner
+# wrong constant name description
+# wrong constant name enum
+# wrong constant name human_name
+# wrong constant name initialize
+# wrong constant name name
+# wrong constant name required
+# wrong constant name required?
+# wrong constant name show_default?
+# wrong constant name type
+# wrong constant name usage
+# wrong constant name valid_type?
+# wrong constant name validate!
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name parse
+# wrong constant name remaining
+# wrong constant name <static-init>
+# wrong constant name parse
+# wrong constant name split
+# wrong constant name <Class:ClassMethods>
+# wrong constant name args
+# wrong constant name args=
+# wrong constant name initialize
+# wrong constant name options
+# wrong constant name options=
+# wrong constant name parent_options
+# wrong constant name parent_options=
+# wrong constant name all_commands
+# wrong constant name all_tasks
+# wrong constant name allow_incompatible_default_type!
+# wrong constant name argument
+# wrong constant name arguments
+# wrong constant name attr_accessor
+# wrong constant name attr_reader
+# wrong constant name attr_writer
+# wrong constant name baseclass
+# wrong constant name basename
+# wrong constant name build_option
+# wrong constant name build_options
+# wrong constant name check_default_type
+# wrong constant name check_default_type!
+# wrong constant name check_unknown_options
+# wrong constant name check_unknown_options!
+# wrong constant name check_unknown_options?
+# wrong constant name class_option
+# wrong constant name class_options
+# wrong constant name class_options_help
+# wrong constant name commands
+# wrong constant name create_command
+# wrong constant name create_task
+# wrong constant name disable_required_check?
+# wrong constant name dispatch
+# wrong constant name exit_on_failure?
+# wrong constant name find_and_refresh_command
+# wrong constant name find_and_refresh_task
+# wrong constant name from_superclass
+# wrong constant name group
+# wrong constant name handle_argument_error
+# wrong constant name handle_no_command_error
+# wrong constant name handle_no_task_error
+# wrong constant name inherited
+# wrong constant name initialize_added
+# wrong constant name is_thor_reserved_word?
+# wrong constant name method_added
+# wrong constant name namespace
+# wrong constant name no_commands
+# wrong constant name no_commands?
+# wrong constant name no_commands_context
+# wrong constant name no_tasks
+# wrong constant name print_options
+# wrong constant name public_command
+# wrong constant name public_task
+# wrong constant name remove_argument
+# wrong constant name remove_class_option
+# wrong constant name remove_command
+# wrong constant name remove_task
+# wrong constant name start
+# wrong constant name stop_on_unknown_option?
+# wrong constant name strict_args_position
+# wrong constant name strict_args_position!
+# wrong constant name strict_args_position?
+# wrong constant name tasks
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name included
+# wrong constant name register_klass_file
+# wrong constant name shell
+# wrong constant name shell=
+# wrong constant name subclass_files
+# wrong constant name subclasses
+# wrong constant name formatted_usage
+# wrong constant name handle_argument_error?
+# wrong constant name handle_no_method_error?
+# wrong constant name hidden?
+# wrong constant name initialize
+# wrong constant name local_method?
+# wrong constant name not_debugging?
+# wrong constant name private_method?
+# wrong constant name public_method?
+# wrong constant name required_arguments_for
+# wrong constant name required_options
+# wrong constant name run
+# wrong constant name sans_backtrace
+# wrong constant name <static-init>
+# wrong constant name <Class:HashWithIndifferentAccess>
+# uninitialized constant Bundler::Thor::CoreExt::HashWithIndifferentAccess::Elem
+# uninitialized constant Bundler::Thor::CoreExt::HashWithIndifferentAccess::K
+# uninitialized constant Bundler::Thor::CoreExt::HashWithIndifferentAccess::V
+# wrong constant name []
+# wrong constant name []=
+# wrong constant name convert_key
+# wrong constant name delete
+# wrong constant name except
+# wrong constant name fetch
+# wrong constant name initialize
+# wrong constant name key?
+# wrong constant name merge
+# wrong constant name merge!
+# wrong constant name method_missing
+# wrong constant name replace
+# wrong constant name reverse_merge
+# wrong constant name reverse_merge!
+# wrong constant name values_at
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# uninitialized constant Bundler::Thor::DynamicCommand::FILE_REGEXP
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# uninitialized constant Bundler::Thor::Group::SHELL_DELEGATED_METHODS
+# Did you mean?  Bundler::Thor::SHELL_DELEGATED_METHODS
+# wrong constant name _invoke_for_class_method
+# wrong constant name <static-init>
+# wrong constant name banner
+# wrong constant name desc
+# wrong constant name get_options_from_invocations
+# wrong constant name handle_argument_error
+# wrong constant name help
+# wrong constant name invocation_blocks
+# wrong constant name invocations
+# wrong constant name invoke
+# wrong constant name invoke_from_option
+# wrong constant name printable_commands
+# wrong constant name printable_tasks
+# wrong constant name remove_invocation
+# wrong constant name self_command
+# wrong constant name self_task
+# uninitialized constant Bundler::Thor::HiddenCommand::FILE_REGEXP
+# wrong constant name <static-init>
+# wrong constant name <Class:ClassMethods>
+# wrong constant name _parse_initialization_options
+# wrong constant name _retrieve_class_and_command
+# wrong constant name _retrieve_class_and_task
+# wrong constant name _shared_configuration
+# wrong constant name current_command_chain
+# wrong constant name initialize
+# wrong constant name invoke
+# wrong constant name invoke_all
+# wrong constant name invoke_command
+# wrong constant name invoke_task
+# wrong constant name invoke_with_padding
+# wrong constant name prepare_for_invocation
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name included
+# wrong constant name <static-init>
+# wrong constant name <Class:Basic>
+# wrong constant name <Class:Readline>
+# wrong constant name initialize
+# wrong constant name options
+# wrong constant name prompt
+# wrong constant name readline
+# wrong constant name <static-init>
+# wrong constant name available?
+# wrong constant name <Class:PathCompletion>
+# wrong constant name initialize
+# wrong constant name matches
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name best_available
+# wrong constant name readline
+# wrong constant name <static-init>
+# wrong constant name enter
+# wrong constant name entered?
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name aliases
+# wrong constant name array?
+# wrong constant name boolean?
+# wrong constant name dasherize
+# wrong constant name dasherized?
+# wrong constant name group
+# wrong constant name hash?
+# wrong constant name hide
+# wrong constant name lazy_default
+# wrong constant name numeric?
+# wrong constant name repeatable
+# wrong constant name string?
+# wrong constant name switch_name
+# wrong constant name undasherize
+# wrong constant name usage
+# wrong constant name validate_default_type!
+# wrong constant name <static-init>
+# wrong constant name parse
+# uninitialized constant Bundler::Thor::Options::NUMERIC
+# Did you mean?  Numeric
+# wrong constant name assign_result!
+# wrong constant name check_unknown!
+# wrong constant name current_is_switch?
+# wrong constant name current_is_switch_formatted?
+# wrong constant name initialize
+# wrong constant name normalize_switch
+# wrong constant name parse_boolean
+# wrong constant name parse_peek
+# wrong constant name parsing_options?
+# wrong constant name switch?
+# wrong constant name switch_option
+# wrong constant name unshift
+# wrong constant name <static-init>
+# wrong constant name to_switches
+# uninitialized constant Bundler::Thor::RakeCompat::DEFAULT
+# uninitialized constant Bundler::Thor::RakeCompat::LN_SUPPORTED
+# uninitialized constant Bundler::Thor::RakeCompat::LOW_METHODS
+# Did you mean?  Bundler::Thor::RakeCompat::LowMethods
+# uninitialized constant Bundler::Thor::RakeCompat::METHODS
+# Did you mean?  Method
+# uninitialized constant Bundler::Thor::RakeCompat::OPT_TABLE
+# uninitialized constant Bundler::Thor::RakeCompat::RUBY
+# uninitialized constant Bundler::Thor::RakeCompat::VERSION
+# Did you mean?  Bundler::VERSION
+# wrong constant name <static-init>
+# wrong constant name included
+# wrong constant name rake_classes
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <Class:Basic>
+# wrong constant name <Class:Color>
+# wrong constant name <Class:HTML>
+# wrong constant name _shared_configuration
+# wrong constant name ask
+# wrong constant name error
+# wrong constant name file_collision
+# wrong constant name initialize
+# wrong constant name no?
+# wrong constant name print_in_columns
+# wrong constant name print_table
+# wrong constant name print_wrapped
+# wrong constant name say
+# wrong constant name say_error
+# wrong constant name say_status
+# wrong constant name set_color
+# wrong constant name shell
+# wrong constant name shell=
+# wrong constant name terminal_width
+# wrong constant name with_padding
+# wrong constant name yes?
+# wrong constant name answer_match
+# wrong constant name as_unicode
+# wrong constant name ask
+# wrong constant name ask_filtered
+# wrong constant name ask_simply
+# wrong constant name base
+# wrong constant name base=
+# wrong constant name can_display_colors?
+# wrong constant name dynamic_width
+# wrong constant name dynamic_width_stty
+# wrong constant name dynamic_width_tput
+# wrong constant name error
+# wrong constant name file_collision
+# wrong constant name file_collision_help
+# wrong constant name git_merge_tool
+# wrong constant name indent
+# wrong constant name is?
+# wrong constant name lookup_color
+# wrong constant name merge
+# wrong constant name merge_tool
+# wrong constant name mute
+# wrong constant name mute?
+# wrong constant name no?
+# wrong constant name padding
+# wrong constant name padding=
+# wrong constant name prepare_message
+# wrong constant name print_in_columns
+# wrong constant name print_table
+# wrong constant name print_wrapped
+# wrong constant name quiet?
+# wrong constant name say
+# wrong constant name say_error
+# wrong constant name say_status
+# wrong constant name set_color
+# wrong constant name show_diff
+# wrong constant name stderr
+# wrong constant name stdout
+# wrong constant name terminal_width
+# wrong constant name truncate
+# wrong constant name unix?
+# wrong constant name yes?
+# wrong constant name <static-init>
+# uninitialized constant Bundler::Thor::Shell::Color::DEFAULT_TERMINAL_WIDTH
+# wrong constant name are_colors_disabled?
+# wrong constant name are_colors_supported?
+# wrong constant name diff_lcs_loaded?
+# wrong constant name output_diff_line
+# wrong constant name set_color
+# wrong constant name <static-init>
+# uninitialized constant Bundler::Thor::Shell::HTML::DEFAULT_TERMINAL_WIDTH
+# wrong constant name ask
+# wrong constant name diff_lcs_loaded?
+# wrong constant name output_diff_line
+# wrong constant name set_color
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <Class:SpellChecker>
+# wrong constant name all_commands
+# wrong constant name command
+# wrong constant name initialize
+# wrong constant name corrections
+# wrong constant name error
+# wrong constant name initialize
+# wrong constant name spell_checker
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <Class:SpellChecker>
+# wrong constant name initialize
+# wrong constant name switches
+# wrong constant name unknown
+# wrong constant name corrections
+# wrong constant name error
+# wrong constant name initialize
+# wrong constant name spell_checker
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name camel_case
+# wrong constant name escape_globs
+# wrong constant name escape_html
+# wrong constant name find_by_namespace
+# wrong constant name find_class_and_command_by_namespace
+# wrong constant name find_class_and_task_by_namespace
+# wrong constant name globs_for
+# wrong constant name load_thorfile
+# wrong constant name namespace_from_thor_class
+# wrong constant name namespaces_in_content
+# wrong constant name ruby_command
+# wrong constant name snake_case
+# wrong constant name thor_classes_in
+# wrong constant name thor_root
+# wrong constant name thor_root_glob
+# wrong constant name user_home
+# wrong constant name <static-init>
+# wrong constant name banner
+# wrong constant name check_unknown_options!
+# wrong constant name command_help
+# wrong constant name default_command
+# wrong constant name default_task
+# wrong constant name deprecation_warning
+# wrong constant name desc
+# wrong constant name disable_required_check
+# wrong constant name disable_required_check!
+# wrong constant name disable_required_check?
+# wrong constant name dispatch
+# wrong constant name dynamic_command_class
+# wrong constant name find_command_possibilities
+# wrong constant name find_task_possibilities
+# wrong constant name help
+# wrong constant name long_desc
+# wrong constant name map
+# wrong constant name method_option
+# wrong constant name method_options
+# wrong constant name normalize_command_name
+# wrong constant name normalize_task_name
+# wrong constant name option
+# wrong constant name options
+# wrong constant name package_name
+# wrong constant name printable_commands
+# wrong constant name printable_tasks
+# wrong constant name register
+# wrong constant name retrieve_command_name
+# wrong constant name retrieve_task_name
+# wrong constant name stop_on_unknown_option
+# wrong constant name stop_on_unknown_option!
+# wrong constant name stop_on_unknown_option?
+# wrong constant name subcommand
+# wrong constant name subcommand_classes
+# wrong constant name subcommand_help
+# wrong constant name subcommands
+# wrong constant name subtask
+# wrong constant name subtask_help
+# wrong constant name subtasks
+# wrong constant name task_help
+# wrong constant name add_color
+# wrong constant name ask
+# wrong constant name confirm
+# wrong constant name debug
+# wrong constant name debug?
+# wrong constant name error
+# wrong constant name info
+# wrong constant name initialize
+# wrong constant name level
+# wrong constant name level=
+# wrong constant name no?
+# wrong constant name quiet?
+# wrong constant name shell=
+# wrong constant name silence
+# wrong constant name trace
+# wrong constant name unprinted_warnings
+# wrong constant name warn
+# wrong constant name yes?
+# wrong constant name <static-init>
+# wrong constant name <Class:BadURIError>
+# wrong constant name <Class:Error>
+# wrong constant name <Class:FTP>
+# wrong constant name <Class:File>
+# wrong constant name <Class:Generic>
+# wrong constant name <Class:HTTP>
+# wrong constant name <Class:HTTPS>
+# wrong constant name <Class:InvalidComponentError>
+# wrong constant name <Class:InvalidURIError>
+# wrong constant name <Class:LDAP>
+# wrong constant name <Class:LDAPS>
+# wrong constant name <Class:MailTo>
+# wrong constant name <Class:RFC2396_Parser>
+# wrong constant name <Class:RFC2396_REGEXP>
+# wrong constant name <Class:RFC3986_Parser>
+# wrong constant name <Class:Util>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# uninitialized constant Bundler::URI::FTP::ABS_PATH
+# Did you mean?  Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::FTP::ABS_URI
+# Did you mean?  Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::FTP::ABS_URI_REF
+# Did you mean?  Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::FTP::DEFAULT_PARSER
+# Did you mean?  Bundler::URI::FTP::DEFAULT_PORT
+#                Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::FTP::ESCAPED
+# Did you mean?  Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::FTP::FRAGMENT
+# Did you mean?  Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::FTP::HOST
+# Did you mean?  Bundler::URI::HOST
+# uninitialized constant Bundler::URI::FTP::OPAQUE
+# Did you mean?  Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::FTP::PORT
+# Did you mean?  Bundler::URI::PORT
+# uninitialized constant Bundler::URI::FTP::QUERY
+# Did you mean?  Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::FTP::REGISTRY
+# Did you mean?  Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::FTP::REL_PATH
+# Did you mean?  Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::FTP::REL_URI
+# Did you mean?  Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::FTP::REL_URI_REF
+# Did you mean?  Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::FTP::RFC3986_PARSER
+# Did you mean?  Bundler::URI::FTP::RFC3986_Parser
+#                Bundler::URI::RFC3986_Parser
+#                Bundler::URI::FTP::RFC2396_Parser
+#                Bundler::URI::RFC2396_Parser
+#                Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::FTP::SCHEME
+# Did you mean?  Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::FTP::TBLDECWWWCOMP_
+# Did you mean?  Bundler::URI::FTP::TBLENCWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::FTP::TBLENCWWWCOMP_
+# Did you mean?  Bundler::URI::FTP::TBLDECWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::FTP::UNSAFE
+# Did you mean?  Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::FTP::URI_REF
+# Did you mean?  Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::FTP::USERINFO
+# Did you mean?  Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::FTP::USE_REGISTRY
+# uninitialized constant Bundler::URI::FTP::VERSION
+# Did you mean?  Bundler::URI::VERSION
+#                Bundler::VERSION
+# uninitialized constant Bundler::URI::FTP::VERSION_CODE
+# Did you mean?  Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::FTP::WEB_ENCODINGS_
+# Did you mean?  Bundler::URI::WEB_ENCODINGS_
+# wrong constant name set_typecode
+# wrong constant name typecode
+# wrong constant name typecode=
+# wrong constant name <static-init>
+# wrong constant name new2
+# uninitialized constant Bundler::URI::File::ABS_PATH
+# Did you mean?  Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::File::ABS_URI
+# Did you mean?  Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::File::ABS_URI_REF
+# Did you mean?  Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::File::DEFAULT_PARSER
+# Did you mean?  Bundler::URI::File::DEFAULT_PORT
+#                Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::File::ESCAPED
+# Did you mean?  Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::File::FRAGMENT
+# Did you mean?  Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::File::HOST
+# Did you mean?  Bundler::URI::HOST
+# uninitialized constant Bundler::URI::File::OPAQUE
+# Did you mean?  Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::File::PORT
+# Did you mean?  Bundler::URI::PORT
+# uninitialized constant Bundler::URI::File::QUERY
+# Did you mean?  Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::File::REGISTRY
+# Did you mean?  Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::File::REL_PATH
+# Did you mean?  Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::File::REL_URI
+# Did you mean?  Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::File::REL_URI_REF
+# Did you mean?  Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::File::RFC3986_PARSER
+# Did you mean?  Bundler::URI::File::RFC3986_Parser
+#                Bundler::URI::RFC3986_Parser
+#                Bundler::URI::File::RFC2396_Parser
+#                Bundler::URI::RFC2396_Parser
+#                Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::File::SCHEME
+# Did you mean?  Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::File::TBLDECWWWCOMP_
+# Did you mean?  Bundler::URI::File::TBLENCWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::File::TBLENCWWWCOMP_
+# Did you mean?  Bundler::URI::File::TBLDECWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::File::UNSAFE
+# Did you mean?  Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::File::URI_REF
+# Did you mean?  Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::File::USERINFO
+# Did you mean?  Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::File::USE_REGISTRY
+# uninitialized constant Bundler::URI::File::VERSION
+# Did you mean?  Bundler::URI::VERSION
+#                Bundler::VERSION
+# uninitialized constant Bundler::URI::File::VERSION_CODE
+# Did you mean?  Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::File::WEB_ENCODINGS_
+# Did you mean?  Bundler::URI::WEB_ENCODINGS_
+# wrong constant name check_password
+# wrong constant name check_user
+# wrong constant name check_userinfo
+# wrong constant name set_userinfo
+# wrong constant name <static-init>
+# wrong constant name +
+# wrong constant name -
+# wrong constant name ==
+# uninitialized constant Bundler::URI::Generic::ABS_PATH
+# Did you mean?  Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::Generic::ABS_URI
+# Did you mean?  Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::Generic::ABS_URI_REF
+# Did you mean?  Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::Generic::DEFAULT_PARSER
+# Did you mean?  Bundler::URI::Generic::DEFAULT_PORT
+#                Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::Generic::ESCAPED
+# Did you mean?  Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::Generic::FRAGMENT
+# Did you mean?  Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::Generic::HOST
+# Did you mean?  Bundler::URI::HOST
+# uninitialized constant Bundler::URI::Generic::OPAQUE
+# Did you mean?  Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::Generic::PORT
+# Did you mean?  Bundler::URI::PORT
+# uninitialized constant Bundler::URI::Generic::QUERY
+# Did you mean?  Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::Generic::REGISTRY
+# Did you mean?  Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::Generic::REL_PATH
+# Did you mean?  Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::Generic::REL_URI
+# Did you mean?  Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::Generic::REL_URI_REF
+# Did you mean?  Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::Generic::RFC3986_PARSER
+# Did you mean?  Bundler::URI::Generic::RFC3986_Parser
+#                Bundler::URI::RFC3986_Parser
+#                Bundler::URI::Generic::RFC2396_Parser
+#                Bundler::URI::RFC2396_Parser
+#                Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::Generic::SCHEME
+# Did you mean?  Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::Generic::TBLDECWWWCOMP_
+# Did you mean?  Bundler::URI::Generic::TBLENCWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::Generic::TBLENCWWWCOMP_
+# Did you mean?  Bundler::URI::Generic::TBLDECWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::Generic::UNSAFE
+# Did you mean?  Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::Generic::URI_REF
+# Did you mean?  Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::Generic::USERINFO
+# Did you mean?  Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::Generic::VERSION
+# Did you mean?  Bundler::URI::VERSION
+#                Bundler::VERSION
+# uninitialized constant Bundler::URI::Generic::VERSION_CODE
+# Did you mean?  Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::Generic::WEB_ENCODINGS_
+# Did you mean?  Bundler::URI::WEB_ENCODINGS_
+# wrong constant name absolute
+# wrong constant name absolute?
+# wrong constant name coerce
+# wrong constant name component
+# wrong constant name component_ary
+# wrong constant name default_port
+# wrong constant name eql?
+# wrong constant name find_proxy
+# wrong constant name fragment
+# wrong constant name fragment=
+# wrong constant name hierarchical?
+# wrong constant name host
+# wrong constant name host=
+# wrong constant name hostname
+# wrong constant name hostname=
+# wrong constant name initialize
+# wrong constant name merge
+# wrong constant name merge!
+# wrong constant name normalize
+# wrong constant name normalize!
+# wrong constant name opaque
+# wrong constant name opaque=
+# wrong constant name parser
+# wrong constant name password
+# wrong constant name password=
+# wrong constant name path
+# wrong constant name path=
+# wrong constant name port
+# wrong constant name port=
+# wrong constant name query
+# wrong constant name query=
+# wrong constant name registry
+# wrong constant name registry=
+# wrong constant name relative?
+# wrong constant name route_from
+# wrong constant name route_to
+# wrong constant name scheme
+# wrong constant name scheme=
+# wrong constant name select
+# wrong constant name set_host
+# wrong constant name set_opaque
+# wrong constant name set_password
+# wrong constant name set_path
+# wrong constant name set_port
+# wrong constant name set_registry
+# wrong constant name set_scheme
+# wrong constant name set_user
+# wrong constant name set_userinfo
+# wrong constant name user
+# wrong constant name user=
+# wrong constant name userinfo
+# wrong constant name userinfo=
+# wrong constant name <static-init>
+# wrong constant name build
+# wrong constant name build2
+# wrong constant name component
+# wrong constant name default_port
+# wrong constant name use_proxy?
+# wrong constant name use_registry
+# uninitialized constant Bundler::URI::HTTP::ABS_PATH
+# Did you mean?  Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::HTTP::ABS_URI
+# Did you mean?  Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::HTTP::ABS_URI_REF
+# Did you mean?  Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::HTTP::DEFAULT_PARSER
+# Did you mean?  Bundler::URI::HTTP::DEFAULT_PORT
+#                Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::HTTP::ESCAPED
+# Did you mean?  Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::HTTP::FRAGMENT
+# Did you mean?  Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::HTTP::HOST
+# Did you mean?  Bundler::URI::HOST
+# uninitialized constant Bundler::URI::HTTP::OPAQUE
+# Did you mean?  Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::HTTP::PORT
+# Did you mean?  Bundler::URI::PORT
+# uninitialized constant Bundler::URI::HTTP::QUERY
+# Did you mean?  Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::HTTP::REGISTRY
+# Did you mean?  Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::HTTP::REL_PATH
+# Did you mean?  Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::HTTP::REL_URI
+# Did you mean?  Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::HTTP::REL_URI_REF
+# Did you mean?  Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::HTTP::RFC3986_PARSER
+# Did you mean?  Bundler::URI::HTTP::RFC3986_Parser
+#                Bundler::URI::RFC3986_Parser
+#                Bundler::URI::HTTP::RFC2396_Parser
+#                Bundler::URI::RFC2396_Parser
+#                Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::HTTP::SCHEME
+# Did you mean?  Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::HTTP::TBLDECWWWCOMP_
+# Did you mean?  Bundler::URI::HTTP::TBLENCWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::HTTP::TBLENCWWWCOMP_
+# Did you mean?  Bundler::URI::HTTP::TBLDECWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::HTTP::UNSAFE
+# Did you mean?  Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::HTTP::URI_REF
+# Did you mean?  Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::HTTP::USERINFO
+# Did you mean?  Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::HTTP::USE_REGISTRY
+# uninitialized constant Bundler::URI::HTTP::VERSION
+# Did you mean?  Bundler::URI::VERSION
+#                Bundler::VERSION
+# uninitialized constant Bundler::URI::HTTP::VERSION_CODE
+# Did you mean?  Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::HTTP::WEB_ENCODINGS_
+# Did you mean?  Bundler::URI::WEB_ENCODINGS_
+# wrong constant name request_uri
+# wrong constant name <static-init>
+# uninitialized constant Bundler::URI::HTTPS::ABS_PATH
+# Did you mean?  Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::HTTPS::ABS_URI
+# Did you mean?  Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::HTTPS::ABS_URI_REF
+# Did you mean?  Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::HTTPS::COMPONENT
+# uninitialized constant Bundler::URI::HTTPS::DEFAULT_PARSER
+# Did you mean?  Bundler::URI::HTTPS::DEFAULT_PORT
+#                Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::HTTPS::ESCAPED
+# Did you mean?  Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::HTTPS::FRAGMENT
+# Did you mean?  Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::HTTPS::HOST
+# Did you mean?  Bundler::URI::HOST
+# uninitialized constant Bundler::URI::HTTPS::OPAQUE
+# Did you mean?  Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::HTTPS::PORT
+# Did you mean?  Bundler::URI::PORT
+# uninitialized constant Bundler::URI::HTTPS::QUERY
+# Did you mean?  Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::HTTPS::REGISTRY
+# Did you mean?  Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::HTTPS::REL_PATH
+# Did you mean?  Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::HTTPS::REL_URI
+# Did you mean?  Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::HTTPS::REL_URI_REF
+# Did you mean?  Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::HTTPS::RFC3986_PARSER
+# Did you mean?  Bundler::URI::HTTPS::RFC3986_Parser
+#                Bundler::URI::RFC3986_Parser
+#                Bundler::URI::HTTPS::RFC2396_Parser
+#                Bundler::URI::RFC2396_Parser
+#                Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::HTTPS::SCHEME
+# Did you mean?  Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::HTTPS::TBLDECWWWCOMP_
+# Did you mean?  Bundler::URI::HTTPS::TBLENCWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::HTTPS::TBLENCWWWCOMP_
+# Did you mean?  Bundler::URI::HTTPS::TBLDECWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::HTTPS::UNSAFE
+# Did you mean?  Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::HTTPS::URI_REF
+# Did you mean?  Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::HTTPS::USERINFO
+# Did you mean?  Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::HTTPS::USE_REGISTRY
+# uninitialized constant Bundler::URI::HTTPS::VERSION
+# Did you mean?  Bundler::URI::VERSION
+#                Bundler::VERSION
+# uninitialized constant Bundler::URI::HTTPS::VERSION_CODE
+# Did you mean?  Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::HTTPS::WEB_ENCODINGS_
+# Did you mean?  Bundler::URI::WEB_ENCODINGS_
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# uninitialized constant Bundler::URI::LDAP::ABS_PATH
+# Did you mean?  Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::LDAP::ABS_URI
+# Did you mean?  Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::LDAP::ABS_URI_REF
+# Did you mean?  Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::LDAP::DEFAULT_PARSER
+# Did you mean?  Bundler::URI::LDAP::DEFAULT_PORT
+#                Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::LDAP::ESCAPED
+# Did you mean?  Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::LDAP::FRAGMENT
+# Did you mean?  Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::LDAP::HOST
+# Did you mean?  Bundler::URI::HOST
+# uninitialized constant Bundler::URI::LDAP::OPAQUE
+# Did you mean?  Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::LDAP::PORT
+# Did you mean?  Bundler::URI::PORT
+# uninitialized constant Bundler::URI::LDAP::QUERY
+# Did you mean?  Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::LDAP::REGISTRY
+# Did you mean?  Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::LDAP::REL_PATH
+# Did you mean?  Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::LDAP::REL_URI
+# Did you mean?  Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::LDAP::REL_URI_REF
+# Did you mean?  Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::LDAP::RFC3986_PARSER
+# Did you mean?  Bundler::URI::LDAP::RFC3986_Parser
+#                Bundler::URI::RFC3986_Parser
+#                Bundler::URI::LDAP::RFC2396_Parser
+#                Bundler::URI::RFC2396_Parser
+#                Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::LDAP::SCHEME
+# Did you mean?  Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::LDAP::TBLDECWWWCOMP_
+# Did you mean?  Bundler::URI::LDAP::TBLENCWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::LDAP::TBLENCWWWCOMP_
+# Did you mean?  Bundler::URI::LDAP::TBLDECWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::LDAP::UNSAFE
+# Did you mean?  Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::LDAP::URI_REF
+# Did you mean?  Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::LDAP::USERINFO
+# Did you mean?  Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::LDAP::USE_REGISTRY
+# uninitialized constant Bundler::URI::LDAP::VERSION
+# Did you mean?  Bundler::URI::VERSION
+#                Bundler::VERSION
+# uninitialized constant Bundler::URI::LDAP::VERSION_CODE
+# Did you mean?  Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::LDAP::WEB_ENCODINGS_
+# Did you mean?  Bundler::URI::WEB_ENCODINGS_
+# wrong constant name attributes
+# wrong constant name attributes=
+# wrong constant name dn
+# wrong constant name dn=
+# wrong constant name extensions
+# wrong constant name extensions=
+# wrong constant name filter
+# wrong constant name filter=
+# wrong constant name initialize
+# wrong constant name scope
+# wrong constant name scope=
+# wrong constant name set_attributes
+# wrong constant name set_dn
+# wrong constant name set_extensions
+# wrong constant name set_filter
+# wrong constant name set_scope
+# wrong constant name <static-init>
+# uninitialized constant Bundler::URI::LDAPS::ABS_PATH
+# Did you mean?  Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::LDAPS::ABS_URI
+# Did you mean?  Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::LDAPS::ABS_URI_REF
+# Did you mean?  Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::LDAPS::COMPONENT
+# uninitialized constant Bundler::URI::LDAPS::DEFAULT_PARSER
+# Did you mean?  Bundler::URI::LDAPS::DEFAULT_PORT
+#                Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::LDAPS::ESCAPED
+# Did you mean?  Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::LDAPS::FRAGMENT
+# Did you mean?  Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::LDAPS::HOST
+# Did you mean?  Bundler::URI::HOST
+# uninitialized constant Bundler::URI::LDAPS::OPAQUE
+# Did you mean?  Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::LDAPS::PORT
+# Did you mean?  Bundler::URI::PORT
+# uninitialized constant Bundler::URI::LDAPS::QUERY
+# Did you mean?  Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::LDAPS::REGISTRY
+# Did you mean?  Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::LDAPS::REL_PATH
+# Did you mean?  Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::LDAPS::REL_URI
+# Did you mean?  Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::LDAPS::REL_URI_REF
+# Did you mean?  Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::LDAPS::RFC3986_PARSER
+# Did you mean?  Bundler::URI::LDAPS::RFC3986_Parser
+#                Bundler::URI::RFC3986_Parser
+#                Bundler::URI::LDAPS::RFC2396_Parser
+#                Bundler::URI::RFC2396_Parser
+#                Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::LDAPS::SCHEME
+# Did you mean?  Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::LDAPS::SCOPE
+# uninitialized constant Bundler::URI::LDAPS::SCOPE_BASE
+# Did you mean?  Bundler::URI::LDAPS::SCOPE_ONE
+# uninitialized constant Bundler::URI::LDAPS::SCOPE_ONE
+# Did you mean?  Bundler::URI::LDAPS::SCOPE_SUB
+#                Bundler::URI::LDAPS::SCOPE_BASE
+# uninitialized constant Bundler::URI::LDAPS::SCOPE_SUB
+# Did you mean?  Bundler::URI::LDAPS::SCOPE_ONE
+# uninitialized constant Bundler::URI::LDAPS::TBLDECWWWCOMP_
+# Did you mean?  Bundler::URI::LDAPS::TBLENCWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::LDAPS::TBLENCWWWCOMP_
+# Did you mean?  Bundler::URI::LDAPS::TBLDECWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::LDAPS::UNSAFE
+# Did you mean?  Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::LDAPS::URI_REF
+# Did you mean?  Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::LDAPS::USERINFO
+# Did you mean?  Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::LDAPS::USE_REGISTRY
+# uninitialized constant Bundler::URI::LDAPS::VERSION
+# Did you mean?  Bundler::URI::VERSION
+#                Bundler::VERSION
+# uninitialized constant Bundler::URI::LDAPS::VERSION_CODE
+# Did you mean?  Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::LDAPS::WEB_ENCODINGS_
+# Did you mean?  Bundler::URI::WEB_ENCODINGS_
+# wrong constant name <static-init>
+# uninitialized constant Bundler::URI::MailTo::ABS_PATH
+# Did you mean?  Bundler::URI::ABS_PATH
+# uninitialized constant Bundler::URI::MailTo::ABS_URI
+# Did you mean?  Bundler::URI::ABS_URI
+# uninitialized constant Bundler::URI::MailTo::ABS_URI_REF
+# Did you mean?  Bundler::URI::ABS_URI_REF
+# uninitialized constant Bundler::URI::MailTo::DEFAULT_PARSER
+# Did you mean?  Bundler::URI::MailTo::DEFAULT_PORT
+#                Bundler::URI::DEFAULT_PARSER
+# uninitialized constant Bundler::URI::MailTo::ESCAPED
+# Did you mean?  Bundler::URI::ESCAPED
+# uninitialized constant Bundler::URI::MailTo::FRAGMENT
+# Did you mean?  Bundler::URI::FRAGMENT
+# uninitialized constant Bundler::URI::MailTo::HOST
+# Did you mean?  Bundler::URI::HOST
+# uninitialized constant Bundler::URI::MailTo::OPAQUE
+# Did you mean?  Bundler::URI::OPAQUE
+# uninitialized constant Bundler::URI::MailTo::PORT
+# Did you mean?  Bundler::URI::PORT
+# uninitialized constant Bundler::URI::MailTo::QUERY
+# Did you mean?  Bundler::URI::QUERY
+# uninitialized constant Bundler::URI::MailTo::REGISTRY
+# Did you mean?  Bundler::URI::REGISTRY
+# uninitialized constant Bundler::URI::MailTo::REL_PATH
+# Did you mean?  Bundler::URI::REL_PATH
+# uninitialized constant Bundler::URI::MailTo::REL_URI
+# Did you mean?  Bundler::URI::REL_URI
+# uninitialized constant Bundler::URI::MailTo::REL_URI_REF
+# Did you mean?  Bundler::URI::REL_URI_REF
+# uninitialized constant Bundler::URI::MailTo::RFC3986_PARSER
+# Did you mean?  Bundler::URI::MailTo::RFC3986_Parser
+#                Bundler::URI::RFC3986_Parser
+#                Bundler::URI::MailTo::RFC2396_Parser
+#                Bundler::URI::RFC2396_Parser
+#                Bundler::URI::RFC3986_PARSER
+# uninitialized constant Bundler::URI::MailTo::SCHEME
+# Did you mean?  Bundler::URI::SCHEME
+# uninitialized constant Bundler::URI::MailTo::TBLDECWWWCOMP_
+# Did you mean?  Bundler::URI::MailTo::TBLENCWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::MailTo::TBLENCWWWCOMP_
+# Did you mean?  Bundler::URI::MailTo::TBLDECWWWCOMP_
+#                Bundler::URI::TBLENCWWWCOMP_
+#                Bundler::URI::TBLDECWWWCOMP_
+# uninitialized constant Bundler::URI::MailTo::UNSAFE
+# Did you mean?  Bundler::URI::UNSAFE
+# uninitialized constant Bundler::URI::MailTo::URI_REF
+# Did you mean?  Bundler::URI::URI_REF
+# uninitialized constant Bundler::URI::MailTo::USERINFO
+# Did you mean?  Bundler::URI::USERINFO
+# uninitialized constant Bundler::URI::MailTo::USE_REGISTRY
+# uninitialized constant Bundler::URI::MailTo::VERSION
+# Did you mean?  Bundler::URI::VERSION
+#                Bundler::VERSION
+# uninitialized constant Bundler::URI::MailTo::VERSION_CODE
+# Did you mean?  Bundler::URI::VERSION_CODE
+# uninitialized constant Bundler::URI::MailTo::WEB_ENCODINGS_
+# Did you mean?  Bundler::URI::WEB_ENCODINGS_
+# wrong constant name headers
+# wrong constant name headers=
+# wrong constant name initialize
+# wrong constant name set_headers
+# wrong constant name set_to
+# wrong constant name to
+# wrong constant name to=
+# wrong constant name to_mailtext
+# wrong constant name to_rfc822text
+# wrong constant name <static-init>
+# wrong constant name escape
+# wrong constant name extract
+# wrong constant name initialize
+# wrong constant name join
+# wrong constant name make_regexp
+# wrong constant name parse
+# wrong constant name pattern
+# wrong constant name regexp
+# wrong constant name split
+# wrong constant name unescape
+# wrong constant name <static-init>
+# wrong constant name <Class:PATTERN>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name join
+# wrong constant name parse
+# wrong constant name regexp
+# wrong constant name split
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name make_components_hash
+# wrong constant name <static-init>
+# wrong constant name decode_www_form
+# wrong constant name decode_www_form_component
+# wrong constant name encode_www_form
+# wrong constant name encode_www_form_component
+# wrong constant name extract
+# wrong constant name for
+# wrong constant name get_encoding
+# wrong constant name join
+# wrong constant name parse
+# wrong constant name regexp
+# wrong constant name scheme_list
+# wrong constant name split
+# wrong constant name <Class:NEq>
+# wrong constant name <Class:ReqR>
+# uninitialized constant Bundler::VersionRanges::NEq::Elem
+# wrong constant name version
+# wrong constant name version=
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name <=>
+# uninitialized constant Bundler::VersionRanges::ReqR::Elem
+# wrong constant name <Class:Endpoint>
+# wrong constant name cover?
+# wrong constant name empty?
+# wrong constant name left
+# wrong constant name left=
+# wrong constant name right
+# wrong constant name right=
+# wrong constant name single?
+# wrong constant name <=>
+# uninitialized constant Bundler::VersionRanges::ReqR::Endpoint::Elem
+# wrong constant name inclusive
+# wrong constant name inclusive=
+# wrong constant name version
+# wrong constant name version=
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name <static-init>
+# wrong constant name empty?
+# wrong constant name for
+# wrong constant name for_many
+# uninitialized constant Bundler::YAMLSerializer
+# uninitialized constant Bundler::YAMLSerializer
+# wrong constant name configure_gem_home_and_path
+# wrong constant name most_specific_locked_platform?
+# wrong constant name original_exec
+# wrong constant name original_system
+# wrong constant name preferred_gemfile_name
+# wrong constant name reset_settings_and_root!
+# wrong constant name self_manager
+# wrong constant name unbundled_env
+# wrong constant name unbundled_exec
+# wrong constant name unbundled_system
+# wrong constant name a
+# wrong constant name base
+# wrong constant name blockquote
+# wrong constant name caption
+# wrong constant name checkbox
+# wrong constant name checkbox_group
+# wrong constant name file_field
+# wrong constant name form
+# wrong constant name hidden
+# wrong constant name html
+# wrong constant name image_button
+# wrong constant name img
+# wrong constant name multipart_form
+# wrong constant name password_field
+# wrong constant name popup_menu
+# wrong constant name radio_button
+# wrong constant name radio_group
+# wrong constant name reset
+# wrong constant name scrolling_list
+# wrong constant name submit
+# wrong constant name text_field
+# wrong constant name textarea
+# wrong constant name <static-init>
+# uninitialized constant CMath
+# uninitialized constant CMath
+# uninitialized constant CSV
+# uninitialized constant CSV
+# wrong constant name json_creatable?
+# uninitialized constant CodeRay::Encoders::Terminal::DEFAULT_OPTIONS
+# uninitialized constant CodeRay::Scanners::Java::DEFAULT_OPTIONS
+# uninitialized constant CodeRay::Scanners::Java::Id
+# uninitialized constant CodeRay::Scanners::Java::KINDS_NOT_LOC
+# uninitialized constant CodeRay::Scanners::Java::SCANNER_STATE_INFO
+# uninitialized constant CodeRay::Scanners::Java::SCAN_ERROR_MESSAGE
+# uninitialized constant CodeRay::Scanners::Java::Version
+# Did you mean?  CodeRay::VERSION
+# uninitialized constant CodeRay::Scanners::Scanner::Id
+# uninitialized constant CodeRay::Scanners::Scanner::Version
+# Did you mean?  CodeRay::VERSION
+# wrong constant name initialize
+# wrong constant name render
+# wrong constant name render_command
+# wrong constant name <static-init>
+# wrong constant name template
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# uninitialized constant Continuation
+# uninitialized constant Continuation
+# uninitialized constant Coverage
+# uninitialized constant Coverage
+# uninitialized constant DBM
+# uninitialized constant DBM
+# uninitialized constant DBMError
+# uninitialized constant DBMError
+# wrong constant name _dump
+# wrong constant name _load
+# wrong constant name alive?
+# wrong constant name close
+# wrong constant name initialize
+# wrong constant name send_message
+# wrong constant name uri
+# wrong constant name make_pool
+# wrong constant name open
+# wrong constant name stop_pool
+# wrong constant name dump
+# wrong constant name initialize
+# wrong constant name load
+# wrong constant name recv_reply
+# wrong constant name recv_request
+# wrong constant name send_reply
+# wrong constant name send_request
+# wrong constant name ==
+# wrong constant name eql?
+# wrong constant name initialize
+# wrong constant name prepare_backtrace
+# wrong constant name with_friend
+# wrong constant name auto_load
+# wrong constant name initialize
+# wrong constant name <Class:InvokeMethod>
+# wrong constant name <Class:InvokeMethod18Mixin>
+# wrong constant name initialize
+# wrong constant name safe_level
+# wrong constant name initialize
+# wrong constant name perform
+# wrong constant name <static-init>
+# wrong constant name block_yield
+# wrong constant name perform_with_block
+# wrong constant name <static-init>
+# wrong constant name default_safe_level
+# wrong constant name make_config
+# wrong constant name accept
+# wrong constant name alive?
+# wrong constant name close
+# wrong constant name initialize
+# wrong constant name peeraddr
+# wrong constant name recv_reply
+# wrong constant name recv_request
+# wrong constant name send_reply
+# wrong constant name send_request
+# wrong constant name set_sockopt
+# wrong constant name shutdown
+# wrong constant name stream
+# wrong constant name uri
+# wrong constant name getservername
+# wrong constant name open
+# wrong constant name open_server
+# wrong constant name open_server_inaddr_any
+# wrong constant name parse_uri
+# wrong constant name uri_option
+# wrong constant name ==
+# wrong constant name eql?
+# wrong constant name initialize
+# wrong constant name option
+# wrong constant name <static-init>
+# wrong constant name _dump
+# wrong constant name _dump
+# wrong constant name _load
+# wrong constant name _dump
+# wrong constant name initialize
+# wrong constant name _load
+# wrong constant name _execute
+# wrong constant name alive?
+# wrong constant name initialize
+# wrong constant name kill
+# wrong constant name method_missing
+# wrong constant name <static-init>
+# wrong constant name mutex
+# wrong constant name infinite?
+# wrong constant name initialize
+# wrong constant name class_name
+# wrong constant name class_names
+# wrong constant name corrections
+# wrong constant name initialize
+# wrong constant name scopes
+# wrong constant name call
+# wrong constant name <static-init>
+# wrong constant name corrections
+# wrong constant name original_message
+# wrong constant name spell_checker
+# wrong constant name to_s
+# uninitialized constant DidYouMean::Formatter
+# uninitialized constant DidYouMean::Formatter
+# wrong constant name distance
+# wrong constant name distance
+# wrong constant name corrections
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name distance
+# wrong constant name min3
+# wrong constant name corrections
+# wrong constant name initialize
+# wrong constant name method_name
+# wrong constant name method_names
+# wrong constant name names_to_exclude
+# wrong constant name receiver
+# wrong constant name corrections
+# wrong constant name initialize
+# wrong constant name call
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name message_for
+# wrong constant name <static-init>
+# wrong constant name augment
+# wrong constant name correct
+# wrong constant name dictionary
+# wrong constant name dimensions
+# wrong constant name initialize
+# wrong constant name separator
+# wrong constant name <static-init>
+# wrong constant name corrections
+# wrong constant name cvar_names
+# wrong constant name initialize
+# wrong constant name ivar_names
+# wrong constant name lvar_names
+# wrong constant name method_names
+# wrong constant name name
+# wrong constant name correct_error
+# wrong constant name formatter
+# wrong constant name formatter=
+# wrong constant name children
+# wrong constant name each_child
+# wrong constant name exists?
+# wrong constant name def_method
+# wrong constant name def_module
+# wrong constant name _dump
+# wrong constant name initialize
+# wrong constant name _load
+# wrong constant name sum
+# wrong constant name +
+# wrong constant name <Class:ArithmeticSequence>
+# wrong constant name <Class:Chain>
+# wrong constant name <Class:Producer>
+# wrong constant name each_with_index
+# uninitialized constant Enumerator::ArithmeticSequence::Elem
+# wrong constant name begin
+# wrong constant name each
+# wrong constant name end
+# wrong constant name exclude_end?
+# wrong constant name last
+# wrong constant name step
+# wrong constant name <static-init>
+# uninitialized constant Enumerator::Chain::Elem
+# wrong constant name <static-init>
+# wrong constant name each
+# wrong constant name initialize
+# wrong constant name eager
+# wrong constant name each
+# wrong constant name <static-init>
+# wrong constant name to_proc
+# wrong constant name produce
+# wrong constant name <static-init>
+# wrong constant name gid
+# wrong constant name gid=
+# wrong constant name mem
+# wrong constant name mem=
+# wrong constant name name
+# wrong constant name name=
+# wrong constant name passwd
+# wrong constant name passwd=
+# wrong constant name []
+# wrong constant name each
+# wrong constant name members
+# wrong constant name <Class:Group>
+# wrong constant name dir=
+# wrong constant name gecos
+# wrong constant name gecos=
+# wrong constant name gid=
+# wrong constant name name=
+# wrong constant name passwd=
+# wrong constant name shell=
+# wrong constant name uid=
+# wrong constant name []
+# wrong constant name each
+# wrong constant name members
+# wrong constant name <Class:Passwd>
+# uninitialized constant Exception2MessageMapper
+# uninitialized constant Exception2MessageMapper
+# wrong constant name <static-init>
+# uninitialized constant Fcntl
+# uninitialized constant Fcntl
+# wrong constant name initialize
+# uninitialized constant Fiddle
+# Did you mean?  File
+# uninitialized constant Fiddle
+# Did you mean?  File
+# wrong constant name absolute_path?
+# wrong constant name exists?
+# uninitialized constant FileUtils::DryRun::LN_SUPPORTED
+# Did you mean?  FileUtils::LN_SUPPORTED
+# uninitialized constant FileUtils::DryRun::RUBY
+# Did you mean?  FileUtils::RUBY
+# uninitialized constant FileUtils::DryRun::VERSION
+# Did you mean?  FileUtils::VERSION
+# uninitialized constant FileUtils::NoWrite::LN_SUPPORTED
+# Did you mean?  FileUtils::LN_SUPPORTED
+# uninitialized constant FileUtils::NoWrite::RUBY
+# Did you mean?  FileUtils::RUBY
+# uninitialized constant FileUtils::NoWrite::VERSION
+# Did you mean?  FileUtils::VERSION
+# uninitialized constant FileUtils::Verbose::LN_SUPPORTED
+# Did you mean?  FileUtils::LN_SUPPORTED
+# uninitialized constant FileUtils::Verbose::RUBY
+# Did you mean?  FileUtils::RUBY
+# uninitialized constant FileUtils::Verbose::VERSION
+# Did you mean?  FileUtils::VERSION
+# wrong constant name _compile_method
+# wrong constant name _delegator_method
+# wrong constant name _valid_method?
+# wrong constant name debug
+# wrong constant name debug=
+# wrong constant name receiver
+# wrong constant name garbage_collect
+# wrong constant name verify_transient_heap_internal_consistency
+# uninitialized constant GDBM
+# uninitialized constant GDBM
+# uninitialized constant GDBMError
+# uninitialized constant GDBMError
+# uninitialized constant GDBMFatalError
+# uninitialized constant GDBMFatalError
+# wrong constant name <Class:RuntimeRequirementNotMetError>
+# wrong constant name <Class:SpecFetcher>
+# wrong constant name <Class:SpecificationPolicy>
+# wrong constant name <Class:UninstallError>
+# uninitialized constant Gem::AvailableSet
+# uninitialized constant Gem::AvailableSet
+# uninitialized constant Gem::DependencyInstaller
+# Did you mean?  Gem::DependencyList
+# uninitialized constant Gem::DependencyInstaller
+# Did you mean?  Gem::DependencyList
+# wrong constant name <static-init>
+# uninitialized constant Gem::Ext::ExtConfBuilder::CHDIR_MONITOR
+# uninitialized constant Gem::Ext::ExtConfBuilder::CHDIR_MUTEX
+# wrong constant name <static-init>
+# wrong constant name build
+# wrong constant name get_relative_path
+# wrong constant name copy_to
+# wrong constant name data_mode
+# wrong constant name data_mode=
+# wrong constant name dir_mode
+# wrong constant name dir_mode=
+# wrong constant name extract_files
+# wrong constant name initialize
+# wrong constant name prog_mode
+# wrong constant name prog_mode=
+# wrong constant name spec
+# wrong constant name spec=
+# wrong constant name <static-init>
+# wrong constant name home
+# wrong constant name initialize
+# wrong constant name path
+# wrong constant name spec_cache_dir
+# wrong constant name match_gem?
+# wrong constant name match_spec?
+# wrong constant name <Class:CorrectHashForLambdaOperator>
+# wrong constant name <Class:OrderIndependentComparison>
+# wrong constant name hash
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name _requirements_sorted?
+# wrong constant name _with_sorted_requirements
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name add_edge_no_circular
+# wrong constant name add_vertex
+# wrong constant name delete_edge
+# wrong constant name detach_vertex_named
+# wrong constant name each
+# wrong constant name pop!
+# wrong constant name reverse_each
+# wrong constant name rewind_to
+# wrong constant name set_payload
+# wrong constant name tag
+# wrong constant name <static-init>
+# uninitialized constant Gem::Resolver::Molinillo::DependencyGraph::Log::Elem
+# wrong constant name suggestion
+# wrong constant name suggestion=
+# wrong constant name <static-init>
+# wrong constant name available_specs
+# wrong constant name detect
+# wrong constant name initialize
+# wrong constant name latest_specs
+# wrong constant name prerelease_specs
+# wrong constant name search_for_dependency
+# wrong constant name sources
+# wrong constant name spec_for_dependency
+# wrong constant name specs
+# wrong constant name suggest_gems_from_name
+# wrong constant name tuples_for
+# wrong constant name <static-init>
+# wrong constant name fetcher
+# wrong constant name fetcher=
+# wrong constant name <=>
+# uninitialized constant Gem::Specification::GENERICS
+# uninitialized constant Gem::Specification::GENERIC_CACHE
+# wrong constant name deleted_gem?
+# wrong constant name removed_method_calls
+# wrong constant name to_ruby
+# wrong constant name initialize
+# wrong constant name packaging
+# wrong constant name packaging=
+# wrong constant name validate
+# wrong constant name validate_dependencies
+# wrong constant name validate_metadata
+# wrong constant name validate_permissions
+# wrong constant name <static-init>
+# uninitialized constant Gem::Stream
+# Did you mean?  Gem::StreamUI
+# uninitialized constant Gem::Stream
+# Did you mean?  Gem::StreamUI
+# wrong constant name _deprecated_debug
+# wrong constant name build_extensions
+# wrong constant name extensions
+# wrong constant name initialize
+# wrong constant name missing_extensions?
+# wrong constant name valid?
+# wrong constant name extensions
+# wrong constant name full_name
+# wrong constant name initialize
+# wrong constant name name
+# wrong constant name platform
+# wrong constant name require_paths
+# wrong constant name version
+# wrong constant name default_gemspec_stub
+# wrong constant name gemspec_stub
+# wrong constant name spec
+# wrong constant name spec=
+# wrong constant name <static-init>
+# wrong constant name activated_gem_paths
+# uninitialized constant GetoptLong
+# uninitialized constant GetoptLong
+# wrong constant name deconstruct_keys
+# wrong constant name create
+# wrong constant name ruby2_keywords_hash
+# wrong constant name ruby2_keywords_hash?
+# wrong constant name try_convert
+# Bad color or uninitialized constant BASIC_COLORS
+# Bad color or uninitialized constant BLACK
+# Bad color or uninitialized constant BLACK_STYLE
+# Bad color or uninitialized constant BLINK
+# Bad color or uninitialized constant BLINK_STYLE
+# Bad color or uninitialized constant BLUE
+# Bad color or uninitialized constant BLUE_STYLE
+# Bad color or uninitialized constant BOLD
+# Bad color or uninitialized constant BOLD_STYLE
+# Bad color or uninitialized constant BRIGHT_BLACK
+# Bad color or uninitialized constant BRIGHT_BLACK_STYLE
+# Bad color or uninitialized constant BRIGHT_BLUE
+# Bad color or uninitialized constant BRIGHT_BLUE_STYLE
+# Bad color or uninitialized constant BRIGHT_CYAN
+# Bad color or uninitialized constant BRIGHT_CYAN_STYLE
+# Bad color or uninitialized constant BRIGHT_GRAY
+# Bad color or uninitialized constant BRIGHT_GRAY_STYLE
+# Bad color or uninitialized constant BRIGHT_GREEN
+# Bad color or uninitialized constant BRIGHT_GREEN_STYLE
+# Bad color or uninitialized constant BRIGHT_GREY
+# Bad color or uninitialized constant BRIGHT_GREY_STYLE
+# Bad color or uninitialized constant BRIGHT_MAGENTA
+# Bad color or uninitialized constant BRIGHT_MAGENTA_STYLE
+# Bad color or uninitialized constant BRIGHT_NONE
+# Bad color or uninitialized constant BRIGHT_NONE_STYLE
+# Bad color or uninitialized constant BRIGHT_RED
+# Bad color or uninitialized constant BRIGHT_RED_STYLE
+# Bad color or uninitialized constant BRIGHT_WHITE
+# Bad color or uninitialized constant BRIGHT_WHITE_STYLE
+# Bad color or uninitialized constant BRIGHT_YELLOW
+# Bad color or uninitialized constant BRIGHT_YELLOW_STYLE
+# Bad color or uninitialized constant CLEAR
+# Bad color or uninitialized constant CLEAR_STYLE
+# Bad color or uninitialized constant COLORS
+# Bad color or uninitialized constant COLOR_LIST
+# Bad color or uninitialized constant CONCEALED
+# Bad color or uninitialized constant CONCEALED_STYLE
+# Bad color or uninitialized constant CYAN
+# Bad color or uninitialized constant CYAN_STYLE
+# Bad color or uninitialized constant DARK
+# Bad color or uninitialized constant DARK_STYLE
+# Bad color or uninitialized constant ERASE_CHAR
+# Bad color or uninitialized constant ERASE_CHAR_STYLE
+# Bad color or uninitialized constant ERASE_LINE
+# Bad color or uninitialized constant ERASE_LINE_STYLE
+# Bad color or uninitialized constant GRAY
+# Bad color or uninitialized constant GRAY_STYLE
+# Bad color or uninitialized constant GREEN
+# Bad color or uninitialized constant GREEN_STYLE
+# Bad color or uninitialized constant GREY
+# Bad color or uninitialized constant GREY_STYLE
+# Bad color or uninitialized constant LIGHT_BLACK
+# Bad color or uninitialized constant LIGHT_BLACK_STYLE
+# Bad color or uninitialized constant LIGHT_BLUE
+# Bad color or uninitialized constant LIGHT_BLUE_STYLE
+# Bad color or uninitialized constant LIGHT_CYAN
+# Bad color or uninitialized constant LIGHT_CYAN_STYLE
+# Bad color or uninitialized constant LIGHT_GRAY
+# Bad color or uninitialized constant LIGHT_GRAY_STYLE
+# Bad color or uninitialized constant LIGHT_GREEN
+# Bad color or uninitialized constant LIGHT_GREEN_STYLE
+# Bad color or uninitialized constant LIGHT_GREY
+# Bad color or uninitialized constant LIGHT_GREY_STYLE
+# Bad color or uninitialized constant LIGHT_MAGENTA
+# Bad color or uninitialized constant LIGHT_MAGENTA_STYLE
+# Bad color or uninitialized constant LIGHT_NONE
+# Bad color or uninitialized constant LIGHT_NONE_STYLE
+# Bad color or uninitialized constant LIGHT_RED
+# Bad color or uninitialized constant LIGHT_RED_STYLE
+# Bad color or uninitialized constant LIGHT_WHITE
+# Bad color or uninitialized constant LIGHT_WHITE_STYLE
+# Bad color or uninitialized constant LIGHT_YELLOW
+# Bad color or uninitialized constant LIGHT_YELLOW_STYLE
+# Bad color or uninitialized constant MAGENTA
+# Bad color or uninitialized constant MAGENTA_STYLE
+# Bad color or uninitialized constant NONE
+# Bad color or uninitialized constant NONE_STYLE
+# Bad color or uninitialized constant ON_BLACK
+# Bad color or uninitialized constant ON_BLACK_STYLE
+# Bad color or uninitialized constant ON_BLUE
+# Bad color or uninitialized constant ON_BLUE_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_BLACK
+# Bad color or uninitialized constant ON_BRIGHT_BLACK_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_BLUE
+# Bad color or uninitialized constant ON_BRIGHT_BLUE_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_CYAN
+# Bad color or uninitialized constant ON_BRIGHT_CYAN_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_GRAY
+# Bad color or uninitialized constant ON_BRIGHT_GRAY_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_GREEN
+# Bad color or uninitialized constant ON_BRIGHT_GREEN_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_GREY
+# Bad color or uninitialized constant ON_BRIGHT_GREY_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_MAGENTA
+# Bad color or uninitialized constant ON_BRIGHT_MAGENTA_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_NONE
+# Bad color or uninitialized constant ON_BRIGHT_NONE_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_RED
+# Bad color or uninitialized constant ON_BRIGHT_RED_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_WHITE
+# Bad color or uninitialized constant ON_BRIGHT_WHITE_STYLE
+# Bad color or uninitialized constant ON_BRIGHT_YELLOW
+# Bad color or uninitialized constant ON_BRIGHT_YELLOW_STYLE
+# Bad color or uninitialized constant ON_CYAN
+# Bad color or uninitialized constant ON_CYAN_STYLE
+# Bad color or uninitialized constant ON_GRAY
+# Bad color or uninitialized constant ON_GRAY_STYLE
+# Bad color or uninitialized constant ON_GREEN
+# Bad color or uninitialized constant ON_GREEN_STYLE
+# Bad color or uninitialized constant ON_GREY
+# Bad color or uninitialized constant ON_GREY_STYLE
+# Bad color or uninitialized constant ON_LIGHT_BLACK
+# Bad color or uninitialized constant ON_LIGHT_BLACK_STYLE
+# Bad color or uninitialized constant ON_LIGHT_BLUE
+# Bad color or uninitialized constant ON_LIGHT_BLUE_STYLE
+# Bad color or uninitialized constant ON_LIGHT_CYAN
+# Bad color or uninitialized constant ON_LIGHT_CYAN_STYLE
+# Bad color or uninitialized constant ON_LIGHT_GRAY
+# Bad color or uninitialized constant ON_LIGHT_GRAY_STYLE
+# Bad color or uninitialized constant ON_LIGHT_GREEN
+# Bad color or uninitialized constant ON_LIGHT_GREEN_STYLE
+# Bad color or uninitialized constant ON_LIGHT_GREY
+# Bad color or uninitialized constant ON_LIGHT_GREY_STYLE
+# Bad color or uninitialized constant ON_LIGHT_MAGENTA
+# Bad color or uninitialized constant ON_LIGHT_MAGENTA_STYLE
+# Bad color or uninitialized constant ON_LIGHT_NONE
+# Bad color or uninitialized constant ON_LIGHT_NONE_STYLE
+# Bad color or uninitialized constant ON_LIGHT_RED
+# Bad color or uninitialized constant ON_LIGHT_RED_STYLE
+# Bad color or uninitialized constant ON_LIGHT_WHITE
+# Bad color or uninitialized constant ON_LIGHT_WHITE_STYLE
+# Bad color or uninitialized constant ON_LIGHT_YELLOW
+# Bad color or uninitialized constant ON_LIGHT_YELLOW_STYLE
+# Bad color or uninitialized constant ON_MAGENTA
+# Bad color or uninitialized constant ON_MAGENTA_STYLE
+# Bad color or uninitialized constant ON_NONE
+# Bad color or uninitialized constant ON_NONE_STYLE
+# Bad color or uninitialized constant ON_RED
+# Bad color or uninitialized constant ON_RED_STYLE
+# Bad color or uninitialized constant ON_WHITE
+# Bad color or uninitialized constant ON_WHITE_STYLE
+# Bad color or uninitialized constant ON_YELLOW
+# Bad color or uninitialized constant ON_YELLOW_STYLE
+# Bad color or uninitialized constant RED
+# Bad color or uninitialized constant RED_STYLE
+# Bad color or uninitialized constant RESET
+# Bad color or uninitialized constant RESET_STYLE
+# Bad color or uninitialized constant REVERSE
+# Bad color or uninitialized constant REVERSE_STYLE
+# Bad color or uninitialized constant STYLES
+# Bad color or uninitialized constant STYLE_LIST
+# Bad color or uninitialized constant UNDERLINE
+# Bad color or uninitialized constant UNDERLINE_STYLE
+# Bad color or uninitialized constant UNDERSCORE
+# Bad color or uninitialized constant UNDERSCORE_STYLE
+# Bad color or uninitialized constant WHITE
+# Bad color or uninitialized constant WHITE_STYLE
+# Bad color or uninitialized constant YELLOW
+# Bad color or uninitialized constant YELLOW_STYLE
+# wrong constant name <Class:ConsoleMode>
+# wrong constant name beep
+# wrong constant name check_winsize_changed
+# wrong constant name clear_screen
+# wrong constant name console_mode
+# wrong constant name console_mode=
+# wrong constant name cooked
+# wrong constant name cooked!
+# wrong constant name cursor
+# wrong constant name cursor=
+# wrong constant name cursor_down
+# wrong constant name cursor_left
+# wrong constant name cursor_right
+# wrong constant name cursor_up
+# wrong constant name echo=
+# wrong constant name echo?
+# wrong constant name erase_line
+# wrong constant name erase_screen
+# wrong constant name getch
+# wrong constant name getpass
+# wrong constant name goto
+# wrong constant name goto_column
+# wrong constant name iflush
+# wrong constant name ioflush
+# wrong constant name noecho
+# wrong constant name nonblock
+# wrong constant name nonblock=
+# wrong constant name nonblock?
+# wrong constant name nread
+# wrong constant name oflush
+# wrong constant name pathconf
+# wrong constant name pressed?
+# wrong constant name raw
+# wrong constant name raw!
+# wrong constant name ready?
+# wrong constant name scroll_backward
+# wrong constant name scroll_forward
+# wrong constant name set_encoding_by_bom
+# wrong constant name wait
+# wrong constant name wait_readable
+# wrong constant name wait_writable
+# wrong constant name winsize
+# wrong constant name winsize=
+# wrong constant name echo=
+# wrong constant name raw
+# wrong constant name raw!
+# wrong constant name <static-init>
+# wrong constant name console
+# wrong constant name console_size
+# wrong constant name default_console_size
+# wrong constant name ==
+# wrong constant name initialize
+# uninitialized constant IRB
+# Did you mean?  DRb
+#                ERB
+# uninitialized constant IRB
+# Did you mean?  DRb
+#                ERB
+# wrong constant name to_bn
+# wrong constant name from_state
+# wrong constant name initialize
+# uninitialized constant Jacobian
+# uninitialized constant Jacobian
+# uninitialized constant Kconv
+# uninitialized constant Kconv
+# wrong constant name itself
+# wrong constant name object_id
+# wrong constant name pretty_inspect
+# wrong constant name then
+# wrong constant name yield_self
+# wrong constant name at_exit
+# uninitialized constant LUSolve
+# uninitialized constant LUSolve
+# uninitialized constant Logger
+# uninitialized constant Logger
+# uninitialized constant Matrix
+# uninitialized constant Matrix
+# uninitialized constant MessagePack
+# uninitialized constant MessagePack
+# wrong constant name enter
+# wrong constant name exit
+# wrong constant name mon_check_owner
+# wrong constant name mon_enter
+# wrong constant name mon_exit
+# wrong constant name mon_locked?
+# wrong constant name mon_owned?
+# wrong constant name mon_synchronize
+# wrong constant name mon_try_enter
+# wrong constant name new_cond
+# wrong constant name synchronize
+# wrong constant name try_enter
+# wrong constant name try_mon_enter
+# wrong constant name wait_for_cond
+# wrong constant name initialize
+# wrong constant name initialize
+# uninitialized constant MonitorMixin::ConditionVariable::Timeout
+# uninitialized constant MonitorMixin::ConditionVariable::Timeout
+# uninitialized constant Mutex_m
+# uninitialized constant Mutex_m
+# uninitialized constant NKF
+# uninitialized constant NKF
+# uninitialized constant Net::DNS
+# uninitialized constant Net::DNS
+# uninitialized constant Net::FTP
+# uninitialized constant Net::FTP
+# uninitialized constant Net::FTPConnectionError
+# uninitialized constant Net::FTPConnectionError
+# uninitialized constant Net::FTPError
+# Did you mean?  Net::HTTPError
+# uninitialized constant Net::FTPError
+# Did you mean?  Net::HTTPError
+# uninitialized constant Net::FTPPermError
+# Did you mean?  FiberError
+# uninitialized constant Net::FTPPermError
+# Did you mean?  FiberError
+# uninitialized constant Net::FTPProtoError
+# uninitialized constant Net::FTPProtoError
+# uninitialized constant Net::FTPReplyError
+# uninitialized constant Net::FTPReplyError
+# uninitialized constant Net::FTPTempError
+# Did you mean?  TypeError
+# uninitialized constant Net::FTPTempError
+# Did you mean?  TypeError
+# uninitialized constant Net::HTTP::DigestAuth
+# uninitialized constant Net::HTTP::DigestAuth
+# uninitialized constant Net::IMAP
+# uninitialized constant Net::IMAP
+# uninitialized constant Net::NTLM
+# uninitialized constant Net::NTLM
+# uninitialized constant Net::SMTP
+# uninitialized constant Net::SMTP
+# uninitialized constant Net::SMTPAuthenticationError
+# uninitialized constant Net::SMTPAuthenticationError
+# uninitialized constant Net::SMTPError
+# Did you mean?  Net::HTTPError
+# uninitialized constant Net::SMTPError
+# Did you mean?  Net::HTTPError
+# uninitialized constant Net::SMTPFatalError
+# Did you mean?  Net::ProtoFatalError
+#                Net::HTTPFatalError
+# uninitialized constant Net::SMTPFatalError
+# Did you mean?  Net::ProtoFatalError
+#                Net::HTTPFatalError
+# uninitialized constant Net::SMTPServerBusy
+# uninitialized constant Net::SMTPServerBusy
+# uninitialized constant Net::SMTPSyntaxError
+# Did you mean?  Net::ProtoSyntaxError
+# uninitialized constant Net::SMTPSyntaxError
+# Did you mean?  Net::ProtoSyntaxError
+# uninitialized constant Net::SMTPUnknownError
+# uninitialized constant Net::SMTPUnknownError
+# uninitialized constant Net::SMTPUnsupportedCommand
+# uninitialized constant Net::SMTPUnsupportedCommand
+# uninitialized constant Newton
+# uninitialized constant Newton
+# wrong constant name <static-init>
+# uninitialized constant RUBYGEMS_ACTIVATION_MONITOR
+# wrong constant name to_yaml
+# wrong constant name yaml_tag
+# wrong constant name <Class:Object>
+# uninitialized constant Observable
+# uninitialized constant Observable
+# wrong constant name indefinite_length
+# wrong constant name indefinite_length=
+# wrong constant name +@
+# wrong constant name -@
+# wrong constant name /
+# wrong constant name negative?
+# uninitialized constant OpenSSL::Digest::DSS
+# uninitialized constant OpenSSL::Digest::DSS
+# uninitialized constant OpenSSL::Digest::DSS1
+# uninitialized constant OpenSSL::Digest::DSS1
+# uninitialized constant OpenSSL::Digest::SHA
+# Did you mean?  OpenSSL::Digest::SHA1
+# uninitialized constant OpenSSL::Digest::SHA
+# Did you mean?  OpenSSL::Digest::SHA1
+# wrong constant name <Class:KDFError>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name hkdf
+# wrong constant name pbkdf2_hmac
+# wrong constant name scrypt
+# wrong constant name signed?
+# uninitialized constant OpenSSL::PKCS5::PKCS5Error
+# uninitialized constant OpenSSL::PKCS5::PKCS5Error
+# wrong constant name to_octet_string
+# wrong constant name alpn_protocols
+# wrong constant name alpn_protocols=
+# wrong constant name alpn_select_cb
+# wrong constant name alpn_select_cb=
+# wrong constant name enable_fallback_scsv
+# wrong constant name max_version=
+# wrong constant name min_version=
+# uninitialized constant OpenSSL::SSL::SSLSocket::BLOCK_SIZE
+# wrong constant name alpn_protocol
+# wrong constant name tmp_key
+# wrong constant name ==
+# wrong constant name ==
+# wrong constant name ==
+# wrong constant name to_utf8
+# wrong constant name ==
+# wrong constant name ==
+# wrong constant name to_der
+# wrong constant name fips_mode
+# uninitialized constant OpenURI
+# Did you mean?  Open3
+# uninitialized constant OpenURI
+# Did you mean?  Open3
+# wrong constant name additional_message
+# wrong constant name get_candidates
+# wrong constant name additional
+# wrong constant name additional=
+# uninitialized constant Opus
+# uninitialized constant Opus
+# wrong constant name multiply_with_an_object!
+# uninitialized constant PStore
+# uninitialized constant PStore
+# uninitialized constant PTY
+# Did you mean?  Pry
+# uninitialized constant PTY
+# Did you mean?  Pry
+# uninitialized constant PackageSpec
+# uninitialized constant PackageSpec
+# wrong constant name <Class:PackageSpec>
+# wrong constant name initialize
+# wrong constant name value
+# wrong constant name flat_map
+# wrong constant name <Class:ConflictResolver>
+# wrong constant name <Class:Conversion>
+# wrong constant name <Class:Debugging>
+# wrong constant name <Class:DetachedRbiGenerator>
+# wrong constant name <Class:DetachedRbsGenerator>
+# wrong constant name <Class:Generator>
+# wrong constant name <Class:Options>
+# wrong constant name <Class:ParseError>
+# wrong constant name <Class:Plugin>
+# wrong constant name <Class:RbiGenerator>
+# wrong constant name <Class:RbsGenerator>
+# wrong constant name <Class:TypeLoader>
+# wrong constant name <Class:TypeParser>
+# wrong constant name <Class:TypedObject>
+# wrong constant name <Class:Types>
+# wrong constant name resolve_conflicts
+# wrong constant name <static-init>
+# wrong constant name <Class:Converter>
+# wrong constant name <Class:RbiToRbs>
+# wrong constant name add_warning
+# wrong constant name warnings
+# wrong constant name <static-init>
+# wrong constant name convert_all
+# wrong constant name convert_object
+# wrong constant name initialize
+# wrong constant name rbs_gen
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <Class:Tree>
+# wrong constant name <static-init>
+# wrong constant name begin
+# wrong constant name end
+# wrong constant name here
+# wrong constant name line_prefix
+# wrong constant name text_prefix
+# wrong constant name <static-init>
+# wrong constant name debug_mode=
+# wrong constant name debug_mode?
+# wrong constant name debug_puts
+# wrong constant name name_for_debug_caller
+# wrong constant name detached!
+# wrong constant name <static-init>
+# wrong constant name detached!
+# wrong constant name <static-init>
+# wrong constant name current_plugin
+# wrong constant name current_plugin=
+# wrong constant name initialize
+# wrong constant name options
+# wrong constant name <static-init>
+# wrong constant name break_params
+# wrong constant name indented
+# wrong constant name initialize
+# wrong constant name sort_namespaces
+# wrong constant name tab_size
+# wrong constant name <static-init>
+# wrong constant name buffer
+# wrong constant name initialize
+# wrong constant name range
+# wrong constant name <static-init>
+# wrong constant name generate
+# wrong constant name initialize
+# wrong constant name strictness
+# wrong constant name strictness=
+# wrong constant name <static-init>
+# wrong constant name inherited
+# wrong constant name registered_plugins
+# wrong constant name run_plugins
+# wrong constant name <Class:Arbitrary>
+# wrong constant name <Class:Attribute>
+# wrong constant name <Class:ClassNamespace>
+# wrong constant name <Class:Constant>
+# wrong constant name <Class:EnumClassNamespace>
+# wrong constant name <Class:Extend>
+# wrong constant name <Class:Include>
+# wrong constant name <Class:Method>
+# wrong constant name <Class:ModuleNamespace>
+# wrong constant name <Class:Namespace>
+# wrong constant name <Class:Parameter>
+# wrong constant name <Class:RbiObject>
+# wrong constant name <Class:StructClassNamespace>
+# wrong constant name <Class:StructProp>
+# wrong constant name <Class:TypeAlias>
+# wrong constant name initialize
+# wrong constant name rbi
+# wrong constant name root
+# wrong constant name ==
+# wrong constant name code
+# wrong constant name code=
+# wrong constant name <static-init>
+# wrong constant name class_attribute
+# wrong constant name kind
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name abstract
+# wrong constant name superclass
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name eigen_constant
+# wrong constant name value
+# wrong constant name <static-init>
+# wrong constant name enums
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name abstract
+# wrong constant name class_method
+# wrong constant name final
+# wrong constant name implementation
+# wrong constant name overridable
+# wrong constant name override
+# wrong constant name parameters
+# wrong constant name return_type
+# wrong constant name type_parameters
+# wrong constant name <static-init>
+# wrong constant name abstract
+# wrong constant name interface
+# wrong constant name <static-init>
+# wrong constant name add_comment_to_next_child
+# wrong constant name aliases
+# wrong constant name children
+# wrong constant name constants
+# wrong constant name create_arbitrary
+# wrong constant name create_attr
+# wrong constant name create_attr_accessor
+# wrong constant name create_attr_reader
+# wrong constant name create_attr_writer
+# wrong constant name create_attribute
+# wrong constant name create_class
+# wrong constant name create_constant
+# wrong constant name create_enum_class
+# wrong constant name create_extend
+# wrong constant name create_extends
+# wrong constant name create_include
+# wrong constant name create_includes
+# wrong constant name create_method
+# wrong constant name create_module
+# wrong constant name create_struct_class
+# wrong constant name create_type_alias
+# wrong constant name extends
+# wrong constant name final
+# wrong constant name includes
+# wrong constant name path
+# wrong constant name sealed
+# wrong constant name type_aliases
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name default
+# wrong constant name generalize_from_rbi!
+# wrong constant name initialize
+# wrong constant name kind
+# wrong constant name name
+# wrong constant name name_without_kind
+# wrong constant name to_def_param
+# wrong constant name to_sig_param
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name generalize_from_rbi!
+# wrong constant name generate_rbi
+# wrong constant name generator
+# wrong constant name merge_into_self
+# wrong constant name mergeable?
+# wrong constant name <static-init>
+# wrong constant name props
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name array
+# wrong constant name default
+# wrong constant name dont_store
+# wrong constant name enum
+# wrong constant name factory
+# wrong constant name foreign
+# wrong constant name generalize_from_rbi!
+# wrong constant name immutable
+# wrong constant name initialize
+# wrong constant name name
+# wrong constant name optional
+# wrong constant name override
+# wrong constant name redaction
+# wrong constant name to_prop_call
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <Class:Arbitrary>
+# wrong constant name <Class:Attribute>
+# wrong constant name <Class:Block>
+# wrong constant name <Class:ClassNamespace>
+# wrong constant name <Class:Constant>
+# wrong constant name <Class:Extend>
+# wrong constant name <Class:Include>
+# wrong constant name <Class:InterfaceNamespace>
+# wrong constant name <Class:Method>
+# wrong constant name <Class:MethodSignature>
+# wrong constant name <Class:ModuleNamespace>
+# wrong constant name <Class:Namespace>
+# wrong constant name <Class:Parameter>
+# wrong constant name <Class:RbsObject>
+# wrong constant name <Class:TypeAlias>
+# wrong constant name initialize
+# wrong constant name rbs
+# wrong constant name root
+# wrong constant name ==
+# wrong constant name code
+# wrong constant name code=
+# wrong constant name <static-init>
+# wrong constant name kind
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name generate_rbs
+# wrong constant name initialize
+# wrong constant name required
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name superclass
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name class_method
+# wrong constant name signatures
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name block
+# wrong constant name generate_rbs
+# wrong constant name initialize
+# wrong constant name parameters
+# wrong constant name return_type
+# wrong constant name type_parameters
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name add_comment_to_next_child
+# wrong constant name aliases
+# wrong constant name children
+# wrong constant name constants
+# wrong constant name create_arbitrary
+# wrong constant name create_attr
+# wrong constant name create_attr_accessor
+# wrong constant name create_attr_reader
+# wrong constant name create_attr_writer
+# wrong constant name create_attribute
+# wrong constant name create_class
+# wrong constant name create_constant
+# wrong constant name create_extend
+# wrong constant name create_extends
+# wrong constant name create_include
+# wrong constant name create_includes
+# wrong constant name create_interface
+# wrong constant name create_method
+# wrong constant name create_module
+# wrong constant name create_type_alias
+# wrong constant name extends
+# wrong constant name includes
+# wrong constant name path
+# wrong constant name type_aliases
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name initialize
+# wrong constant name kind
+# wrong constant name name
+# wrong constant name name_without_kind
+# wrong constant name required
+# wrong constant name to_rbs_param
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name generate_rbs
+# wrong constant name generator
+# wrong constant name merge_into_self
+# wrong constant name mergeable?
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name load_file
+# wrong constant name load_project
+# wrong constant name load_source
+# wrong constant name <Class:IntermediateSig>
+# wrong constant name <Class:NodePath>
+# wrong constant name ast
+# wrong constant name ast=
+# wrong constant name body_has_modifier?
+# wrong constant name body_includes_and_extends
+# wrong constant name constant_names
+# wrong constant name generator
+# wrong constant name generator=
+# wrong constant name initialize
+# wrong constant name node_to_s
+# wrong constant name parse_all
+# wrong constant name parse_err
+# wrong constant name parse_method_into_methods
+# wrong constant name parse_node_to_type
+# wrong constant name parse_path_to_object
+# wrong constant name parse_sig_into_methods
+# wrong constant name parse_sig_into_sig
+# wrong constant name previous_sibling_sig_node?
+# wrong constant name sig_node?
+# wrong constant name unknown_node_errors
+# wrong constant name warning
+# wrong constant name zip_by
+# wrong constant name abstract
+# wrong constant name abstract=
+# wrong constant name final
+# wrong constant name final=
+# wrong constant name initialize
+# wrong constant name overridable
+# wrong constant name overridable=
+# wrong constant name override
+# wrong constant name override=
+# wrong constant name params
+# wrong constant name params=
+# wrong constant name return_type
+# wrong constant name return_type=
+# wrong constant name type_parameters
+# wrong constant name type_parameters=
+# wrong constant name <static-init>
+# wrong constant name inherited
+# wrong constant name child
+# wrong constant name indices
+# wrong constant name initialize
+# wrong constant name parent
+# wrong constant name sibling
+# wrong constant name traverse
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name from_source
+# wrong constant name parse_single_type
+# wrong constant name add_comment
+# wrong constant name add_comments
+# wrong constant name comments
+# wrong constant name describe
+# wrong constant name generate_comments
+# wrong constant name generated_by
+# wrong constant name initialize
+# wrong constant name name
+# wrong constant name <static-init>
+# wrong constant name <Class:Array>
+# wrong constant name <Class:Boolean>
+# wrong constant name <Class:Class>
+# wrong constant name <Class:Enumerable>
+# wrong constant name <Class:Enumerator>
+# wrong constant name <Class:Generic>
+# wrong constant name <Class:Hash>
+# wrong constant name <Class:Intersection>
+# wrong constant name <Class:Nilable>
+# wrong constant name <Class:Proc>
+# wrong constant name <Class:Range>
+# wrong constant name <Class:Raw>
+# wrong constant name <Class:Record>
+# wrong constant name <Class:Self>
+# wrong constant name <Class:Set>
+# wrong constant name <Class:SingleElementCollection>
+# wrong constant name <Class:Tuple>
+# wrong constant name <Class:Type>
+# wrong constant name <Class:Union>
+# wrong constant name <Class:Untyped>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name type_params
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name key
+# wrong constant name value
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name types
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <Class:Parameter>
+# wrong constant name parameters
+# wrong constant name return_type
+# wrong constant name ==
+# wrong constant name default
+# wrong constant name initialize
+# wrong constant name name
+# wrong constant name type
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name str
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name keys_to_types
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name collection_name
+# wrong constant name element
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name types
+# wrong constant name <static-init>
+# wrong constant name describe
+# wrong constant name generate_rbi
+# wrong constant name generate_rbs
+# wrong constant name initialize
+# wrong constant name to_type
+# wrong constant name <static-init>
+# wrong constant name to_type
+# wrong constant name ==
+# wrong constant name types
+# wrong constant name <static-init>
+# wrong constant name ==
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name pair_label
+# wrong constant name in_argdef
+# wrong constant name in_argdef=
+# wrong constant name in_block
+# wrong constant name in_block=
+# wrong constant name in_class
+# wrong constant name in_class=
+# wrong constant name in_def
+# wrong constant name in_def=
+# wrong constant name in_defined
+# wrong constant name in_defined=
+# wrong constant name in_kwarg
+# wrong constant name in_kwarg=
+# wrong constant name in_lambda
+# wrong constant name in_lambda=
+# uninitialized constant Parser::Ruby24::Racc_Main_Parsing_Routine
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Core_Id_C
+# Did you mean?  Parser::Ruby24::Racc_Runtime_Core_Version_C
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Core_Revision
+# Did you mean?  Parser::Ruby24::Racc_Runtime_Core_Revision_C
+#                Parser::Ruby24::Racc_Runtime_Core_Revision_R
+#                Parser::Ruby24::Racc_Runtime_Revision
+#                Parser::Ruby24::Racc_Runtime_Core_Version
+#                Parser::Ruby24::Racc_Runtime_Core_Version_C
+#                Parser::Ruby24::Racc_Runtime_Core_Version_R
+#                Parser::Ruby24::Racc_Runtime_Version
+#                Parser::Ruby24::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Core_Revision_C
+# Did you mean?  Parser::Ruby24::Racc_Runtime_Core_Revision_R
+#                Parser::Ruby24::Racc_Runtime_Revision
+#                Parser::Ruby24::Racc_Runtime_Core_Version_C
+#                Parser::Ruby24::Racc_Runtime_Core_Version_R
+#                Parser::Ruby24::Racc_Runtime_Core_Version
+#                Parser::Ruby24::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Core_Revision_R
+# Did you mean?  Parser::Ruby24::Racc_Runtime_Core_Revision_C
+#                Parser::Ruby24::Racc_Runtime_Revision
+#                Parser::Ruby24::Racc_Runtime_Core_Version_C
+#                Parser::Ruby24::Racc_Runtime_Core_Version_R
+#                Parser::Ruby24::Racc_Runtime_Core_Version
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Core_Version
+# Did you mean?  Parser::Ruby24::Racc_Runtime_Revision
+#                Parser::Ruby24::Racc_Runtime_Core_Revision
+#                Parser::Ruby24::Racc_Runtime_Core_Version_C
+#                Parser::Ruby24::Racc_Runtime_Core_Version_R
+#                Parser::Ruby24::Racc_Runtime_Core_Revision_C
+#                Parser::Ruby24::Racc_Runtime_Core_Revision_R
+#                Parser::Ruby24::Racc_Runtime_Version
+#                Parser::Ruby24::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Core_Version_C
+# Did you mean?  Parser::Ruby24::Racc_Runtime_Core_Version_R
+#                Parser::Ruby24::Racc_Runtime_Core_Revision_C
+#                Parser::Ruby24::Racc_Runtime_Core_Revision_R
+#                Parser::Ruby24::Racc_Runtime_Revision
+#                Parser::Ruby24::Racc_Runtime_Core_Revision
+#                Parser::Ruby24::Racc_Runtime_Version
+#                Parser::Ruby24::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Core_Version_R
+# Did you mean?  Parser::Ruby24::Racc_Runtime_Core_Version_C
+#                Parser::Ruby24::Racc_Runtime_Core_Revision_C
+#                Parser::Ruby24::Racc_Runtime_Core_Revision_R
+#                Parser::Ruby24::Racc_Runtime_Revision
+#                Parser::Ruby24::Racc_Runtime_Core_Revision
+#                Parser::Ruby24::Racc_Runtime_Version
+#                Parser::Ruby24::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Revision
+# Did you mean?  Parser::Ruby24::Racc_Runtime_Version
+#                Parser::Ruby24::Racc_Runtime_Core_Version
+#                Parser::Ruby24::Racc_Runtime_Core_Revision
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Type
+# uninitialized constant Parser::Ruby24::Racc_Runtime_Version
+# Did you mean?  Parser::Ruby24::Racc_Runtime_Revision
+#                Parser::Ruby24::Racc_Runtime_Core_Version
+# uninitialized constant Parser::Ruby24::Racc_YY_Parse_Method
+# wrong constant name _reduce_335
+# wrong constant name _reduce_336
+# wrong constant name _reduce_339
+# wrong constant name _reduce_345
+# wrong constant name _reduce_350
+# wrong constant name _reduce_370
+# wrong constant name _reduce_379
+# wrong constant name _reduce_390
+# wrong constant name _reduce_426
+# wrong constant name _reduce_430
+# wrong constant name _reduce_431
+# wrong constant name _reduce_436
+# wrong constant name _reduce_474
+# wrong constant name _reduce_532
+# wrong constant name _reduce_548
+# wrong constant name _reduce_549
+# wrong constant name _reduce_558
+# wrong constant name _reduce_559
+# wrong constant name _reduce_562
+# wrong constant name _reduce_563
+# wrong constant name _reduce_567
+# wrong constant name _reduce_570
+# wrong constant name _reduce_577
+# wrong constant name _reduce_578
+# wrong constant name _reduce_591
+# wrong constant name _reduce_592
+# wrong constant name _reduce_597
+# wrong constant name _reduce_598
+# wrong constant name _reduce_602
+# wrong constant name _reduce_606
+# wrong constant name local_pop
+# wrong constant name local_push
+# uninitialized constant Parser::Ruby27::Racc_Main_Parsing_Routine
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Core_Id_C
+# Did you mean?  Parser::Ruby27::Racc_Runtime_Core_Version_C
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Core_Revision
+# Did you mean?  Parser::Ruby27::Racc_Runtime_Core_Revision_C
+#                Parser::Ruby27::Racc_Runtime_Core_Revision_R
+#                Parser::Ruby27::Racc_Runtime_Revision
+#                Parser::Ruby27::Racc_Runtime_Core_Version
+#                Parser::Ruby27::Racc_Runtime_Core_Version_C
+#                Parser::Ruby27::Racc_Runtime_Core_Version_R
+#                Parser::Ruby27::Racc_Runtime_Version
+#                Parser::Ruby27::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Core_Revision_C
+# Did you mean?  Parser::Ruby27::Racc_Runtime_Core_Revision_R
+#                Parser::Ruby27::Racc_Runtime_Revision
+#                Parser::Ruby27::Racc_Runtime_Core_Version_C
+#                Parser::Ruby27::Racc_Runtime_Core_Version_R
+#                Parser::Ruby27::Racc_Runtime_Core_Version
+#                Parser::Ruby27::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Core_Revision_R
+# Did you mean?  Parser::Ruby27::Racc_Runtime_Core_Revision_C
+#                Parser::Ruby27::Racc_Runtime_Revision
+#                Parser::Ruby27::Racc_Runtime_Core_Version_C
+#                Parser::Ruby27::Racc_Runtime_Core_Version_R
+#                Parser::Ruby27::Racc_Runtime_Core_Version
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Core_Version
+# Did you mean?  Parser::Ruby27::Racc_Runtime_Revision
+#                Parser::Ruby27::Racc_Runtime_Core_Revision
+#                Parser::Ruby27::Racc_Runtime_Core_Version_C
+#                Parser::Ruby27::Racc_Runtime_Core_Version_R
+#                Parser::Ruby27::Racc_Runtime_Core_Revision_C
+#                Parser::Ruby27::Racc_Runtime_Core_Revision_R
+#                Parser::Ruby27::Racc_Runtime_Version
+#                Parser::Ruby27::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Core_Version_C
+# Did you mean?  Parser::Ruby27::Racc_Runtime_Core_Version_R
+#                Parser::Ruby27::Racc_Runtime_Core_Revision_C
+#                Parser::Ruby27::Racc_Runtime_Core_Revision_R
+#                Parser::Ruby27::Racc_Runtime_Revision
+#                Parser::Ruby27::Racc_Runtime_Core_Revision
+#                Parser::Ruby27::Racc_Runtime_Version
+#                Parser::Ruby27::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Core_Version_R
+# Did you mean?  Parser::Ruby27::Racc_Runtime_Core_Version_C
+#                Parser::Ruby27::Racc_Runtime_Core_Revision_C
+#                Parser::Ruby27::Racc_Runtime_Core_Revision_R
+#                Parser::Ruby27::Racc_Runtime_Revision
+#                Parser::Ruby27::Racc_Runtime_Core_Revision
+#                Parser::Ruby27::Racc_Runtime_Version
+#                Parser::Ruby27::Racc_Runtime_Core_Id_C
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Revision
+# Did you mean?  Parser::Ruby27::Racc_Runtime_Version
+#                Parser::Ruby27::Racc_Runtime_Core_Version
+#                Parser::Ruby27::Racc_Runtime_Core_Revision
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Type
+# uninitialized constant Parser::Ruby27::Racc_Runtime_Version
+# Did you mean?  Parser::Ruby27::Racc_Runtime_Revision
+#                Parser::Ruby27::Racc_Runtime_Core_Version
+# uninitialized constant Parser::Ruby27::Racc_YY_Parse_Method
+# wrong constant name _reduce_345
+# wrong constant name _reduce_346
+# wrong constant name _reduce_350
+# wrong constant name _reduce_354
+# wrong constant name _reduce_360
+# wrong constant name _reduce_379
+# wrong constant name _reduce_388
+# wrong constant name _reduce_398
+# wrong constant name _reduce_434
+# wrong constant name _reduce_439
+# wrong constant name _reduce_443
+# wrong constant name _reduce_448
+# wrong constant name _reduce_450
+# wrong constant name _reduce_452
+# wrong constant name _reduce_477
+# wrong constant name _reduce_486
+# wrong constant name _reduce_502
+# wrong constant name _reduce_507
+# wrong constant name _reduce_508
+# wrong constant name _reduce_509
+# wrong constant name _reduce_513
+# wrong constant name _reduce_514
+# wrong constant name _reduce_531
+# wrong constant name _reduce_532
+# wrong constant name _reduce_536
+# wrong constant name _reduce_538
+# wrong constant name _reduce_574
+# wrong constant name _reduce_575
+# wrong constant name _reduce_576
+# wrong constant name _reduce_638
+# wrong constant name _reduce_654
+# wrong constant name _reduce_655
+# wrong constant name _reduce_665
+# wrong constant name _reduce_666
+# wrong constant name _reduce_670
+# wrong constant name _reduce_674
+# wrong constant name _reduce_684
+# wrong constant name _reduce_685
+# wrong constant name _reduce_686
+# wrong constant name _reduce_699
+# wrong constant name _reduce_700
+# wrong constant name _reduce_705
+# wrong constant name _reduce_706
+# wrong constant name _reduce_707
+# wrong constant name _reduce_711
+# wrong constant name _reduce_715
+# wrong constant name local_pop
+# wrong constant name local_push
+# wrong constant name try_declare_numparam
+# wrong constant name declare_anonymous_blockarg
+# wrong constant name declared_anonymous_blockarg?
+# uninitialized constant Prime
+# uninitialized constant Prime
+# wrong constant name <<
+# wrong constant name >>
+# wrong constant name clone
+# uninitialized constant Proc0
+# uninitialized constant Proc0
+# uninitialized constant Proc1
+# uninitialized constant Proc1
+# uninitialized constant Proc10
+# uninitialized constant Proc10
+# uninitialized constant Proc2
+# uninitialized constant Proc2
+# uninitialized constant Proc3
+# uninitialized constant Proc3
+# uninitialized constant Proc4
+# uninitialized constant Proc4
+# uninitialized constant Proc5
+# uninitialized constant Proc5
+# uninitialized constant Proc6
+# uninitialized constant Proc6
+# uninitialized constant Proc7
+# uninitialized constant Proc7
+# uninitialized constant Proc8
+# uninitialized constant Proc8
+# uninitialized constant Proc9
+# uninitialized constant Proc9
+# uninitialized constant Pry::BasicObject::RUBYGEMS_ACTIVATION_MONITOR
+# uninitialized constant Pry::Command::COLORS
+# uninitialized constant Pry::Command::Ls::COLORS
+# Did you mean?  Pry::Command::COLORS
+# uninitialized constant Pry::Command::Ls::VOID_VALUE
+# Did you mean?  Pry::Command::VOID_VALUE
+# uninitialized constant Pry::Command::Wtf::COLORS
+# Did you mean?  Pry::Command::COLORS
+# uninitialized constant Pry::Command::Wtf::VOID_VALUE
+# Did you mean?  Pry::Command::VOID_VALUE
+# uninitialized constant Psych::UnsafeYAML
+# uninitialized constant Psych::UnsafeYAML
+# uninitialized constant Psych::Visitors::RestrictedYAMLTree::DISPATCH
+# wrong constant name visit_Symbol
+# wrong constant name <static-init>
+# wrong constant name dispatch_cache
+# wrong constant name add_builtin_type
+# wrong constant name add_domain_type
+# wrong constant name add_tag
+# wrong constant name domain_types
+# wrong constant name domain_types=
+# wrong constant name dump_tags
+# wrong constant name dump_tags=
+# wrong constant name libyaml_version
+# wrong constant name load_tags
+# wrong constant name load_tags=
+# wrong constant name remove_type
+# wrong constant name safe_dump
+# wrong constant name safe_load_file
+# wrong constant name unsafe_load
+# wrong constant name unsafe_load_file
+# uninitialized constant RDoc::Alias::MARKUP_FORMAT
+# uninitialized constant RDoc::Alias::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# uninitialized constant RDoc::AnyMethod::MARKUP_FORMAT
+# uninitialized constant RDoc::AnyMethod::TO_HTML_CHARACTERS
+# wrong constant name _call_seq
+# wrong constant name section_title
+# wrong constant name section_title=
+# uninitialized constant RDoc::Attr::MARKUP_FORMAT
+# uninitialized constant RDoc::Attr::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# uninitialized constant RDoc::ClassModule::MARKUP_FORMAT
+# uninitialized constant RDoc::ClassModule::TOMDOC_TITLES
+# uninitialized constant RDoc::ClassModule::TOMDOC_TITLES_SORT
+# uninitialized constant RDoc::ClassModule::TO_HTML_CHARACTERS
+# uninitialized constant RDoc::ClassModule::TYPES
+# wrong constant name initialize
+# uninitialized constant RDoc::CodeObject::MARKUP_FORMAT
+# uninitialized constant RDoc::CodeObject::TO_HTML_CHARACTERS
+# wrong constant name initialize_visibility
+# uninitialized constant RDoc::Comment::MARKUP_FORMAT
+# uninitialized constant RDoc::Comment::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# wrong constant name line
+# wrong constant name line=
+# uninitialized constant RDoc::Constant::MARKUP_FORMAT
+# uninitialized constant RDoc::Constant::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# uninitialized constant RDoc::Constant::RDoc
+# Did you mean?  RDoc::RDoc
+# uninitialized constant RDoc::Constant::RDoc
+# Did you mean?  RDoc::RDoc
+# uninitialized constant RDoc::Context::MARKUP_FORMAT
+# uninitialized constant RDoc::Context::TO_HTML_CHARACTERS
+# wrong constant name add_module_by_normal_module
+# wrong constant name initialize_methods_etc
+# wrong constant name instance_methods
+# uninitialized constant RDoc::Context::Section::MARKUP_FORMAT
+# Did you mean?  RDoc::Context::MARKUP_FORMAT
+# uninitialized constant RDoc::Context::Section::TO_HTML_CHARACTERS
+# Did you mean?  RDoc::Context::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name resolve_method
+# wrong constant name detect_encoding
+# wrong constant name remove_magic_comment
+# wrong constant name initialize
+# uninitialized constant RDoc::Generator::JsonIndex::MARKUP_FORMAT
+# uninitialized constant RDoc::Generator::JsonIndex::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name _Table
+# wrong constant name _TableColumn
+# wrong constant name _TableItem
+# wrong constant name _TableLine
+# wrong constant name _TableRow
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name <Class:RegexpHandling>
+# wrong constant name <Class:Table>
+# wrong constant name add_regexp_handling
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name add_regexp_handling
+# wrong constant name convert_attrs_matching_word_pairs
+# wrong constant name convert_attrs_word_pair_map
+# wrong constant name convert_regexp_handlings
+# wrong constant name exclusive?
+# wrong constant name exclusive_bitmap
+# wrong constant name regexp_handlings
+# wrong constant name regexp_handling
+# wrong constant name initialize
+# wrong constant name add_regexp_handling_RDOCLINK
+# wrong constant name add_regexp_handling_TIDYLINK
+# wrong constant name convert_regexp_handling
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name []
+# wrong constant name eos?
+# wrong constant name initialize
+# wrong constant name matched
+# wrong constant name newline!
+# wrong constant name pos
+# wrong constant name scan
+# wrong constant name unscan
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name ==
+# wrong constant name initialize
+# wrong constant name text
+# wrong constant name text=
+# wrong constant name type
+# wrong constant name <static-init>
+# uninitialized constant RDoc::Markup::Special
+# uninitialized constant RDoc::Markup::Special
+# wrong constant name ==
+# wrong constant name accept
+# wrong constant name align
+# wrong constant name align=
+# wrong constant name body
+# wrong constant name body=
+# wrong constant name header
+# wrong constant name header=
+# wrong constant name initialize
+# wrong constant name <static-init>
+# uninitialized constant RDoc::Markup::ToHtml::MARKUP_FORMAT
+# uninitialized constant RDoc::Markup::ToHtml::TO_HTML_CHARACTERS
+# wrong constant name accept_table
+# wrong constant name handle_regexp_HARD_BREAK
+# wrong constant name handle_regexp_HYPERLINK
+# wrong constant name handle_regexp_RDOCLINK
+# wrong constant name handle_regexp_TIDYLINK
+# wrong constant name init_link_notation_regexp_handlings
+# wrong constant name init_regexp_handlings
+# uninitialized constant RDoc::Markup::ToHtmlCrossref::LIST_TYPE_TO_HTML
+# uninitialized constant RDoc::Markup::ToHtmlCrossref::MARKUP_FORMAT
+# uninitialized constant RDoc::Markup::ToHtmlCrossref::TO_HTML_CHARACTERS
+# wrong constant name handle_regexp_CROSSREF
+# wrong constant name initialize
+# uninitialized constant RDoc::Markup::ToHtmlSnippet::LIST_TYPE_TO_HTML
+# uninitialized constant RDoc::Markup::ToHtmlSnippet::MARKUP_FORMAT
+# uninitialized constant RDoc::Markup::ToHtmlSnippet::TO_HTML_CHARACTERS
+# wrong constant name handle_regexp_CROSSREF
+# wrong constant name initialize
+# wrong constant name accept_table
+# wrong constant name initialize
+# wrong constant name handle_regexp_CROSSREF
+# wrong constant name handle_regexp_HARD_BREAK
+# wrong constant name handle_regexp_TIDYLINK
+# wrong constant name initialize
+# wrong constant name handle_regexp_RDOCLINK
+# wrong constant name handle_regexp_TIDYLINK
+# wrong constant name accept_table
+# wrong constant name handle_regexp_HARD_BREAK
+# wrong constant name handle_regexp_SUPPRESSED_CROSSREF
+# wrong constant name initialize
+# wrong constant name accept_table
+# wrong constant name initialize
+# wrong constant name initialize
+# uninitialized constant RDoc::MethodAttr::MARKUP_FORMAT
+# uninitialized constant RDoc::MethodAttr::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# uninitialized constant RDoc::Mixin::MARKUP_FORMAT
+# uninitialized constant RDoc::Mixin::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# wrong constant name override
+# wrong constant name load_options
+# wrong constant name <Class:RipperStateLex>
+# wrong constant name initialize
+# uninitialized constant RDoc::Parser::C::MARKUP_FORMAT
+# uninitialized constant RDoc::Parser::C::TO_HTML_CHARACTERS
+# wrong constant name add_alias
+# wrong constant name do_classes_and_modules
+# wrong constant name new_comment
+# wrong constant name <Class:Git>
+# wrong constant name parse_date
+# wrong constant name <Class:LogEntry>
+# wrong constant name create_entries
+# wrong constant name parse_entries
+# wrong constant name parse_info
+# uninitialized constant RDoc::Parser::ChangeLog::Git::LogEntry::Elem
+# wrong constant name accept
+# wrong constant name aref
+# wrong constant name author
+# wrong constant name author=
+# wrong constant name base
+# wrong constant name base=
+# wrong constant name commit
+# wrong constant name commit=
+# wrong constant name contents
+# wrong constant name contents=
+# wrong constant name date
+# wrong constant name date=
+# wrong constant name email
+# wrong constant name email=
+# wrong constant name initialize
+# wrong constant name label
+# wrong constant name level
+# wrong constant name text
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name <static-init>
+# wrong constant name <Class:InnerStateLex>
+# wrong constant name <Class:Token>
+# wrong constant name get_squashed_tk
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name on_default
+# wrong constant name <static-init>
+# uninitialized constant RDoc::Parser::RipperStateLex::Token::Elem
+# wrong constant name char_no
+# wrong constant name char_no=
+# wrong constant name kind
+# wrong constant name kind=
+# wrong constant name line_no
+# wrong constant name line_no=
+# wrong constant name state
+# wrong constant name state=
+# wrong constant name text
+# wrong constant name text=
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name <static-init>
+# wrong constant name end?
+# wrong constant name parse
+# wrong constant name get_included_module_with_optional_parens
+# wrong constant name parse_included_with_activesupport_concern
+# wrong constant name retrieve_comment_body
+# wrong constant name skip_tkspace_without_nl
+# uninitialized constant RDoc::RD::BlockParser::Racc_Main_Parsing_Routine
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Core_Id_C
+# Did you mean?  RDoc::RD::BlockParser::Racc_Runtime_Core_Version_C
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Core_Revision
+# Did you mean?  RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_C
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_R
+#                RDoc::RD::BlockParser::Racc_Runtime_Revision
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Version
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Version_C
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Version_R
+#                RDoc::RD::BlockParser::Racc_Runtime_Version
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_C
+# Did you mean?  RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_R
+#                RDoc::RD::BlockParser::Racc_Runtime_Revision
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Version_C
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Version_R
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Version
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_R
+# Did you mean?  RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_C
+#                RDoc::RD::BlockParser::Racc_Runtime_Revision
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Version_C
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Version_R
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Version
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Core_Version
+# Did you mean?  RDoc::RD::BlockParser::Racc_Runtime_Revision
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Revision
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Version_C
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Version_R
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_C
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_R
+#                RDoc::RD::BlockParser::Racc_Runtime_Version
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Core_Version_C
+# Did you mean?  RDoc::RD::BlockParser::Racc_Runtime_Core_Version_R
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_C
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_R
+#                RDoc::RD::BlockParser::Racc_Runtime_Revision
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Revision
+#                RDoc::RD::BlockParser::Racc_Runtime_Version
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Core_Version_R
+# Did you mean?  RDoc::RD::BlockParser::Racc_Runtime_Core_Version_C
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_C
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Revision_R
+#                RDoc::RD::BlockParser::Racc_Runtime_Revision
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Revision
+#                RDoc::RD::BlockParser::Racc_Runtime_Version
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Revision
+# Did you mean?  RDoc::RD::BlockParser::Racc_Runtime_Version
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Version
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Revision
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Type
+# uninitialized constant RDoc::RD::BlockParser::Racc_Runtime_Version
+# Did you mean?  RDoc::RD::BlockParser::Racc_Runtime_Revision
+#                RDoc::RD::BlockParser::Racc_Runtime_Core_Version
+# uninitialized constant RDoc::RD::BlockParser::Racc_YY_Parse_Method
+# wrong constant name initialize
+# uninitialized constant RDoc::RD::InlineParser::Racc_Main_Parsing_Routine
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Core_Id_C
+# Did you mean?  RDoc::RD::InlineParser::Racc_Runtime_Core_Version_C
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Core_Revision
+# Did you mean?  RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_C
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_R
+#                RDoc::RD::InlineParser::Racc_Runtime_Revision
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Version
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Version_C
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Version_R
+#                RDoc::RD::InlineParser::Racc_Runtime_Version
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_C
+# Did you mean?  RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_R
+#                RDoc::RD::InlineParser::Racc_Runtime_Revision
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Version_C
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Version_R
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Version
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_R
+# Did you mean?  RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_C
+#                RDoc::RD::InlineParser::Racc_Runtime_Revision
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Version_C
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Version_R
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Version
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Core_Version
+# Did you mean?  RDoc::RD::InlineParser::Racc_Runtime_Revision
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Revision
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Version_C
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Version_R
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_C
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_R
+#                RDoc::RD::InlineParser::Racc_Runtime_Version
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Core_Version_C
+# Did you mean?  RDoc::RD::InlineParser::Racc_Runtime_Core_Version_R
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_C
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_R
+#                RDoc::RD::InlineParser::Racc_Runtime_Revision
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Revision
+#                RDoc::RD::InlineParser::Racc_Runtime_Version
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Core_Version_R
+# Did you mean?  RDoc::RD::InlineParser::Racc_Runtime_Core_Version_C
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_C
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Revision_R
+#                RDoc::RD::InlineParser::Racc_Runtime_Revision
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Revision
+#                RDoc::RD::InlineParser::Racc_Runtime_Version
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Id_C
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Revision
+# Did you mean?  RDoc::RD::InlineParser::Racc_Runtime_Version
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Version
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Revision
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Type
+# uninitialized constant RDoc::RD::InlineParser::Racc_Runtime_Version
+# Did you mean?  RDoc::RD::InlineParser::Racc_Runtime_Revision
+#                RDoc::RD::InlineParser::Racc_Runtime_Core_Version
+# uninitialized constant RDoc::RD::InlineParser::Racc_YY_Parse_Method
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# uninitialized constant RDoc::Require::MARKUP_FORMAT
+# uninitialized constant RDoc::Require::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# uninitialized constant RDoc::RipperStateLex
+# uninitialized constant RDoc::RipperStateLex
+# wrong constant name initialize
+# uninitialized constant RDoc::Stats::MARKUP_FORMAT
+# uninitialized constant RDoc::Stats::TO_HTML_CHARACTERS
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name unmatched_constant_alias
+# wrong constant name update_parser_of_file
+# wrong constant name initialize
+# uninitialized constant RDoc::Task::DEFAULT
+# uninitialized constant RDoc::Task::LN_SUPPORTED
+# uninitialized constant RDoc::Task::LOW_METHODS
+# Did you mean?  RDoc::Task::LowMethods
+# uninitialized constant RDoc::Task::METHODS
+# Did you mean?  Method
+# uninitialized constant RDoc::Task::OPT_TABLE
+# uninitialized constant RDoc::Task::RUBY
+# uninitialized constant RDoc::Task::VERSION
+# Did you mean?  RDoc::VERSION
+# wrong constant name before_running_rdoc
+# wrong constant name check_names
+# wrong constant name clobber_task_description
+# wrong constant name defaults
+# wrong constant name define
+# wrong constant name external
+# wrong constant name external=
+# wrong constant name generator
+# wrong constant name generator=
+# wrong constant name initialize
+# wrong constant name inline_source
+# wrong constant name inline_source=
+# wrong constant name main
+# wrong constant name main=
+# wrong constant name markup
+# wrong constant name markup=
+# wrong constant name name
+# wrong constant name name=
+# wrong constant name option_list
+# wrong constant name options
+# wrong constant name options=
+# wrong constant name rdoc_dir
+# wrong constant name rdoc_dir=
+# wrong constant name rdoc_files
+# wrong constant name rdoc_files=
+# wrong constant name rdoc_task_description
+# wrong constant name rerdoc_task_description
+# wrong constant name template
+# wrong constant name template=
+# wrong constant name title
+# wrong constant name title=
+# wrong constant name <static-init>
+# wrong constant name language
+# wrong constant name language=
+# uninitialized constant RDoc::TopLevel::MARKUP_FORMAT
+# uninitialized constant RDoc::TopLevel::TOMDOC_TITLES
+# uninitialized constant RDoc::TopLevel::TOMDOC_TITLES_SORT
+# uninitialized constant RDoc::TopLevel::TO_HTML_CHARACTERS
+# uninitialized constant RDoc::TopLevel::TYPES
+# wrong constant name initialize
+# wrong constant name home
+# uninitialized constant REXML
+# uninitialized constant REXML
+# uninitialized constant RSpec::Core::ExampleGroup::BE_PREDICATE_REGEX
+# uninitialized constant RSpec::Core::ExampleGroup::DYNAMIC_MATCHER_REGEX
+# uninitialized constant RSpec::Core::ExampleGroup::HAS_REGEX
+# uninitialized constant RSpec::Core::ExampleGroup::NOT_YET_IMPLEMENTED
+# uninitialized constant RSpec::Core::ExampleGroup::NO_REASON_GIVEN
+# wrong constant name be_close_to
+# uninitialized constant RSpec::Matchers::BuiltIn::BePredicate::UNDEFINED
+# uninitialized constant RSpec::Matchers::BuiltIn::Equal::UNDEFINED
+# uninitialized constant RSpec::Matchers::BuiltIn::Has::UNDEFINED
+# wrong constant name <Class:Differ>
+# wrong constant name color?
+# wrong constant name diff
+# wrong constant name diff_as_object
+# wrong constant name diff_as_string
+# wrong constant name initialize
+# wrong constant name <static-init>
+# wrong constant name <Class:CparseParams>
+# wrong constant name <static-init>
+# uninitialized constant Ractor
+# uninitialized constant Ractor
+# uninitialized constant Rake::DSL::DEFAULT
+# uninitialized constant Rake::DSL::LN_SUPPORTED
+# uninitialized constant Rake::DSL::LOW_METHODS
+# Did you mean?  Rake::DSL::LowMethods
+# uninitialized constant Rake::DSL::METHODS
+# Did you mean?  Method
+# uninitialized constant Rake::DSL::OPT_TABLE
+# uninitialized constant Rake::DSL::RUBY
+# uninitialized constant Rake::DSL::VERSION
+# Did you mean?  Rake::Version
+#                Rake::VERSION
+# uninitialized constant Rake::FileUtilsExt::LN_SUPPORTED
+# uninitialized constant Rake::FileUtilsExt::LOW_METHODS
+# Did you mean?  Rake::FileUtilsExt::LowMethods
+# uninitialized constant Rake::FileUtilsExt::METHODS
+# Did you mean?  Method
+# uninitialized constant Rake::FileUtilsExt::OPT_TABLE
+# uninitialized constant Rake::FileUtilsExt::RUBY
+# uninitialized constant Rake::FileUtilsExt::VERSION
+# Did you mean?  Rake::Version
+#                Rake::VERSION
+# uninitialized constant Rake::TaskLib::DEFAULT
+# uninitialized constant Rake::TaskLib::LN_SUPPORTED
+# uninitialized constant Rake::TaskLib::LOW_METHODS
+# Did you mean?  Rake::TaskLib::LowMethods
+# uninitialized constant Rake::TaskLib::METHODS
+# Did you mean?  Method
+# uninitialized constant Rake::TaskLib::OPT_TABLE
+# uninitialized constant Rake::TaskLib::RUBY
+# uninitialized constant Rake::TaskLib::VERSION
+# Did you mean?  Rake::Version
+#                Rake::VERSION
+# wrong constant name bytes
+# wrong constant name %
+# wrong constant name entries
+# wrong constant name to_a
+# wrong constant name expand
+# wrong constant name fire_update!
+# wrong constant name ruby
+# uninitialized constant Rinda
+# uninitialized constant Rinda
+# wrong constant name <Class:Lexer>
+# wrong constant name <Class:TokenPattern>
+# wrong constant name column
+# wrong constant name debug_output
+# wrong constant name debug_output=
+# wrong constant name encoding
+# wrong constant name end_seen?
+# wrong constant name error?
+# wrong constant name filename
+# wrong constant name initialize
+# wrong constant name lineno
+# wrong constant name parse
+# wrong constant name state
+# wrong constant name token
+# wrong constant name yydebug
+# wrong constant name yydebug=
+# wrong constant name initialize
+# uninitialized constant Ripper::Lexer::EVENTS
+# Did you mean?  Ripper::EVENTS
+# uninitialized constant Ripper::Lexer::EXPR_ARG
+# Did you mean?  Ripper::Lexer::EXPR_BEG
+#                Ripper::EXPR_ARG
+#                Ripper::EXPR_BEG
+# uninitialized constant Ripper::Lexer::EXPR_ARG_ANY
+# Did you mean?  Ripper::Lexer::EXPR_END_ANY
+#                Ripper::Lexer::EXPR_BEG_ANY
+#                Ripper::EXPR_END_ANY
+#                Ripper::EXPR_ARG_ANY
+#                Ripper::EXPR_BEG_ANY
+# uninitialized constant Ripper::Lexer::EXPR_BEG
+# Did you mean?  Ripper::Lexer::EXPR_ARG
+#                Ripper::EXPR_ARG
+#                Ripper::EXPR_BEG
+# uninitialized constant Ripper::Lexer::EXPR_BEG_ANY
+# Did you mean?  Ripper::Lexer::EXPR_END_ANY
+#                Ripper::Lexer::EXPR_ARG_ANY
+#                Ripper::EXPR_END_ANY
+#                Ripper::EXPR_ARG_ANY
+#                Ripper::EXPR_BEG_ANY
+# uninitialized constant Ripper::Lexer::EXPR_CLASS
+# Did you mean?  Ripper::EXPR_CLASS
+# uninitialized constant Ripper::Lexer::EXPR_CMDARG
+# Did you mean?  Ripper::Lexer::EXPR_ARG
+#                Ripper::EXPR_ARG
+#                Ripper::Lexer::EXPR_ENDARG
+#                Ripper::EXPR_CMDARG
+#                Ripper::EXPR_ENDARG
+# uninitialized constant Ripper::Lexer::EXPR_DOT
+# Did you mean?  Ripper::EXPR_DOT
+# uninitialized constant Ripper::Lexer::EXPR_END
+# Did you mean?  Ripper::Lexer::EXPR_MID
+#                Ripper::EXPR_MID
+#                Ripper::EXPR_END
+#                Ripper::Lexer::EXPR_ENDFN
+#                Ripper::EXPR_ENDFN
+# uninitialized constant Ripper::Lexer::EXPR_ENDARG
+# Did you mean?  Ripper::Lexer::EXPR_ARG
+#                Ripper::EXPR_ARG
+#                Ripper::EXPR_END
+#                Ripper::Lexer::EXPR_ENDFN
+#                Ripper::EXPR_ENDFN
+#                Ripper::Lexer::EXPR_CMDARG
+#                Ripper::EXPR_CMDARG
+#                Ripper::EXPR_ENDARG
+#                Ripper::Lexer::EXPR_END_ANY
+#                Ripper::EXPR_END_ANY
+# uninitialized constant Ripper::Lexer::EXPR_ENDFN
+# Did you mean?  Ripper::EXPR_END
+#                Ripper::EXPR_ENDFN
+#                Ripper::Lexer::EXPR_ENDARG
+#                Ripper::EXPR_ENDARG
+#                Ripper::Lexer::EXPR_END_ANY
+#                Ripper::EXPR_END_ANY
+# uninitialized constant Ripper::Lexer::EXPR_END_ANY
+# Did you mean?  Ripper::Lexer::EXPR_ARG_ANY
+#                Ripper::Lexer::EXPR_BEG_ANY
+#                Ripper::EXPR_END_ANY
+#                Ripper::EXPR_ARG_ANY
+#                Ripper::EXPR_BEG_ANY
+#                Ripper::Lexer::EXPR_ENDFN
+#                Ripper::EXPR_ENDFN
+#                Ripper::Lexer::EXPR_ENDARG
+#                Ripper::EXPR_ENDARG
+# uninitialized constant Ripper::Lexer::EXPR_FITEM
+# Did you mean?  Ripper::EXPR_FITEM
+# uninitialized constant Ripper::Lexer::EXPR_FNAME
+# Did you mean?  Ripper::Lexer::EXPR_NONE
+#                Ripper::EXPR_NONE
+#                Ripper::EXPR_FNAME
+# uninitialized constant Ripper::Lexer::EXPR_LABEL
+# Did you mean?  Ripper::Lexer::EXPR_BEG
+#                Ripper::EXPR_BEG
+#                Ripper::EXPR_LABEL
+#                Ripper::Lexer::EXPR_LABELED
+#                Ripper::EXPR_LABELED
+# uninitialized constant Ripper::Lexer::EXPR_LABELED
+# Did you mean?  Ripper::EXPR_LABEL
+#                Ripper::EXPR_LABELED
+# uninitialized constant Ripper::Lexer::EXPR_MID
+# Did you mean?  Ripper::Lexer::EXPR_END
+#                Ripper::EXPR_MID
+#                Ripper::EXPR_END
+# uninitialized constant Ripper::Lexer::EXPR_NONE
+# Did you mean?  Ripper::Lexer::EXPR_DOT
+#                Ripper::Lexer::EXPR_END
+#                Ripper::EXPR_DOT
+#                Ripper::EXPR_END
+#                Ripper::EXPR_NONE
+#                Ripper::Lexer::EXPR_FNAME
+#                Ripper::EXPR_FNAME
+# uninitialized constant Ripper::Lexer::EXPR_VALUE
+# Did you mean?  Ripper::EXPR_VALUE
+# wrong constant name <Class:Elem>
+# uninitialized constant Ripper::Lexer::PARSER_EVENTS
+# Did you mean?  Ripper::PARSER_EVENTS
+# uninitialized constant Ripper::Lexer::PARSER_EVENT_TABLE
+# Did you mean?  Ripper::PARSER_EVENT_TABLE
+# uninitialized constant Ripper::Lexer::SCANNER_EVENTS
+# Did you mean?  Ripper::SCANNER_EVENTS
+# uninitialized constant Ripper::Lexer::SCANNER_EVENT_TABLE
+# Did you mean?  Ripper::SCANNER_EVENT_TABLE
+# wrong constant name <Class:State>
+# uninitialized constant Ripper::Lexer::Version
+# Did you mean?  Ripper::Version
+# wrong constant name errors
+# wrong constant name lex
+# wrong constant name scan
+# wrong constant name tokenize
+# uninitialized constant Ripper::Lexer::Elem::Elem
+# wrong constant name event
+# wrong constant name event=
+# wrong constant name initialize
+# wrong constant name message
+# wrong constant name message=
+# wrong constant name pos
+# wrong constant name pos=
+# wrong constant name state
+# wrong constant name state=
+# wrong constant name tok
+# wrong constant name tok=
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name &
+# wrong constant name ==
+# uninitialized constant Ripper::Lexer::State::Elem
+# Did you mean?  Ripper::Lexer::Elem
+# wrong constant name allbits?
+# wrong constant name anybits?
+# wrong constant name initialize
+# wrong constant name nobits?
+# wrong constant name to_i
+# wrong constant name to_int
+# wrong constant name to_int=
+# wrong constant name to_s=
+# wrong constant name |
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name members
+# wrong constant name <static-init>
+# uninitialized constant Ripper::SexpBuilder::EVENTS
+# Did you mean?  Ripper::EVENTS
+# uninitialized constant Ripper::SexpBuilder::EXPR_ARG
+# Did you mean?  Ripper::SexpBuilder::EXPR_BEG
+#                Ripper::EXPR_ARG
+#                Ripper::EXPR_BEG
+# uninitialized constant Ripper::SexpBuilder::EXPR_ARG_ANY
+# Did you mean?  Ripper::SexpBuilder::EXPR_END_ANY
+#                Ripper::SexpBuilder::EXPR_BEG_ANY
+#                Ripper::EXPR_END_ANY
+#                Ripper::EXPR_ARG_ANY
+#                Ripper::EXPR_BEG_ANY
+# uninitialized constant Ripper::SexpBuilder::EXPR_BEG
+# Did you mean?  Ripper::SexpBuilder::EXPR_ARG
+#                Ripper::EXPR_ARG
+#                Ripper::EXPR_BEG
+# uninitialized constant Ripper::SexpBuilder::EXPR_BEG_ANY
+# Did you mean?  Ripper::SexpBuilder::EXPR_END_ANY
+#                Ripper::SexpBuilder::EXPR_ARG_ANY
+#                Ripper::EXPR_END_ANY
+#                Ripper::EXPR_ARG_ANY
+#                Ripper::EXPR_BEG_ANY
+# uninitialized constant Ripper::SexpBuilder::EXPR_CLASS
+# Did you mean?  Ripper::EXPR_CLASS
+# uninitialized constant Ripper::SexpBuilder::EXPR_CMDARG
+# Did you mean?  Ripper::SexpBuilder::EXPR_ARG
+#                Ripper::EXPR_ARG
+#                Ripper::SexpBuilder::EXPR_ENDARG
+#                Ripper::EXPR_CMDARG
+#                Ripper::EXPR_ENDARG
+# uninitialized constant Ripper::SexpBuilder::EXPR_DOT
+# Did you mean?  Ripper::EXPR_DOT
+# uninitialized constant Ripper::SexpBuilder::EXPR_END
+# Did you mean?  Ripper::SexpBuilder::EXPR_MID
+#                Ripper::EXPR_MID
+#                Ripper::EXPR_END
+#                Ripper::SexpBuilder::EXPR_ENDFN
+#                Ripper::EXPR_ENDFN
+# uninitialized constant Ripper::SexpBuilder::EXPR_ENDARG
+# Did you mean?  Ripper::SexpBuilder::EXPR_ARG
+#                Ripper::EXPR_ARG
+#                Ripper::EXPR_END
+#                Ripper::SexpBuilder::EXPR_ENDFN
+#                Ripper::EXPR_ENDFN
+#                Ripper::SexpBuilder::EXPR_CMDARG
+#                Ripper::EXPR_CMDARG
+#                Ripper::EXPR_ENDARG
+#                Ripper::SexpBuilder::EXPR_END_ANY
+#                Ripper::EXPR_END_ANY
+# uninitialized constant Ripper::SexpBuilder::EXPR_ENDFN
+# Did you mean?  Ripper::EXPR_END
+#                Ripper::EXPR_ENDFN
+#                Ripper::SexpBuilder::EXPR_ENDARG
+#                Ripper::EXPR_ENDARG
+#                Ripper::SexpBuilder::EXPR_END_ANY
+#                Ripper::EXPR_END_ANY
+# uninitialized constant Ripper::SexpBuilder::EXPR_END_ANY
+# Did you mean?  Ripper::SexpBuilder::EXPR_ARG_ANY
+#                Ripper::SexpBuilder::EXPR_BEG_ANY
+#                Ripper::EXPR_END_ANY
+#                Ripper::EXPR_ARG_ANY
+#                Ripper::EXPR_BEG_ANY
+#                Ripper::SexpBuilder::EXPR_ENDFN
+#                Ripper::EXPR_ENDFN
+#                Ripper::SexpBuilder::EXPR_ENDARG
+#                Ripper::EXPR_ENDARG
+# uninitialized constant Ripper::SexpBuilder::EXPR_FITEM
+# Did you mean?  Ripper::EXPR_FITEM
+# uninitialized constant Ripper::SexpBuilder::EXPR_FNAME
+# Did you mean?  Ripper::SexpBuilder::EXPR_NONE
+#                Ripper::EXPR_NONE
+#                Ripper::EXPR_FNAME
+# uninitialized constant Ripper::SexpBuilder::EXPR_LABEL
+# Did you mean?  Ripper::SexpBuilder::EXPR_BEG
+#                Ripper::EXPR_BEG
+#                Ripper::EXPR_LABEL
+#                Ripper::SexpBuilder::EXPR_LABELED
+#                Ripper::EXPR_LABELED
+# uninitialized constant Ripper::SexpBuilder::EXPR_LABELED
+# Did you mean?  Ripper::EXPR_LABEL
+#                Ripper::EXPR_LABELED
+# uninitialized constant Ripper::SexpBuilder::EXPR_MID
+# Did you mean?  Ripper::SexpBuilder::EXPR_END
+#                Ripper::EXPR_MID
+#                Ripper::EXPR_END
+# uninitialized constant Ripper::SexpBuilder::EXPR_NONE
+# Did you mean?  Ripper::SexpBuilder::EXPR_DOT
+#                Ripper::SexpBuilder::EXPR_END
+#                Ripper::EXPR_DOT
+#                Ripper::EXPR_END
+#                Ripper::EXPR_NONE
+#                Ripper::SexpBuilder::EXPR_FNAME
+#                Ripper::EXPR_FNAME
+# uninitialized constant Ripper::SexpBuilder::EXPR_VALUE
+# Did you mean?  Ripper::EXPR_VALUE
+# uninitialized constant Ripper::SexpBuilder::PARSER_EVENTS
+# Did you mean?  Ripper::PARSER_EVENTS
+# uninitialized constant Ripper::SexpBuilder::PARSER_EVENT_TABLE
+# Did you mean?  Ripper::PARSER_EVENT_TABLE
+# uninitialized constant Ripper::SexpBuilder::SCANNER_EVENTS
+# Did you mean?  Ripper::SCANNER_EVENTS
+# uninitialized constant Ripper::SexpBuilder::SCANNER_EVENT_TABLE
+# Did you mean?  Ripper::SCANNER_EVENT_TABLE
+# uninitialized constant Ripper::SexpBuilder::Version
+# Did you mean?  Ripper::Version
+# wrong constant name on_BEGIN
+# wrong constant name on_CHAR
+# wrong constant name on_END
+# wrong constant name on___end__
+# wrong constant name on_alias
+# wrong constant name on_alias_error
+# wrong constant name on_aref
+# wrong constant name on_aref_field
+# wrong constant name on_arg_ambiguous
+# wrong constant name on_arg_paren
+# wrong constant name on_args_add
+# wrong constant name on_args_add_block
+# wrong constant name on_args_add_star
+# wrong constant name on_args_forward
+# wrong constant name on_args_new
+# wrong constant name on_array
+# wrong constant name on_aryptn
+# wrong constant name on_assign
+# wrong constant name on_assign_error
+# wrong constant name on_assoc_new
+# wrong constant name on_assoc_splat
+# wrong constant name on_assoclist_from_args
+# wrong constant name on_backref
+# wrong constant name on_backtick
+# wrong constant name on_bare_assoc_hash
+# wrong constant name on_begin
+# wrong constant name on_binary
+# wrong constant name on_block_var
+# wrong constant name on_blockarg
+# wrong constant name on_bodystmt
+# wrong constant name on_brace_block
+# wrong constant name on_break
+# wrong constant name on_call
+# wrong constant name on_case
+# wrong constant name on_class
+# wrong constant name on_class_name_error
+# wrong constant name on_comma
+# wrong constant name on_command
+# wrong constant name on_command_call
+# wrong constant name on_comment
+# wrong constant name on_const
+# wrong constant name on_const_path_field
+# wrong constant name on_const_path_ref
+# wrong constant name on_const_ref
+# wrong constant name on_cvar
+# wrong constant name on_def
+# wrong constant name on_defined
+# wrong constant name on_defs
+# wrong constant name on_do_block
+# wrong constant name on_dot2
+# wrong constant name on_dot3
+# wrong constant name on_dyna_symbol
+# wrong constant name on_else
+# wrong constant name on_elsif
+# wrong constant name on_embdoc
+# wrong constant name on_embdoc_beg
+# wrong constant name on_embdoc_end
+# wrong constant name on_embexpr_beg
+# wrong constant name on_embexpr_end
+# wrong constant name on_embvar
+# wrong constant name on_ensure
+# wrong constant name on_excessed_comma
+# wrong constant name on_fcall
+# wrong constant name on_field
+# wrong constant name on_float
+# wrong constant name on_for
+# wrong constant name on_gvar
+# wrong constant name on_hash
+# wrong constant name on_heredoc_beg
+# wrong constant name on_heredoc_end
+# wrong constant name on_hshptn
+# wrong constant name on_ident
+# wrong constant name on_if
+# wrong constant name on_if_mod
+# wrong constant name on_ifop
+# wrong constant name on_ignored_nl
+# wrong constant name on_ignored_sp
+# wrong constant name on_imaginary
+# wrong constant name on_in
+# wrong constant name on_int
+# wrong constant name on_ivar
+# wrong constant name on_kw
+# wrong constant name on_kwrest_param
+# wrong constant name on_label
+# wrong constant name on_label_end
+# wrong constant name on_lambda
+# wrong constant name on_lbrace
+# wrong constant name on_lbracket
+# wrong constant name on_lparen
+# wrong constant name on_magic_comment
+# wrong constant name on_massign
+# wrong constant name on_method_add_arg
+# wrong constant name on_method_add_block
+# wrong constant name on_mlhs_add
+# wrong constant name on_mlhs_add_post
+# wrong constant name on_mlhs_add_star
+# wrong constant name on_mlhs_new
+# wrong constant name on_mlhs_paren
+# wrong constant name on_module
+# wrong constant name on_mrhs_add
+# wrong constant name on_mrhs_add_star
+# wrong constant name on_mrhs_new
+# wrong constant name on_mrhs_new_from_args
+# wrong constant name on_next
+# wrong constant name on_nl
+# wrong constant name on_nokw_param
+# wrong constant name on_op
+# wrong constant name on_opassign
+# wrong constant name on_operator_ambiguous
+# wrong constant name on_param_error
+# wrong constant name on_params
+# wrong constant name on_paren
+# wrong constant name on_parse_error
+# wrong constant name on_period
+# wrong constant name on_program
+# wrong constant name on_qsymbols_add
+# wrong constant name on_qsymbols_beg
+# wrong constant name on_qsymbols_new
+# wrong constant name on_qwords_add
+# wrong constant name on_qwords_beg
+# wrong constant name on_qwords_new
+# wrong constant name on_rational
+# wrong constant name on_rbrace
+# wrong constant name on_rbracket
+# wrong constant name on_redo
+# wrong constant name on_regexp_add
+# wrong constant name on_regexp_beg
+# wrong constant name on_regexp_end
+# wrong constant name on_regexp_literal
+# wrong constant name on_regexp_new
+# wrong constant name on_rescue
+# wrong constant name on_rescue_mod
+# wrong constant name on_rest_param
+# wrong constant name on_retry
+# wrong constant name on_return
+# wrong constant name on_return0
+# wrong constant name on_rparen
+# wrong constant name on_sclass
+# wrong constant name on_semicolon
+# wrong constant name on_sp
+# wrong constant name on_stmts_add
+# wrong constant name on_stmts_new
+# wrong constant name on_string_add
+# wrong constant name on_string_concat
+# wrong constant name on_string_content
+# wrong constant name on_string_dvar
+# wrong constant name on_string_embexpr
+# wrong constant name on_string_literal
+# wrong constant name on_super
+# wrong constant name on_symbeg
+# wrong constant name on_symbol
+# wrong constant name on_symbol_literal
+# wrong constant name on_symbols_add
+# wrong constant name on_symbols_beg
+# wrong constant name on_symbols_new
+# wrong constant name on_tlambda
+# wrong constant name on_tlambeg
+# wrong constant name on_top_const_field
+# wrong constant name on_top_const_ref
+# wrong constant name on_tstring_beg
+# wrong constant name on_tstring_content
+# wrong constant name on_tstring_end
+# wrong constant name on_unary
+# wrong constant name on_undef
+# wrong constant name on_unless
+# wrong constant name on_unless_mod
+# wrong constant name on_until
+# wrong constant name on_until_mod
+# wrong constant name on_var_alias
+# wrong constant name on_var_field
+# wrong constant name on_var_ref
+# wrong constant name on_vcall
+# wrong constant name on_void_stmt
+# wrong constant name on_when
+# wrong constant name on_while
+# wrong constant name on_while_mod
+# wrong constant name on_word_add
+# wrong constant name on_word_new
+# wrong constant name on_words_add
+# wrong constant name on_words_beg
+# wrong constant name on_words_new
+# wrong constant name on_words_sep
+# wrong constant name on_xstring_add
+# wrong constant name on_xstring_literal
+# wrong constant name on_xstring_new
+# wrong constant name on_yield
+# wrong constant name on_yield0
+# wrong constant name on_zsuper
+# wrong constant name <Class:CompileError>
+# wrong constant name <Class:Error>
+# wrong constant name <Class:MatchData>
+# wrong constant name <Class:MatchError>
+# wrong constant name initialize
+# wrong constant name match
+# wrong constant name match_list
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name initialize
+# wrong constant name string
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name compile
+# wrong constant name dedent_string
+# wrong constant name lex_state_name
+# wrong constant name token_match
+# wrong constant name pretty_print_children
+# wrong constant name <static-init>
+# wrong constant name enabled?
+# wrong constant name pause
+# wrong constant name resume
+# uninitialized constant SDBM
+# uninitialized constant SDBM
+# uninitialized constant SDBMError
+# uninitialized constant SDBMError
+# uninitialized constant Scanf
+# uninitialized constant Scanf
+# wrong constant name ==
+# wrong constant name ===
+# wrong constant name divide
+# wrong constant name eql?
+# wrong constant name flatten_merge
+# wrong constant name pretty_print
+# wrong constant name pretty_print_cycle
+# wrong constant name reset
+# uninitialized constant Shell
+# uninitialized constant Shell
+# wrong constant name _dump
+# wrong constant name clone
+# wrong constant name dup
+# wrong constant name _load
+# wrong constant name clone
+# wrong constant name __init__
+# uninitialized constant Socket::APPEND
+# uninitialized constant Socket::BINARY
+# uninitialized constant Socket::CREAT
+# uninitialized constant Socket::DIRECT
+# uninitialized constant Socket::DSYNC
+# Did you mean?  Socket::RSYNC
+#                Socket::SYNC
+# uninitialized constant Socket::EXCL
+# uninitialized constant Socket::FNM_CASEFOLD
+# uninitialized constant Socket::FNM_DOTMATCH
+# uninitialized constant Socket::FNM_EXTGLOB
+# uninitialized constant Socket::FNM_NOESCAPE
+# uninitialized constant Socket::FNM_PATHNAME
+# uninitialized constant Socket::FNM_SHORTNAME
+# uninitialized constant Socket::FNM_SYSCASE
+# uninitialized constant Socket::LOCK_EX
+# Did you mean?  Socket::LOCK_NB
+#                Socket::LOCK_UN
+#                Socket::LOCK_SH
+# uninitialized constant Socket::LOCK_NB
+# Did you mean?  Socket::LOCK_UN
+#                Socket::LOCK_EX
+#                Socket::LOCK_SH
+# uninitialized constant Socket::LOCK_SH
+# Did you mean?  Socket::LOCK_NB
+#                Socket::LOCK_UN
+#                Socket::LOCK_EX
+# uninitialized constant Socket::LOCK_UN
+# Did you mean?  Socket::LOCK_NB
+#                Socket::LOCK_EX
+#                Socket::LOCK_SH
+# uninitialized constant Socket::NOATIME
+# uninitialized constant Socket::NOCTTY
+# uninitialized constant Socket::NOFOLLOW
+# uninitialized constant Socket::NONBLOCK
+# uninitialized constant Socket::NULL
+# uninitialized constant Socket::RDONLY
+# Did you mean?  Socket::WRONLY
+# uninitialized constant Socket::RDWR
+# uninitialized constant Socket::RSYNC
+# Did you mean?  Socket::DSYNC
+#                Socket::SYNC
+# uninitialized constant Socket::SEEK_CUR
+# uninitialized constant Socket::SEEK_DATA
+# Did you mean?  Socket::SEEK_SET
+# uninitialized constant Socket::SEEK_END
+# uninitialized constant Socket::SEEK_HOLE
+# uninitialized constant Socket::SEEK_SET
+# uninitialized constant Socket::SHARE_DELETE
+# uninitialized constant Socket::SYNC
+# Did you mean?  Socket::RSYNC
+#                Socket::DSYNC
+# uninitialized constant Socket::TMPFILE
+# Did you mean?  Tempfile
+# uninitialized constant Socket::TRUNC
+# Did you mean?  TRUE
+# uninitialized constant Socket::WRONLY
+# Did you mean?  Socket::RDONLY
+# uninitialized constant SortedSet::InspectKey
+# wrong constant name initialize
+# wrong constant name setup
+# wrong constant name shellescape
+# wrong constant name shellsplit
+# wrong constant name set_encoding_by_bom
+# wrong constant name bol?
+# wrong constant name fixed_anchor?
+# wrong constant name initialize
+# wrong constant name deconstruct
+# wrong constant name deconstruct_keys
+# wrong constant name filter
+# wrong constant name <Class:Struct>
+# uninitialized constant Sync
+# uninitialized constant Sync
+# uninitialized constant Sync_m
+# uninitialized constant Sync_m
+# uninitialized constant Syslog
+# uninitialized constant Syslog
+# wrong constant name T.noreturn
+# wrong constant name T.noreturn
+# wrong constant name T.untyped
+# wrong constant name <Class:Charset>
+# wrong constant name <Class:Charsets>
+# wrong constant name <Class:Charstring>
+# wrong constant name <Class:CharstringsIndex>
+# wrong constant name <Class:Dict>
+# wrong constant name <Class:Encoding>
+# wrong constant name <Class:Encodings>
+# wrong constant name <Class:FdSelector>
+# wrong constant name <Class:FontDict>
+# wrong constant name <Class:FontIndex>
+# wrong constant name <Class:Header>
+# wrong constant name <Class:Index>
+# wrong constant name <Class:OneBasedIndex>
+# wrong constant name <Class:Path>
+# wrong constant name <Class:PrivateDict>
+# wrong constant name <Class:SubrIndex>
+# wrong constant name <Class:TopDict>
+# wrong constant name <Class:TopIndex>
+# uninitialized constant TTFunk::Table::Cff::Charset::Elem
+# wrong constant name []
+# wrong constant name count
+# wrong constant name each
+# wrong constant name encode
+# wrong constant name entries
+# wrong constant name format
+# wrong constant name initialize
+# wrong constant name offset
+# wrong constant name offset_or_id
+# wrong constant name top_dict
+# wrong constant name <static-init>
+# wrong constant name standard_strings
+# wrong constant name strings_for_charset_id
+# wrong constant name <static-init>
+# wrong constant name encode
+# wrong constant name glyph
+# wrong constant name glyph_id
+# wrong constant name initialize
+# wrong constant name path
+# wrong constant name raw
+# wrong constant name render
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::CharstringsIndex::Elem
+# wrong constant name encode
+# wrong constant name initialize
+# wrong constant name top_dict
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::Dict::Elem
+# wrong constant name <Class:InvalidOperandError>
+# wrong constant name <Class:TooManyOperandsError>
+# wrong constant name []
+# wrong constant name each
+# wrong constant name each_pair
+# wrong constant name encode
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::Encoding::Elem
+# wrong constant name []
+# wrong constant name count
+# wrong constant name each
+# wrong constant name encode
+# wrong constant name format
+# wrong constant name initialize
+# wrong constant name offset
+# wrong constant name offset_or_id
+# wrong constant name supplemental?
+# wrong constant name top_dict
+# wrong constant name <static-init>
+# wrong constant name codes_for_encoding_id
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::FdSelector::Elem
+# wrong constant name []
+# wrong constant name count
+# wrong constant name each
+# wrong constant name encode
+# wrong constant name entries
+# wrong constant name initialize
+# wrong constant name n_glyphs
+# wrong constant name top_dict
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::FontDict::Elem
+# uninitialized constant TTFunk::Table::Cff::FontDict::MAX_OPERANDS
+# uninitialized constant TTFunk::Table::Cff::FontDict::OPERAND_BZERO
+# Did you mean?  TTFunk::Table::Cff::FontDict::OPERATOR_BZERO
+# uninitialized constant TTFunk::Table::Cff::FontDict::OPERATOR_BZERO
+# Did you mean?  TTFunk::Table::Cff::FontDict::OPERAND_BZERO
+# uninitialized constant TTFunk::Table::Cff::FontDict::VALID_SCI_EXPONENT_RE
+# uninitialized constant TTFunk::Table::Cff::FontDict::VALID_SCI_SIGNIFICAND_RE
+# uninitialized constant TTFunk::Table::Cff::FontDict::WIDE_OPERATOR_ADJUSTMENT
+# uninitialized constant TTFunk::Table::Cff::FontDict::WIDE_OPERATOR_BZERO
+# wrong constant name encode
+# wrong constant name finalize
+# wrong constant name initialize
+# wrong constant name private_dict
+# wrong constant name top_dict
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::FontIndex::Elem
+# wrong constant name finalize
+# wrong constant name initialize
+# wrong constant name top_dict
+# wrong constant name <static-init>
+# wrong constant name absolute_offset_size
+# wrong constant name encode
+# wrong constant name header_size
+# wrong constant name major
+# wrong constant name minor
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::Index::Elem
+# wrong constant name []
+# wrong constant name count
+# wrong constant name data_start_pos
+# wrong constant name each
+# wrong constant name encode
+# wrong constant name offset_size
+# wrong constant name offsets
+# wrong constant name raw_data
+# wrong constant name raw_offset_length
+# wrong constant name <static-init>
+# wrong constant name []
+# wrong constant name base_index
+# wrong constant name count
+# wrong constant name each
+# wrong constant name encode
+# wrong constant name initialize
+# wrong constant name length
+# wrong constant name table_offset
+# wrong constant name <static-init>
+# wrong constant name close_path
+# wrong constant name commands
+# wrong constant name curve_to
+# wrong constant name line_to
+# wrong constant name move_to
+# wrong constant name number_of_contours
+# wrong constant name render
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::Elem
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::MAX_OPERANDS
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::OPERAND_BZERO
+# Did you mean?  TTFunk::Table::Cff::PrivateDict::OPERATOR_BZERO
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::OPERATOR_BZERO
+# Did you mean?  TTFunk::Table::Cff::PrivateDict::OPERAND_BZERO
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::VALID_SCI_EXPONENT_RE
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::VALID_SCI_SIGNIFICAND_RE
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::WIDE_OPERATOR_ADJUSTMENT
+# uninitialized constant TTFunk::Table::Cff::PrivateDict::WIDE_OPERATOR_BZERO
+# wrong constant name default_width_x
+# wrong constant name encode
+# wrong constant name finalize
+# wrong constant name nominal_width_x
+# wrong constant name subr_index
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::SubrIndex::Elem
+# wrong constant name bias
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::TopDict::Elem
+# uninitialized constant TTFunk::Table::Cff::TopDict::MAX_OPERANDS
+# uninitialized constant TTFunk::Table::Cff::TopDict::OPERAND_BZERO
+# Did you mean?  TTFunk::Table::Cff::TopDict::OPERATOR_BZERO
+# uninitialized constant TTFunk::Table::Cff::TopDict::OPERATOR_BZERO
+# Did you mean?  TTFunk::Table::Cff::TopDict::OPERAND_BZERO
+# uninitialized constant TTFunk::Table::Cff::TopDict::VALID_SCI_EXPONENT_RE
+# uninitialized constant TTFunk::Table::Cff::TopDict::VALID_SCI_SIGNIFICAND_RE
+# uninitialized constant TTFunk::Table::Cff::TopDict::WIDE_OPERATOR_ADJUSTMENT
+# uninitialized constant TTFunk::Table::Cff::TopDict::WIDE_OPERATOR_BZERO
+# wrong constant name cff
+# wrong constant name cff_offset
+# wrong constant name charset
+# wrong constant name charstring_type
+# wrong constant name charstrings_index
+# wrong constant name encode
+# wrong constant name encoding
+# wrong constant name finalize
+# wrong constant name font_dict_selector
+# wrong constant name font_index
+# wrong constant name is_cid_font?
+# wrong constant name private_dict
+# wrong constant name ros
+# wrong constant name ros?
+# wrong constant name <static-init>
+# uninitialized constant TTFunk::Table::Cff::TopIndex::Elem
+# wrong constant name <static-init>
+# wrong constant name <Class:Remover>
+# wrong constant name _close
+# wrong constant name call
+# wrong constant name initialize
+# wrong constant name <static-init>
+# uninitialized constant ThreadsWait
+# uninitialized constant ThreadsWait
+# wrong constant name eval_script
+# wrong constant name instruction_sequence
+# wrong constant name parameters
+# wrong constant name new
+# uninitialized constant Tracer
+# Did you mean?  TracePoint
+# uninitialized constant Tracer
+# Did you mean?  TracePoint
+# wrong constant name <Class:File>
+# wrong constant name new2
+# uninitialized constant URI::File::ABS_PATH
+# Did you mean?  URI::ABS_PATH
+# uninitialized constant URI::File::ABS_URI
+# Did you mean?  URI::ABS_URI
+# uninitialized constant URI::File::ABS_URI_REF
+# Did you mean?  URI::ABS_URI_REF
+# uninitialized constant URI::File::DEFAULT_PARSER
+# Did you mean?  URI::File::DEFAULT_PORT
+#                URI::DEFAULT_PARSER
+# uninitialized constant URI::File::ESCAPED
+# Did you mean?  URI::File::Escape
+#                URI::Escape
+#                URI::ESCAPED
+# uninitialized constant URI::File::FRAGMENT
+# Did you mean?  URI::FRAGMENT
+# uninitialized constant URI::File::HOST
+# Did you mean?  URI::HOST
+# uninitialized constant URI::File::OPAQUE
+# Did you mean?  URI::OPAQUE
+# uninitialized constant URI::File::PORT
+# Did you mean?  URI::PORT
+# uninitialized constant URI::File::QUERY
+# Did you mean?  URI::QUERY
+# uninitialized constant URI::File::REGISTRY
+# Did you mean?  URI::REGISTRY
+# uninitialized constant URI::File::REL_PATH
+# Did you mean?  URI::REL_PATH
+# uninitialized constant URI::File::REL_URI
+# Did you mean?  URI::REL_URI
+# uninitialized constant URI::File::REL_URI_REF
+# Did you mean?  URI::REL_URI_REF
+# uninitialized constant URI::File::RFC3986_PARSER
+# Did you mean?  URI::File::RFC3986_Parser
+#                URI::RFC3986_Parser
+#                URI::File::RFC2396_Parser
+#                URI::RFC2396_Parser
+#                URI::RFC3986_PARSER
+# uninitialized constant URI::File::SCHEME
+# Did you mean?  URI::SCHEME
+# uninitialized constant URI::File::TBLDECWWWCOMP_
+# Did you mean?  URI::File::TBLENCWWWCOMP_
+#                URI::TBLENCWWWCOMP_
+#                URI::TBLDECWWWCOMP_
+# uninitialized constant URI::File::TBLENCWWWCOMP_
+# Did you mean?  URI::File::TBLDECWWWCOMP_
+#                URI::TBLENCWWWCOMP_
+#                URI::TBLDECWWWCOMP_
+# uninitialized constant URI::File::UNSAFE
+# Did you mean?  URI::UNSAFE
+# uninitialized constant URI::File::URI_REF
+# Did you mean?  URI::URI_REF
+# uninitialized constant URI::File::USERINFO
+# Did you mean?  URI::USERINFO
+# uninitialized constant URI::File::USE_REGISTRY
+# uninitialized constant URI::File::VERSION
+# Did you mean?  URI::VERSION
+# uninitialized constant URI::File::VERSION_CODE
+# Did you mean?  URI::VERSION_CODE
+# uninitialized constant URI::File::WEB_ENCODINGS_
+# Did you mean?  URI::WEB_ENCODINGS_
+# wrong constant name check_password
+# wrong constant name check_user
+# wrong constant name check_userinfo
+# wrong constant name set_userinfo
+# wrong constant name <static-init>
+# wrong constant name attributes
+# wrong constant name attributes=
+# wrong constant name dn
+# wrong constant name dn=
+# wrong constant name extensions
+# wrong constant name extensions=
+# wrong constant name filter
+# wrong constant name filter=
+# wrong constant name initialize
+# wrong constant name scope
+# wrong constant name scope=
+# wrong constant name set_attributes
+# wrong constant name set_dn
+# wrong constant name set_extensions
+# wrong constant name set_filter
+# wrong constant name set_scope
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name join
+# wrong constant name parse
+# wrong constant name regexp
+# wrong constant name split
+# wrong constant name make_components_hash
+# wrong constant name get_encoding
+# wrong constant name <static-init>
+# uninitialized constant Vector
+# uninitialized constant Vector
+# uninitialized constant WeakRef
+# uninitialized constant WeakRef
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
+# wrong constant name initialize
diff --git a/sorbet/rbi/hidden-definitions/hidden.rbi b/sorbet/rbi/hidden-definitions/hidden.rbi
new file mode 100644
index 0000000..e8e025f
--- /dev/null
+++ b/sorbet/rbi/hidden-definitions/hidden.rbi
@@ -0,0 +1,8260 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi hidden-definitions
+
+# typed: autogenerated
+
+module AFM
+  ISO_LATIN1_ENCODING = ::T.let(nil, ::T.untyped)
+end
+
+class Addrinfo
+  def connect_internal(local_addrinfo, timeout=T.unsafe(nil)); end
+end
+
+class Array
+  include ::JSON::Ext::Generator::GeneratorMethods::Array
+  def abbrev(pattern=T.unsafe(nil)); end
+
+  def deconstruct(); end
+
+  def shelljoin(); end
+
+  def to_h(); end
+end
+
+class Array
+  def self.try_convert(arg); end
+end
+
+BasicObject::BasicObject = BasicObject
+
+class BasicSocket
+  def read_nonblock(len, str=T.unsafe(nil), exception: T.unsafe(nil)); end
+end
+
+class BigDecimal
+  def clone(); end
+  EXCEPTION_NaN = ::T.let(nil, ::T.untyped)
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class BigDecimal
+  def self.interpret_loosely(arg); end
+end
+
+class Binding
+  def clone(); end
+
+  def irb(); end
+end
+
+class Bundler::APIResponseInvalidDependenciesError
+  def status_code(); end
+end
+
+class Bundler::APIResponseInvalidDependenciesError
+end
+
+class Bundler::CurrentRuby
+  def jruby_30?(); end
+
+  def jruby_3?(); end
+
+  def maglev_30?(); end
+
+  def maglev_3?(); end
+
+  def mingw_30?(); end
+
+  def mingw_3?(); end
+
+  def mri_30?(); end
+
+  def mri_3?(); end
+
+  def mswin64_30?(); end
+
+  def mswin64_3?(); end
+
+  def mswin_30?(); end
+
+  def mswin_3?(); end
+
+  def on_30?(); end
+
+  def on_3?(); end
+
+  def rbx_30?(); end
+
+  def rbx_3?(); end
+
+  def ruby_30?(); end
+
+  def ruby_3?(); end
+
+  def truffleruby_30?(); end
+
+  def truffleruby_3?(); end
+
+  def x64_mingw_30?(); end
+
+  def x64_mingw_3?(); end
+end
+
+class Bundler::Definition
+  def dependencies_for(groups); end
+
+  def locked_dependencies(); end
+
+  def most_specific_locked_platform(); end
+
+  def requested_dependencies(); end
+
+  def resolve_only_locally!(); end
+end
+
+class Bundler::Definition
+  def self.no_lock(); end
+
+  def self.no_lock=(no_lock); end
+end
+
+class Bundler::DepProxy
+  def clone(); end
+end
+
+class Bundler::DepProxy
+  def self.get_proxy(dep, platform); end
+end
+
+class Bundler::Dependency
+  def branch(); end
+
+  def expanded_platforms(); end
+
+  def git(); end
+
+  def github(); end
+
+  def ref(); end
+end
+
+Bundler::Deprecate = Gem::Deprecate
+
+module Bundler::Digest
+  SHA1_MASK = ::T.let(nil, ::T.untyped)
+  SHA1_WORDS = ::T.let(nil, ::T.untyped)
+end
+
+module Bundler::Digest
+  def self.sha1(string); end
+end
+
+class Bundler::Dsl
+  def check_primary_source_safety(); end
+  GITHUB_PULL_REQUEST_URL = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Env
+end
+
+class Bundler::Env
+  def self.environment(); end
+
+  def self.report(options=T.unsafe(nil)); end
+
+  def self.write(io); end
+end
+
+class Bundler::EnvironmentPreserver
+  def replace_with_backup(); end
+end
+
+class Bundler::EnvironmentPreserver
+  def self.env_to_hash(env); end
+
+  def self.from_env(); end
+end
+
+class Bundler::Fetcher
+  def fetch_spec(spec); end
+
+  def fetchers(); end
+
+  def http_proxy(); end
+
+  def initialize(remote); end
+
+  def specs(gem_names, source); end
+
+  def specs_with_retry(gem_names, source); end
+
+  def uri(); end
+
+  def use_api(); end
+
+  def user_agent(); end
+  FAIL_ERRORS = ::T.let(nil, ::T.untyped)
+  FETCHERS = ::T.let(nil, ::T.untyped)
+  HTTP_ERRORS = ::T.let(nil, ::T.untyped)
+  NET_ERRORS = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Fetcher::AuthenticationRequiredError
+  def initialize(remote_uri); end
+end
+
+class Bundler::Fetcher::BadAuthenticationError
+  def initialize(remote_uri); end
+end
+
+class Bundler::Fetcher::Base
+  def api_fetcher?(); end
+
+  def available?(); end
+
+  def display_uri(); end
+
+  def downloader(); end
+
+  def fetch_uri(); end
+
+  def initialize(downloader, remote, display_uri); end
+
+  def remote(); end
+
+  def remote_uri(); end
+end
+
+class Bundler::Fetcher::Base
+end
+
+class Bundler::Fetcher::CertificateFailureError
+  def initialize(remote_uri); end
+end
+
+class Bundler::Fetcher::CompactIndex
+  def available?(*args, &blk); end
+
+  def specs(*args, &blk); end
+
+  def specs_for_names(gem_names); end
+end
+
+class Bundler::Fetcher::CompactIndex::ClientFetcher
+  def call(path, headers); end
+
+  def fetcher(); end
+
+  def fetcher=(_); end
+
+  def ui(); end
+
+  def ui=(_); end
+end
+
+class Bundler::Fetcher::CompactIndex::ClientFetcher
+  def self.[](*arg); end
+
+  def self.members(); end
+end
+
+class Bundler::Fetcher::CompactIndex
+  def self.compact_index_request(method_name); end
+end
+
+class Bundler::Fetcher::Dependency
+  def dependency_api_uri(gem_names=T.unsafe(nil)); end
+
+  def dependency_specs(gem_names); end
+
+  def get_formatted_specs_and_deps(gem_list); end
+
+  def specs(gem_names, full_dependency_list=T.unsafe(nil), last_spec_list=T.unsafe(nil)); end
+
+  def unmarshalled_dep_gems(gem_names); end
+end
+
+class Bundler::Fetcher::Dependency
+end
+
+class Bundler::Fetcher::Downloader
+  def connection(); end
+
+  def fetch(uri, headers=T.unsafe(nil), counter=T.unsafe(nil)); end
+
+  def initialize(connection, redirect_limit); end
+
+  def redirect_limit(); end
+
+  def request(uri, headers); end
+end
+
+class Bundler::Fetcher::Downloader
+end
+
+class Bundler::Fetcher::Index
+  def specs(_gem_names); end
+end
+
+class Bundler::Fetcher::Index
+end
+
+class Bundler::Fetcher::SSLError
+  def initialize(msg=T.unsafe(nil)); end
+end
+
+class Bundler::Fetcher::TooManyRequestsError
+end
+
+class Bundler::Fetcher::TooManyRequestsError
+end
+
+class Bundler::Fetcher
+  def self.api_timeout(); end
+
+  def self.api_timeout=(api_timeout); end
+
+  def self.disable_endpoint(); end
+
+  def self.disable_endpoint=(disable_endpoint); end
+
+  def self.max_retries(); end
+
+  def self.max_retries=(max_retries); end
+
+  def self.redirect_limit(); end
+
+  def self.redirect_limit=(redirect_limit); end
+end
+
+module Bundler::FileUtils
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::FileUtils::Entry_
+  def link(dest); end
+end
+
+module Bundler::FileUtils
+  def self.cp_lr(src, dest, noop: T.unsafe(nil), verbose: T.unsafe(nil), dereference_root: T.unsafe(nil), remove_destination: T.unsafe(nil)); end
+
+  def self.link_entry(src, dest, dereference_root=T.unsafe(nil), remove_destination=T.unsafe(nil)); end
+end
+
+class Bundler::GemHelper
+  include ::Rake::DSL
+  include ::Rake::FileUtilsExt
+  include ::FileUtils
+  include ::FileUtils::StreamUtils_
+  def allowed_push_host(); end
+
+  def already_tagged?(); end
+
+  def base(); end
+
+  def build_checksum(built_gem_path=T.unsafe(nil)); end
+
+  def build_gem(); end
+
+  def built_gem_path(); end
+
+  def clean?(); end
+
+  def committed?(); end
+
+  def current_branch(); end
+
+  def default_remote(); end
+
+  def gem_command(); end
+
+  def gem_key(); end
+
+  def gem_push?(); end
+
+  def gem_push_host(); end
+
+  def gemspec(); end
+
+  def git_push(remote=T.unsafe(nil)); end
+
+  def guard_clean(); end
+
+  def initialize(base=T.unsafe(nil), name=T.unsafe(nil)); end
+
+  def install(); end
+
+  def install_gem(built_gem_path=T.unsafe(nil), local=T.unsafe(nil)); end
+
+  def name(); end
+
+  def rubygem_push(path); end
+
+  def sh(cmd, &block); end
+
+  def sh_with_input(cmd); end
+
+  def sh_with_status(cmd, &block); end
+
+  def spec_path(); end
+
+  def tag_prefix=(tag_prefix); end
+
+  def tag_version(); end
+
+  def version(); end
+
+  def version_tag(); end
+end
+
+class Bundler::GemHelper
+  def self.gemspec(&block); end
+
+  def self.install_tasks(opts=T.unsafe(nil)); end
+
+  def self.instance(); end
+
+  def self.instance=(instance); end
+
+  def self.tag_prefix=(prefix); end
+end
+
+class Bundler::GemHelpers::PlatformMatch
+  def self.specificity_score(spec_platform, user_platform); end
+end
+
+module Bundler::GemHelpers
+  def self.local_platform(); end
+
+  def self.same_deps(spec, exemplary_spec); end
+
+  def self.same_specificity(platform, spec, exemplary_spec); end
+end
+
+class Bundler::GemVersionPromoter
+  def initialize(locked_specs=T.unsafe(nil), unlock_gems=T.unsafe(nil)); end
+
+  def level(); end
+
+  def level=(value); end
+
+  def locked_specs(); end
+
+  def major?(); end
+
+  def minor?(); end
+
+  def prerelease_specified(); end
+
+  def prerelease_specified=(prerelease_specified); end
+
+  def sort_versions(dep, spec_groups); end
+
+  def strict(); end
+
+  def strict=(strict); end
+
+  def unlock_gems(); end
+  DEBUG = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::GemVersionPromoter
+end
+
+class Bundler::Graph
+  def edge_options(); end
+
+  def groups(); end
+
+  def initialize(env, output_file, show_version=T.unsafe(nil), show_requirements=T.unsafe(nil), output_format=T.unsafe(nil), without=T.unsafe(nil)); end
+
+  def node_options(); end
+
+  def output_file(); end
+
+  def output_format(); end
+
+  def relations(); end
+
+  def viz(); end
+  GRAPH_NAME = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Graph::GraphVizClient
+  def g(); end
+
+  def initialize(graph_instance); end
+
+  def run(); end
+end
+
+class Bundler::Graph::GraphVizClient
+end
+
+class Bundler::Graph
+end
+
+class Bundler::Index
+  include ::Enumerable
+end
+
+class Bundler::Injector
+  def initialize(deps, options=T.unsafe(nil)); end
+
+  def inject(gemfile_path, lockfile_path); end
+
+  def remove(gemfile_path, lockfile_path); end
+  INJECTED_GEMS = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Injector
+  def self.inject(new_deps, options=T.unsafe(nil)); end
+
+  def self.remove(gems, options=T.unsafe(nil)); end
+end
+
+class Bundler::LazySpecification
+  def eql?(other); end
+
+  def platform_string(); end
+end
+
+class Bundler::LockfileParser
+  def self.bundled_with(); end
+end
+
+module Bundler::Molinillo::SpecificationProvider
+  def dependencies_equal?(dependencies, other_dependencies); end
+end
+
+class Bundler::PermissionError
+  def parent_folder(); end
+
+  def permission_type(); end
+end
+
+module Bundler::Plugin::API::Source
+  def ==(other); end
+
+  def add_dependency_names(names); end
+
+  def app_cache_dirname(); end
+
+  def app_cache_path(custom_path=T.unsafe(nil)); end
+
+  def bundler_plugin_api_source?(); end
+
+  def cache(spec, custom_path=T.unsafe(nil)); end
+
+  def cached!(); end
+
+  def can_lock?(spec); end
+
+  def dependency_names(); end
+
+  def dependency_names=(dependency_names); end
+
+  def double_check_for(*arg); end
+
+  def eql?(other); end
+
+  def fetch_gemspec_files(); end
+
+  def gem_install_dir(); end
+
+  def hash(); end
+
+  def identifier(); end
+
+  def include?(other); end
+
+  def initialize(opts); end
+
+  def install(spec, opts); end
+
+  def install_path(); end
+
+  def installed?(); end
+
+  def local!(); end
+
+  def name(); end
+
+  def options(); end
+
+  def options_to_lock(); end
+
+  def post_install(spec, disable_exts=T.unsafe(nil)); end
+
+  def remote!(); end
+
+  def root(); end
+
+  def spec_names(); end
+
+  def specs(); end
+
+  def to_lock(); end
+
+  def to_s(); end
+
+  def unlock!(); end
+
+  def unmet_deps(); end
+
+  def uri(); end
+
+  def uri_hash(); end
+end
+
+module Bundler::Plugin::API::Source
+end
+
+module Bundler::Plugin::Events
+  GEM_AFTER_INSTALL = ::T.let(nil, ::T.untyped)
+  GEM_AFTER_INSTALL_ALL = ::T.let(nil, ::T.untyped)
+  GEM_BEFORE_INSTALL = ::T.let(nil, ::T.untyped)
+  GEM_BEFORE_INSTALL_ALL = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Plugin::Index
+  def installed_plugins(); end
+
+  def plugin_commands(plugin); end
+
+  def unregister_plugin(name); end
+end
+
+class Bundler::Plugin::Index::CommandConflict
+  def initialize(plugin, commands); end
+end
+
+class Bundler::Plugin::Index::CommandConflict
+end
+
+class Bundler::Plugin::Index::SourceConflict
+  def initialize(plugin, sources); end
+end
+
+class Bundler::Plugin::Index::SourceConflict
+end
+
+class Bundler::Plugin::Installer
+  def install(names, options); end
+
+  def install_definition(definition); end
+end
+
+class Bundler::Plugin::Installer::Git
+  def generate_bin(spec, disable_extensions=T.unsafe(nil)); end
+end
+
+class Bundler::Plugin::Installer::Git
+end
+
+class Bundler::Plugin::Installer::Rubygems
+end
+
+class Bundler::Plugin::Installer::Rubygems
+end
+
+class Bundler::Plugin::Installer
+end
+
+class Bundler::Plugin::PluginInstallError
+end
+
+class Bundler::Plugin::PluginInstallError
+end
+
+class Bundler::Plugin::SourceList
+end
+
+class Bundler::Plugin::SourceList
+end
+
+module Bundler::Plugin
+  def self.list(); end
+
+  def self.save_plugin(name, spec, optional_plugin=T.unsafe(nil)); end
+
+  def self.uninstall(names, options); end
+end
+
+class Bundler::ProcessLock
+end
+
+class Bundler::ProcessLock
+  def self.lock(bundle_path=T.unsafe(nil)); end
+end
+
+class Bundler::Resolver
+  include ::Bundler::GemHelpers
+  def results_for(dependency, base); end
+
+  def source_for(name); end
+end
+
+class Bundler::Resolver::SpecGroup
+  def activated_platforms(); end
+
+  def activated_platforms=(activated_platforms); end
+
+  def sorted_activated_platforms(); end
+end
+
+class Bundler::Resolver::SpecGroup
+  def self.create_for(specs, all_platforms, specific_platform); end
+end
+
+class Bundler::Retry
+  def attempt(&block); end
+
+  def attempts(&block); end
+
+  def current_run(); end
+
+  def current_run=(current_run); end
+
+  def initialize(name, exceptions=T.unsafe(nil), retries=T.unsafe(nil)); end
+
+  def name(); end
+
+  def name=(name); end
+
+  def total_runs(); end
+
+  def total_runs=(total_runs); end
+end
+
+class Bundler::Retry
+  def self.attempts(); end
+
+  def self.default_attempts(); end
+
+  def self.default_retries(); end
+end
+
+class Bundler::RubygemsIntegration
+  def add_default_gems_to(specs); end
+
+  def add_to_load_path(paths); end
+
+  def all_specs(); end
+
+  def backport_ext_builder_monitor(); end
+
+  def correct_for_windows_path(path); end
+
+  def default_stubs(); end
+
+  def find_bundler(version); end
+
+  def find_name(name); end
+
+  def gem_remote_fetcher(); end
+
+  def load_env_plugins(); end
+
+  def plain_specs(); end
+
+  def plain_specs=(specs); end
+
+  def stub_rubygems(specs); end
+
+  def supports_bundler_trampolining?(); end
+end
+
+class Bundler::SelfManager
+  def install_locked_bundler_and_restart_with_it_if_needed(); end
+
+  def restart_with_locked_bundler_if_needed(); end
+
+  def update_bundler_and_restart_with_it_if_needed(target); end
+end
+
+class Bundler::SelfManager
+end
+
+class Bundler::Settings
+  def processor_count(); end
+  STRING_KEYS = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Settings::Mirror
+  def ==(other); end
+
+  def fallback_timeout(); end
+
+  def fallback_timeout=(timeout); end
+
+  def initialize(uri=T.unsafe(nil), fallback_timeout=T.unsafe(nil)); end
+
+  def uri(); end
+
+  def uri=(uri); end
+
+  def valid?(); end
+
+  def validate!(probe=T.unsafe(nil)); end
+  DEFAULT_FALLBACK_TIMEOUT = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Settings::Mirror
+end
+
+class Bundler::Settings::Mirrors
+  def each(&blk); end
+
+  def for(uri); end
+
+  def initialize(prober=T.unsafe(nil)); end
+
+  def parse(key, value); end
+end
+
+class Bundler::Settings::Mirrors
+end
+
+class Bundler::Settings::Validator
+end
+
+class Bundler::Settings::Validator::Rule
+  def description(); end
+
+  def fail!(key, value, *reasons); end
+
+  def initialize(keys, description, &validate); end
+
+  def k(key); end
+
+  def set(settings, key, value, *reasons); end
+
+  def validate!(key, value, settings); end
+end
+
+class Bundler::Settings::Validator::Rule
+end
+
+class Bundler::Settings::Validator
+  def self.validate!(key, value, settings); end
+end
+
+class Bundler::Settings
+  def self.key_for(key); end
+end
+
+class Bundler::Source
+  def add_dependency_names(names); end
+
+  def cached!(); end
+
+  def identifier(); end
+
+  def local!(); end
+
+  def local_only!(); end
+
+  def remote!(); end
+
+  def spec_names(); end
+end
+
+class Bundler::Source::Git
+  def glob(); end
+
+  def local?(); end
+end
+
+class Bundler::Source::Rubygems
+  def default_cache_path_for(dir); end
+
+  def dependency_api_available?(); end
+
+  def multiple_remotes?(); end
+
+  def no_remotes?(); end
+
+  def remote_names(); end
+end
+
+class Bundler::Source::RubygemsAggregate
+  def identifier(); end
+
+  def initialize(sources, source_map); end
+
+  def source_map(); end
+
+  def sources(); end
+
+  def specs(); end
+end
+
+class Bundler::Source::RubygemsAggregate
+end
+
+class Bundler::SourceList
+  def add_global_rubygems_remote(uri); end
+
+  def aggregate_global_source?(); end
+
+  def expired_sources?(replacement_sources); end
+
+  def global_path_source(); end
+
+  def implicit_global_source?(); end
+
+  def local_only!(); end
+
+  def lock_other_sources(); end
+
+  def lock_rubygems_sources(); end
+
+  def merged_gem_lockfile_sections!(replacement_source); end
+
+  def merged_gem_lockfile_sections?(); end
+
+  def non_default_explicit_sources(); end
+
+  def non_global_rubygems_sources(); end
+end
+
+class Bundler::SourceMap
+  def all_requirements(); end
+
+  def dependencies(); end
+
+  def direct_requirements(); end
+
+  def initialize(sources, dependencies); end
+
+  def pinned_spec_names(skip=T.unsafe(nil)); end
+
+  def sources(); end
+end
+
+class Bundler::SourceMap
+end
+
+class Bundler::SpecSet
+  include ::Enumerable
+  include ::Bundler::TSort
+  def missing_specs(); end
+end
+
+class Bundler::StubSpecification
+  def extensions(); end
+
+  def gem_build_complete_path(); end
+
+  def manually_installed?(); end
+end
+
+module Bundler::TSort
+  def each_strongly_connected_component(&block); end
+
+  def each_strongly_connected_component_from(node, id_map=T.unsafe(nil), stack=T.unsafe(nil), &block); end
+
+  def strongly_connected_components(); end
+
+  def tsort(); end
+
+  def tsort_each(&block); end
+
+  def tsort_each_child(node); end
+
+  def tsort_each_node(); end
+end
+
+class Bundler::TSort::Cyclic
+end
+
+class Bundler::TSort::Cyclic
+end
+
+module Bundler::TSort
+  def self.each_strongly_connected_component(each_node, each_child); end
+
+  def self.each_strongly_connected_component_from(node, each_child, id_map=T.unsafe(nil), stack=T.unsafe(nil)); end
+
+  def self.strongly_connected_components(each_node, each_child); end
+
+  def self.tsort(each_node, each_child); end
+
+  def self.tsort_each(each_node, each_child); end
+end
+
+class Bundler::Thor
+  include ::Bundler::Thor::Base
+  include ::Bundler::Thor::Invocation
+  include ::Bundler::Thor::Shell
+  def help(command=T.unsafe(nil), subcommand=T.unsafe(nil)); end
+  HELP_MAPPINGS = ::T.let(nil, ::T.untyped)
+  TEMPLATE_EXTNAME = ::T.let(nil, ::T.untyped)
+  THOR_RESERVED_WORDS = ::T.let(nil, ::T.untyped)
+end
+
+module Bundler::Thor::Actions
+  def _cleanup_options_and_set(options, key); end
+
+  def _shared_configuration(); end
+
+  def action(instance); end
+
+  def add_file(destination, *args, &block); end
+
+  def add_link(destination, *args); end
+
+  def append_file(path, *args, &block); end
+
+  def append_to_file(path, *args, &block); end
+
+  def apply(path, config=T.unsafe(nil)); end
+
+  def behavior(); end
+
+  def behavior=(behavior); end
+
+  def chmod(path, mode, config=T.unsafe(nil)); end
+
+  def comment_lines(path, flag, *args); end
+
+  def copy_file(source, *args, &block); end
+
+  def create_file(destination, *args, &block); end
+
+  def create_link(destination, *args); end
+
+  def destination_root(); end
+
+  def destination_root=(root); end
+
+  def directory(source, *args, &block); end
+
+  def empty_directory(destination, config=T.unsafe(nil)); end
+
+  def find_in_source_paths(file); end
+
+  def get(source, *args, &block); end
+
+  def gsub_file(path, flag, *args, &block); end
+
+  def in_root(); end
+
+  def initialize(args=T.unsafe(nil), options=T.unsafe(nil), config=T.unsafe(nil)); end
+
+  def inject_into_class(path, klass, *args, &block); end
+
+  def inject_into_file(destination, *args, &block); end
+
+  def inject_into_module(path, module_name, *args, &block); end
+
+  def insert_into_file(destination, *args, &block); end
+
+  def inside(dir=T.unsafe(nil), config=T.unsafe(nil), &block); end
+
+  def link_file(source, *args); end
+
+  def prepend_file(path, *args, &block); end
+
+  def prepend_to_file(path, *args, &block); end
+
+  def relative_to_original_destination_root(path, remove_dot=T.unsafe(nil)); end
+
+  def remove_dir(path, config=T.unsafe(nil)); end
+
+  def remove_file(path, config=T.unsafe(nil)); end
+
+  def run(command, config=T.unsafe(nil)); end
+
+  def run_ruby_script(command, config=T.unsafe(nil)); end
+
+  def source_paths(); end
+
+  def template(source, *args, &block); end
+
+  def thor(command, *args); end
+
+  def uncomment_lines(path, flag, *args); end
+  WARNINGS = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Actions::CapturableERB
+end
+
+class Bundler::Thor::Actions::CapturableERB
+end
+
+module Bundler::Thor::Actions::ClassMethods
+  def add_runtime_options!(); end
+
+  def source_paths(); end
+
+  def source_paths_for_search(); end
+
+  def source_root(path=T.unsafe(nil)); end
+end
+
+module Bundler::Thor::Actions::ClassMethods
+end
+
+class Bundler::Thor::Actions::CreateFile
+  def data(); end
+
+  def force_on_collision?(); end
+
+  def force_or_skip_or_conflict(force, skip, &block); end
+
+  def identical?(); end
+
+  def initialize(base, destination, data, config=T.unsafe(nil)); end
+
+  def on_conflict_behavior(&block); end
+
+  def render(); end
+end
+
+class Bundler::Thor::Actions::CreateFile
+end
+
+class Bundler::Thor::Actions::CreateLink
+end
+
+class Bundler::Thor::Actions::CreateLink
+end
+
+class Bundler::Thor::Actions::Directory
+  def execute!(); end
+
+  def file_level_lookup(previous_lookup); end
+
+  def files(lookup); end
+
+  def initialize(base, source, destination=T.unsafe(nil), config=T.unsafe(nil), &block); end
+
+  def source(); end
+end
+
+class Bundler::Thor::Actions::Directory
+end
+
+class Bundler::Thor::Actions::EmptyDirectory
+  def base(); end
+
+  def config(); end
+
+  def convert_encoded_instructions(filename); end
+
+  def destination(); end
+
+  def destination=(destination); end
+
+  def exists?(); end
+
+  def given_destination(); end
+
+  def initialize(base, destination, config=T.unsafe(nil)); end
+
+  def invoke!(); end
+
+  def invoke_with_conflict_check(&block); end
+
+  def on_conflict_behavior(); end
+
+  def on_file_clash_behavior(); end
+
+  def pretend?(); end
+
+  def relative_destination(); end
+
+  def revoke!(); end
+
+  def say_status(status, color); end
+end
+
+class Bundler::Thor::Actions::EmptyDirectory
+end
+
+class Bundler::Thor::Actions::InjectIntoFile
+  def behavior(); end
+
+  def flag(); end
+
+  def initialize(base, destination, data, config); end
+
+  def replace!(regexp, string, force); end
+
+  def replacement(); end
+
+  def say_status(behavior, warning: T.unsafe(nil), color: T.unsafe(nil)); end
+end
+
+class Bundler::Thor::Actions::InjectIntoFile
+end
+
+module Bundler::Thor::Actions
+  def self.included(base); end
+end
+
+class Bundler::Thor::AmbiguousCommandError
+end
+
+class Bundler::Thor::AmbiguousCommandError
+end
+
+Bundler::Thor::AmbiguousTaskError = Bundler::Thor::AmbiguousCommandError
+
+class Bundler::Thor::Argument
+  def banner(); end
+
+  def default(); end
+
+  def default_banner(); end
+
+  def description(); end
+
+  def enum(); end
+
+  def human_name(); end
+
+  def initialize(name, options=T.unsafe(nil)); end
+
+  def name(); end
+
+  def required(); end
+
+  def required?(); end
+
+  def show_default?(); end
+
+  def type(); end
+
+  def usage(); end
+
+  def valid_type?(type); end
+
+  def validate!(); end
+  VALID_TYPES = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Argument
+end
+
+class Bundler::Thor::Arguments
+  def initialize(arguments=T.unsafe(nil)); end
+
+  def parse(args); end
+
+  def remaining(); end
+  NUMERIC = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Arguments
+  def self.parse(*args); end
+
+  def self.split(args); end
+end
+
+module Bundler::Thor::Base
+  def args(); end
+
+  def args=(args); end
+
+  def initialize(args=T.unsafe(nil), local_options=T.unsafe(nil), config=T.unsafe(nil)); end
+
+  def options(); end
+
+  def options=(options); end
+
+  def parent_options(); end
+
+  def parent_options=(parent_options); end
+end
+
+module Bundler::Thor::Base::ClassMethods
+  def all_commands(); end
+
+  def all_tasks(); end
+
+  def allow_incompatible_default_type!(); end
+
+  def argument(name, options=T.unsafe(nil)); end
+
+  def arguments(); end
+
+  def attr_accessor(*arg); end
+
+  def attr_reader(*arg); end
+
+  def attr_writer(*arg); end
+
+  def baseclass(); end
+
+  def basename(); end
+
+  def build_option(name, options, scope); end
+
+  def build_options(options, scope); end
+
+  def check_default_type(); end
+
+  def check_default_type!(); end
+
+  def check_unknown_options(); end
+
+  def check_unknown_options!(); end
+
+  def check_unknown_options?(config); end
+
+  def class_option(name, options=T.unsafe(nil)); end
+
+  def class_options(options=T.unsafe(nil)); end
+
+  def class_options_help(shell, groups=T.unsafe(nil)); end
+
+  def commands(); end
+
+  def create_command(meth); end
+
+  def create_task(meth); end
+
+  def disable_required_check?(command_name); end
+
+  def dispatch(command, given_args, given_opts, config); end
+
+  def exit_on_failure?(); end
+
+  def find_and_refresh_command(name); end
+
+  def find_and_refresh_task(name); end
+
+  def from_superclass(method, default=T.unsafe(nil)); end
+
+  def group(name=T.unsafe(nil)); end
+
+  def handle_argument_error(command, error, args, arity); end
+
+  def handle_no_command_error(command, has_namespace=T.unsafe(nil)); end
+
+  def handle_no_task_error(command, has_namespace=T.unsafe(nil)); end
+
+  def inherited(klass); end
+
+  def initialize_added(); end
+
+  def is_thor_reserved_word?(word, type); end
+
+  def method_added(meth); end
+
+  def namespace(name=T.unsafe(nil)); end
+
+  def no_commands(&block); end
+
+  def no_commands?(); end
+
+  def no_commands_context(); end
+
+  def no_tasks(&block); end
+
+  def print_options(shell, options, group_name=T.unsafe(nil)); end
+
+  def public_command(*names); end
+
+  def public_task(*names); end
+
+  def remove_argument(*names); end
+
+  def remove_class_option(*names); end
+
+  def remove_command(*names); end
+
+  def remove_task(*names); end
+
+  def start(given_args=T.unsafe(nil), config=T.unsafe(nil)); end
+
+  def stop_on_unknown_option?(command_name); end
+
+  def strict_args_position(); end
+
+  def strict_args_position!(); end
+
+  def strict_args_position?(config); end
+
+  def tasks(); end
+end
+
+module Bundler::Thor::Base::ClassMethods
+end
+
+module Bundler::Thor::Base
+  def self.included(base); end
+
+  def self.register_klass_file(klass); end
+
+  def self.shell(); end
+
+  def self.shell=(shell); end
+
+  def self.subclass_files(); end
+
+  def self.subclasses(); end
+end
+
+class Bundler::Thor::Command
+  def formatted_usage(klass, namespace=T.unsafe(nil), subcommand=T.unsafe(nil)); end
+
+  def handle_argument_error?(instance, error, caller); end
+
+  def handle_no_method_error?(instance, error, caller); end
+
+  def hidden?(); end
+
+  def initialize(name, description, long_description, usage, options=T.unsafe(nil)); end
+
+  def local_method?(instance, name); end
+
+  def not_debugging?(instance); end
+
+  def private_method?(instance); end
+
+  def public_method?(instance); end
+
+  def required_arguments_for(klass, usage); end
+
+  def required_options(); end
+
+  def run(instance, args=T.unsafe(nil)); end
+
+  def sans_backtrace(backtrace, caller); end
+  FILE_REGEXP = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Command
+end
+
+module Bundler::Thor::CoreExt
+end
+
+class Bundler::Thor::CoreExt::HashWithIndifferentAccess
+  def [](key); end
+
+  def []=(key, value); end
+
+  def convert_key(key); end
+
+  def delete(key); end
+
+  def except(*keys); end
+
+  def fetch(key, *args); end
+
+  def initialize(hash=T.unsafe(nil)); end
+
+  def key?(key); end
+
+  def merge(other); end
+
+  def merge!(other); end
+
+  def method_missing(method, *args); end
+
+  def replace(other_hash); end
+
+  def reverse_merge(other); end
+
+  def reverse_merge!(other_hash); end
+
+  def values_at(*indices); end
+end
+
+class Bundler::Thor::CoreExt::HashWithIndifferentAccess
+end
+
+module Bundler::Thor::CoreExt
+end
+
+Bundler::Thor::Correctable = DidYouMean::Correctable
+
+class Bundler::Thor::DynamicCommand
+  def initialize(name, options=T.unsafe(nil)); end
+end
+
+class Bundler::Thor::DynamicCommand
+end
+
+Bundler::Thor::DynamicTask = Bundler::Thor::DynamicCommand
+
+class Bundler::Thor::Error
+end
+
+class Bundler::Thor::Error
+end
+
+class Bundler::Thor::Group
+  include ::Bundler::Thor::Base
+  include ::Bundler::Thor::Invocation
+  include ::Bundler::Thor::Shell
+  def _invoke_for_class_method(klass, command=T.unsafe(nil), *args, &block); end
+end
+
+class Bundler::Thor::Group
+  extend ::Bundler::Thor::Base::ClassMethods
+  extend ::Bundler::Thor::Invocation::ClassMethods
+  def self.banner(); end
+
+  def self.desc(description=T.unsafe(nil)); end
+
+  def self.get_options_from_invocations(group_options, base_options); end
+
+  def self.handle_argument_error(command, error, _args, arity); end
+
+  def self.help(shell); end
+
+  def self.invocation_blocks(); end
+
+  def self.invocations(); end
+
+  def self.invoke(*names, &block); end
+
+  def self.invoke_from_option(*names, &block); end
+
+  def self.printable_commands(*arg); end
+
+  def self.printable_tasks(*arg); end
+
+  def self.remove_invocation(*names); end
+
+  def self.self_command(); end
+
+  def self.self_task(); end
+end
+
+class Bundler::Thor::HiddenCommand
+end
+
+class Bundler::Thor::HiddenCommand
+end
+
+Bundler::Thor::HiddenTask = Bundler::Thor::HiddenCommand
+
+module Bundler::Thor::Invocation
+  def _parse_initialization_options(args, opts, config); end
+
+  def _retrieve_class_and_command(name, sent_command=T.unsafe(nil)); end
+
+  def _retrieve_class_and_task(name, sent_command=T.unsafe(nil)); end
+
+  def _shared_configuration(); end
+
+  def current_command_chain(); end
+
+  def initialize(args=T.unsafe(nil), options=T.unsafe(nil), config=T.unsafe(nil), &block); end
+
+  def invoke(name=T.unsafe(nil), *args); end
+
+  def invoke_all(); end
+
+  def invoke_command(command, *args); end
+
+  def invoke_task(command, *args); end
+
+  def invoke_with_padding(*args); end
+end
+
+module Bundler::Thor::Invocation::ClassMethods
+  def prepare_for_invocation(key, name); end
+end
+
+module Bundler::Thor::Invocation::ClassMethods
+end
+
+module Bundler::Thor::Invocation
+  def self.included(base); end
+end
+
+class Bundler::Thor::InvocationError
+end
+
+class Bundler::Thor::InvocationError
+end
+
+module Bundler::Thor::LineEditor
+end
+
+class Bundler::Thor::LineEditor::Basic
+  def initialize(prompt, options); end
+
+  def options(); end
+
+  def prompt(); end
+
+  def readline(); end
+end
+
+class Bundler::Thor::LineEditor::Basic
+  def self.available?(); end
+end
+
+class Bundler::Thor::LineEditor::Readline
+end
+
+class Bundler::Thor::LineEditor::Readline::PathCompletion
+  def initialize(text); end
+
+  def matches(); end
+end
+
+class Bundler::Thor::LineEditor::Readline::PathCompletion
+end
+
+class Bundler::Thor::LineEditor::Readline
+end
+
+module Bundler::Thor::LineEditor
+  def self.best_available(); end
+
+  def self.readline(prompt, options=T.unsafe(nil)); end
+end
+
+class Bundler::Thor::MalformattedArgumentError
+end
+
+class Bundler::Thor::MalformattedArgumentError
+end
+
+class Bundler::Thor::NestedContext
+  def enter(); end
+
+  def entered?(); end
+end
+
+class Bundler::Thor::NestedContext
+end
+
+class Bundler::Thor::NoKwargSpellChecker
+  def initialize(dictionary); end
+end
+
+class Bundler::Thor::NoKwargSpellChecker
+end
+
+class Bundler::Thor::Option
+  def aliases(); end
+
+  def array?(); end
+
+  def boolean?(); end
+
+  def dasherize(str); end
+
+  def dasherized?(); end
+
+  def group(); end
+
+  def hash?(); end
+
+  def hide(); end
+
+  def lazy_default(); end
+
+  def numeric?(); end
+
+  def repeatable(); end
+
+  def string?(); end
+
+  def switch_name(); end
+
+  def undasherize(str); end
+
+  def usage(padding=T.unsafe(nil)); end
+
+  def validate_default_type!(); end
+  VALID_TYPES = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Option
+  def self.parse(key, value); end
+end
+
+class Bundler::Thor::Options
+  def assign_result!(option, result); end
+
+  def check_unknown!(); end
+
+  def current_is_switch?(); end
+
+  def current_is_switch_formatted?(); end
+
+  def initialize(hash_options=T.unsafe(nil), defaults=T.unsafe(nil), stop_on_unknown=T.unsafe(nil), disable_required_check=T.unsafe(nil)); end
+
+  def normalize_switch(arg); end
+
+  def parse_boolean(switch); end
+
+  def parse_peek(switch, option); end
+
+  def parsing_options?(); end
+
+  def switch?(arg); end
+
+  def switch_option(arg); end
+
+  def unshift(arg, is_value: T.unsafe(nil)); end
+  EQ_RE = ::T.let(nil, ::T.untyped)
+  LONG_RE = ::T.let(nil, ::T.untyped)
+  OPTS_END = ::T.let(nil, ::T.untyped)
+  SHORT_NUM = ::T.let(nil, ::T.untyped)
+  SHORT_RE = ::T.let(nil, ::T.untyped)
+  SHORT_SQ_RE = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Options
+  def self.to_switches(options); end
+end
+
+module Bundler::Thor::RakeCompat
+  include ::Rake::DSL
+  include ::Rake::FileUtilsExt
+  include ::FileUtils
+  include ::FileUtils::StreamUtils_
+end
+
+module Bundler::Thor::RakeCompat
+  def self.included(base); end
+
+  def self.rake_classes(); end
+end
+
+class Bundler::Thor::RequiredArgumentMissingError
+end
+
+class Bundler::Thor::RequiredArgumentMissingError
+end
+
+module Bundler::Thor::Sandbox
+end
+
+module Bundler::Thor::Sandbox
+end
+
+module Bundler::Thor::Shell
+  def _shared_configuration(); end
+
+  def ask(*args, &block); end
+
+  def error(*args, &block); end
+
+  def file_collision(*args, &block); end
+
+  def initialize(args=T.unsafe(nil), options=T.unsafe(nil), config=T.unsafe(nil)); end
+
+  def no?(*args, &block); end
+
+  def print_in_columns(*args, &block); end
+
+  def print_table(*args, &block); end
+
+  def print_wrapped(*args, &block); end
+
+  def say(*args, &block); end
+
+  def say_error(*args, &block); end
+
+  def say_status(*args, &block); end
+
+  def set_color(*args, &block); end
+
+  def shell(); end
+
+  def shell=(shell); end
+
+  def terminal_width(*args, &block); end
+
+  def with_padding(); end
+
+  def yes?(*args, &block); end
+  SHELL_DELEGATED_METHODS = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Shell::Basic
+  def answer_match(possibilities, answer, case_insensitive); end
+
+  def as_unicode(); end
+
+  def ask(statement, *args); end
+
+  def ask_filtered(statement, color, options); end
+
+  def ask_simply(statement, color, options); end
+
+  def base(); end
+
+  def base=(base); end
+
+  def can_display_colors?(); end
+
+  def dynamic_width(); end
+
+  def dynamic_width_stty(); end
+
+  def dynamic_width_tput(); end
+
+  def error(statement); end
+
+  def file_collision(destination); end
+
+  def file_collision_help(); end
+
+  def git_merge_tool(); end
+
+  def indent(count=T.unsafe(nil)); end
+
+  def is?(value); end
+
+  def lookup_color(color); end
+
+  def merge(destination, content); end
+
+  def merge_tool(); end
+
+  def mute(); end
+
+  def mute?(); end
+
+  def no?(statement, color=T.unsafe(nil)); end
+
+  def padding(); end
+
+  def padding=(value); end
+
+  def prepare_message(message, *color); end
+
+  def print_in_columns(array); end
+
+  def print_table(array, options=T.unsafe(nil)); end
+
+  def print_wrapped(message, options=T.unsafe(nil)); end
+
+  def quiet?(); end
+
+  def say(message=T.unsafe(nil), color=T.unsafe(nil), force_new_line=T.unsafe(nil)); end
+
+  def say_error(message=T.unsafe(nil), color=T.unsafe(nil), force_new_line=T.unsafe(nil)); end
+
+  def say_status(status, message, log_status=T.unsafe(nil)); end
+
+  def set_color(string, *arg); end
+
+  def show_diff(destination, content); end
+
+  def stderr(); end
+
+  def stdout(); end
+
+  def terminal_width(); end
+
+  def truncate(string, width); end
+
+  def unix?(); end
+
+  def yes?(statement, color=T.unsafe(nil)); end
+  DEFAULT_TERMINAL_WIDTH = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Shell::Basic
+end
+
+class Bundler::Thor::Shell::Color
+  def are_colors_disabled?(); end
+
+  def are_colors_supported?(); end
+
+  def diff_lcs_loaded?(); end
+
+  def output_diff_line(diff); end
+
+  def set_color(string, *colors); end
+  BLACK = ::T.let(nil, ::T.untyped)
+  BLUE = ::T.let(nil, ::T.untyped)
+  BOLD = ::T.let(nil, ::T.untyped)
+  CLEAR = ::T.let(nil, ::T.untyped)
+  CYAN = ::T.let(nil, ::T.untyped)
+  GREEN = ::T.let(nil, ::T.untyped)
+  MAGENTA = ::T.let(nil, ::T.untyped)
+  ON_BLACK = ::T.let(nil, ::T.untyped)
+  ON_BLUE = ::T.let(nil, ::T.untyped)
+  ON_CYAN = ::T.let(nil, ::T.untyped)
+  ON_GREEN = ::T.let(nil, ::T.untyped)
+  ON_MAGENTA = ::T.let(nil, ::T.untyped)
+  ON_RED = ::T.let(nil, ::T.untyped)
+  ON_WHITE = ::T.let(nil, ::T.untyped)
+  ON_YELLOW = ::T.let(nil, ::T.untyped)
+  RED = ::T.let(nil, ::T.untyped)
+  WHITE = ::T.let(nil, ::T.untyped)
+  YELLOW = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Shell::Color
+end
+
+class Bundler::Thor::Shell::HTML
+  def ask(statement, color=T.unsafe(nil)); end
+
+  def diff_lcs_loaded?(); end
+
+  def output_diff_line(diff); end
+
+  def set_color(string, *colors); end
+  BLACK = ::T.let(nil, ::T.untyped)
+  BLUE = ::T.let(nil, ::T.untyped)
+  BOLD = ::T.let(nil, ::T.untyped)
+  CYAN = ::T.let(nil, ::T.untyped)
+  GREEN = ::T.let(nil, ::T.untyped)
+  MAGENTA = ::T.let(nil, ::T.untyped)
+  ON_BLACK = ::T.let(nil, ::T.untyped)
+  ON_BLUE = ::T.let(nil, ::T.untyped)
+  ON_CYAN = ::T.let(nil, ::T.untyped)
+  ON_GREEN = ::T.let(nil, ::T.untyped)
+  ON_MAGENTA = ::T.let(nil, ::T.untyped)
+  ON_RED = ::T.let(nil, ::T.untyped)
+  ON_WHITE = ::T.let(nil, ::T.untyped)
+  ON_YELLOW = ::T.let(nil, ::T.untyped)
+  RED = ::T.let(nil, ::T.untyped)
+  WHITE = ::T.let(nil, ::T.untyped)
+  YELLOW = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::Thor::Shell::HTML
+end
+
+module Bundler::Thor::Shell
+end
+
+Bundler::Thor::Task = Bundler::Thor::Command
+
+class Bundler::Thor::UndefinedCommandError
+  include ::DidYouMean::Correctable
+  def all_commands(); end
+
+  def command(); end
+
+  def initialize(command, all_commands, namespace); end
+end
+
+class Bundler::Thor::UndefinedCommandError::SpellChecker
+  def corrections(); end
+
+  def error(); end
+
+  def initialize(error); end
+
+  def spell_checker(); end
+end
+
+class Bundler::Thor::UndefinedCommandError::SpellChecker
+end
+
+class Bundler::Thor::UndefinedCommandError
+end
+
+Bundler::Thor::UndefinedTaskError = Bundler::Thor::UndefinedCommandError
+
+class Bundler::Thor::UnknownArgumentError
+  include ::DidYouMean::Correctable
+  def initialize(switches, unknown); end
+
+  def switches(); end
+
+  def unknown(); end
+end
+
+class Bundler::Thor::UnknownArgumentError::SpellChecker
+  def corrections(); end
+
+  def error(); end
+
+  def initialize(error); end
+
+  def spell_checker(); end
+end
+
+class Bundler::Thor::UnknownArgumentError::SpellChecker
+end
+
+class Bundler::Thor::UnknownArgumentError
+end
+
+module Bundler::Thor::Util
+end
+
+module Bundler::Thor::Util
+  def self.camel_case(str); end
+
+  def self.escape_globs(path); end
+
+  def self.escape_html(string); end
+
+  def self.find_by_namespace(namespace); end
+
+  def self.find_class_and_command_by_namespace(namespace, fallback=T.unsafe(nil)); end
+
+  def self.find_class_and_task_by_namespace(namespace, fallback=T.unsafe(nil)); end
+
+  def self.globs_for(path); end
+
+  def self.load_thorfile(path, content=T.unsafe(nil), debug=T.unsafe(nil)); end
+
+  def self.namespace_from_thor_class(constant); end
+
+  def self.namespaces_in_content(contents, file=T.unsafe(nil)); end
+
+  def self.ruby_command(); end
+
+  def self.snake_case(str); end
+
+  def self.thor_classes_in(klass); end
+
+  def self.thor_root(); end
+
+  def self.thor_root_glob(); end
+
+  def self.user_home(); end
+end
+
+class Bundler::Thor
+  extend ::Bundler::Thor::Base::ClassMethods
+  extend ::Bundler::Thor::Invocation::ClassMethods
+  def self.banner(command, namespace=T.unsafe(nil), subcommand=T.unsafe(nil)); end
+
+  def self.check_unknown_options!(options=T.unsafe(nil)); end
+
+  def self.command_help(shell, command_name); end
+
+  def self.default_command(meth=T.unsafe(nil)); end
+
+  def self.default_task(meth=T.unsafe(nil)); end
+
+  def self.deprecation_warning(message); end
+
+  def self.desc(usage, description, options=T.unsafe(nil)); end
+
+  def self.disable_required_check(); end
+
+  def self.disable_required_check!(*command_names); end
+
+  def self.disable_required_check?(command); end
+
+  def self.dispatch(meth, given_args, given_opts, config); end
+
+  def self.dynamic_command_class(); end
+
+  def self.find_command_possibilities(meth); end
+
+  def self.find_task_possibilities(meth); end
+
+  def self.help(shell, subcommand=T.unsafe(nil)); end
+
+  def self.long_desc(long_description, options=T.unsafe(nil)); end
+
+  def self.map(mappings=T.unsafe(nil), **kw); end
+
+  def self.method_option(name, options=T.unsafe(nil)); end
+
+  def self.method_options(options=T.unsafe(nil)); end
+
+  def self.normalize_command_name(meth); end
+
+  def self.normalize_task_name(meth); end
+
+  def self.option(name, options=T.unsafe(nil)); end
+
+  def self.options(options=T.unsafe(nil)); end
+
+  def self.package_name(name, _=T.unsafe(nil)); end
+
+  def self.printable_commands(all=T.unsafe(nil), subcommand=T.unsafe(nil)); end
+
+  def self.printable_tasks(all=T.unsafe(nil), subcommand=T.unsafe(nil)); end
+
+  def self.register(klass, subcommand_name, usage, description, options=T.unsafe(nil)); end
+
+  def self.retrieve_command_name(args); end
+
+  def self.retrieve_task_name(args); end
+
+  def self.stop_on_unknown_option(); end
+
+  def self.stop_on_unknown_option!(*command_names); end
+
+  def self.stop_on_unknown_option?(command); end
+
+  def self.subcommand(subcommand, subcommand_class); end
+
+  def self.subcommand_classes(); end
+
+  def self.subcommand_help(cmd); end
+
+  def self.subcommands(); end
+
+  def self.subtask(subcommand, subcommand_class); end
+
+  def self.subtask_help(cmd); end
+
+  def self.subtasks(); end
+
+  def self.task_help(shell, command_name); end
+end
+
+class Bundler::UI::Shell
+  def add_color(string, *color); end
+
+  def ask(msg); end
+
+  def confirm(msg, newline=T.unsafe(nil)); end
+
+  def debug(msg, newline=T.unsafe(nil)); end
+
+  def debug?(); end
+
+  def error(msg, newline=T.unsafe(nil), color=T.unsafe(nil)); end
+
+  def info(msg, newline=T.unsafe(nil)); end
+
+  def initialize(options=T.unsafe(nil)); end
+
+  def level(name=T.unsafe(nil)); end
+
+  def level=(level); end
+
+  def no?(); end
+
+  def quiet?(); end
+
+  def shell=(shell); end
+
+  def silence(&blk); end
+
+  def trace(e, newline=T.unsafe(nil), force=T.unsafe(nil)); end
+
+  def unprinted_warnings(); end
+
+  def warn(msg, newline=T.unsafe(nil), color=T.unsafe(nil)); end
+
+  def yes?(msg); end
+  LEVELS = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::UI::Shell
+end
+
+module Bundler::URI
+  include ::Bundler::URI::RFC2396_REGEXP
+  ABS_PATH = ::T.let(nil, ::T.untyped)
+  ABS_URI = ::T.let(nil, ::T.untyped)
+  ABS_URI_REF = ::T.let(nil, ::T.untyped)
+  DEFAULT_PARSER = ::T.let(nil, ::T.untyped)
+  ESCAPED = ::T.let(nil, ::T.untyped)
+  FRAGMENT = ::T.let(nil, ::T.untyped)
+  HOST = ::T.let(nil, ::T.untyped)
+  OPAQUE = ::T.let(nil, ::T.untyped)
+  PORT = ::T.let(nil, ::T.untyped)
+  QUERY = ::T.let(nil, ::T.untyped)
+  REGISTRY = ::T.let(nil, ::T.untyped)
+  REL_PATH = ::T.let(nil, ::T.untyped)
+  REL_URI = ::T.let(nil, ::T.untyped)
+  REL_URI_REF = ::T.let(nil, ::T.untyped)
+  RFC3986_PARSER = ::T.let(nil, ::T.untyped)
+  SCHEME = ::T.let(nil, ::T.untyped)
+  TBLDECWWWCOMP_ = ::T.let(nil, ::T.untyped)
+  TBLENCWWWCOMP_ = ::T.let(nil, ::T.untyped)
+  UNSAFE = ::T.let(nil, ::T.untyped)
+  URI_REF = ::T.let(nil, ::T.untyped)
+  USERINFO = ::T.let(nil, ::T.untyped)
+  VERSION = ::T.let(nil, ::T.untyped)
+  VERSION_CODE = ::T.let(nil, ::T.untyped)
+  WEB_ENCODINGS_ = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::BadURIError
+end
+
+class Bundler::URI::BadURIError
+end
+
+class Bundler::URI::Error
+end
+
+class Bundler::URI::Error
+end
+
+class Bundler::URI::FTP
+  def set_typecode(v); end
+
+  def typecode(); end
+
+  def typecode=(typecode); end
+  COMPONENT = ::T.let(nil, ::T.untyped)
+  DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+  TYPECODE = ::T.let(nil, ::T.untyped)
+  TYPECODE_PREFIX = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::FTP
+  def self.new2(user, password, host, port, path, typecode=T.unsafe(nil), arg_check=T.unsafe(nil)); end
+end
+
+class Bundler::URI::File
+  def check_password(user); end
+
+  def check_user(user); end
+
+  def check_userinfo(user); end
+
+  def set_userinfo(v); end
+  COMPONENT = ::T.let(nil, ::T.untyped)
+  DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::File
+end
+
+class Bundler::URI::Generic
+  include ::Bundler::URI
+  include ::Bundler::URI::RFC2396_REGEXP
+  def +(oth); end
+
+  def -(oth); end
+
+  def ==(oth); end
+
+  def absolute(); end
+
+  def absolute?(); end
+
+  def coerce(oth); end
+
+  def component(); end
+
+  def component_ary(); end
+
+  def default_port(); end
+
+  def eql?(oth); end
+
+  def find_proxy(env=T.unsafe(nil)); end
+
+  def fragment(); end
+
+  def fragment=(v); end
+
+  def hierarchical?(); end
+
+  def host(); end
+
+  def host=(v); end
+
+  def hostname(); end
+
+  def hostname=(v); end
+
+  def initialize(scheme, userinfo, host, port, registry, path, opaque, query, fragment, parser=T.unsafe(nil), arg_check=T.unsafe(nil)); end
+
+  def merge(oth); end
+
+  def merge!(oth); end
+
+  def normalize(); end
+
+  def normalize!(); end
+
+  def opaque(); end
+
+  def opaque=(v); end
+
+  def parser(); end
+
+  def password(); end
+
+  def password=(password); end
+
+  def path(); end
+
+  def path=(v); end
+
+  def port(); end
+
+  def port=(v); end
+
+  def query(); end
+
+  def query=(v); end
+
+  def registry(); end
+
+  def registry=(v); end
+
+  def relative?(); end
+
+  def route_from(oth); end
+
+  def route_to(oth); end
+
+  def scheme(); end
+
+  def scheme=(v); end
+
+  def select(*components); end
+
+  def set_host(v); end
+
+  def set_opaque(v); end
+
+  def set_password(v); end
+
+  def set_path(v); end
+
+  def set_port(v); end
+
+  def set_registry(v); end
+
+  def set_scheme(v); end
+
+  def set_user(v); end
+
+  def set_userinfo(user, password=T.unsafe(nil)); end
+
+  def user(); end
+
+  def user=(user); end
+
+  def userinfo(); end
+
+  def userinfo=(userinfo); end
+  COMPONENT = ::T.let(nil, ::T.untyped)
+  DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+  USE_REGISTRY = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::Generic
+  def self.build(args); end
+
+  def self.build2(args); end
+
+  def self.component(); end
+
+  def self.default_port(); end
+
+  def self.use_proxy?(hostname, addr, port, no_proxy); end
+
+  def self.use_registry(); end
+end
+
+class Bundler::URI::HTTP
+  def request_uri(); end
+  COMPONENT = ::T.let(nil, ::T.untyped)
+  DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::HTTP
+end
+
+class Bundler::URI::HTTPS
+  DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::HTTPS
+end
+
+class Bundler::URI::InvalidComponentError
+end
+
+class Bundler::URI::InvalidComponentError
+end
+
+class Bundler::URI::InvalidURIError
+end
+
+class Bundler::URI::InvalidURIError
+end
+
+class Bundler::URI::LDAP
+  def attributes(); end
+
+  def attributes=(val); end
+
+  def dn(); end
+
+  def dn=(val); end
+
+  def extensions(); end
+
+  def extensions=(val); end
+
+  def filter(); end
+
+  def filter=(val); end
+
+  def initialize(*arg); end
+
+  def scope(); end
+
+  def scope=(val); end
+
+  def set_attributes(val); end
+
+  def set_dn(val); end
+
+  def set_extensions(val); end
+
+  def set_filter(val); end
+
+  def set_scope(val); end
+  COMPONENT = ::T.let(nil, ::T.untyped)
+  DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+  SCOPE = ::T.let(nil, ::T.untyped)
+  SCOPE_BASE = ::T.let(nil, ::T.untyped)
+  SCOPE_ONE = ::T.let(nil, ::T.untyped)
+  SCOPE_SUB = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::LDAP
+end
+
+class Bundler::URI::LDAPS
+  DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::LDAPS
+end
+
+class Bundler::URI::MailTo
+  def headers(); end
+
+  def headers=(v); end
+
+  def initialize(*arg); end
+
+  def set_headers(v); end
+
+  def set_to(v); end
+
+  def to(); end
+
+  def to=(v); end
+
+  def to_mailtext(); end
+
+  def to_rfc822text(); end
+  COMPONENT = ::T.let(nil, ::T.untyped)
+  DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+  EMAIL_REGEXP = ::T.let(nil, ::T.untyped)
+  HEADER_REGEXP = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::MailTo
+end
+
+Bundler::URI::Parser = Bundler::URI::RFC2396_Parser
+
+Bundler::URI::REGEXP = Bundler::URI::RFC2396_REGEXP
+
+class Bundler::URI::RFC2396_Parser
+  include ::Bundler::URI::RFC2396_REGEXP
+  def escape(str, unsafe=T.unsafe(nil)); end
+
+  def extract(str, schemes=T.unsafe(nil)); end
+
+  def initialize(opts=T.unsafe(nil)); end
+
+  def join(*uris); end
+
+  def make_regexp(schemes=T.unsafe(nil)); end
+
+  def parse(uri); end
+
+  def pattern(); end
+
+  def regexp(); end
+
+  def split(uri); end
+
+  def unescape(str, escaped=T.unsafe(nil)); end
+end
+
+class Bundler::URI::RFC2396_Parser
+end
+
+module Bundler::URI::RFC2396_REGEXP
+end
+
+module Bundler::URI::RFC2396_REGEXP::PATTERN
+  ABS_PATH = ::T.let(nil, ::T.untyped)
+  ABS_URI = ::T.let(nil, ::T.untyped)
+  ALNUM = ::T.let(nil, ::T.untyped)
+  ALPHA = ::T.let(nil, ::T.untyped)
+  DOMLABEL = ::T.let(nil, ::T.untyped)
+  ESCAPED = ::T.let(nil, ::T.untyped)
+  FRAGMENT = ::T.let(nil, ::T.untyped)
+  HEX = ::T.let(nil, ::T.untyped)
+  HIER_PART = ::T.let(nil, ::T.untyped)
+  HOST = ::T.let(nil, ::T.untyped)
+  HOSTNAME = ::T.let(nil, ::T.untyped)
+  HOSTPORT = ::T.let(nil, ::T.untyped)
+  IPV4ADDR = ::T.let(nil, ::T.untyped)
+  IPV6ADDR = ::T.let(nil, ::T.untyped)
+  IPV6REF = ::T.let(nil, ::T.untyped)
+  NET_PATH = ::T.let(nil, ::T.untyped)
+  OPAQUE_PART = ::T.let(nil, ::T.untyped)
+  PATH_SEGMENTS = ::T.let(nil, ::T.untyped)
+  PORT = ::T.let(nil, ::T.untyped)
+  QUERY = ::T.let(nil, ::T.untyped)
+  REG_NAME = ::T.let(nil, ::T.untyped)
+  REL_PATH = ::T.let(nil, ::T.untyped)
+  REL_SEGMENT = ::T.let(nil, ::T.untyped)
+  REL_URI = ::T.let(nil, ::T.untyped)
+  RESERVED = ::T.let(nil, ::T.untyped)
+  SCHEME = ::T.let(nil, ::T.untyped)
+  TOPLABEL = ::T.let(nil, ::T.untyped)
+  UNRESERVED = ::T.let(nil, ::T.untyped)
+  URIC = ::T.let(nil, ::T.untyped)
+  URIC_NO_SLASH = ::T.let(nil, ::T.untyped)
+  URI_REF = ::T.let(nil, ::T.untyped)
+  USERINFO = ::T.let(nil, ::T.untyped)
+  X_ABS_URI = ::T.let(nil, ::T.untyped)
+  X_REL_URI = ::T.let(nil, ::T.untyped)
+end
+
+module Bundler::URI::RFC2396_REGEXP::PATTERN
+end
+
+module Bundler::URI::RFC2396_REGEXP
+end
+
+class Bundler::URI::RFC3986_Parser
+  def join(*uris); end
+
+  def parse(uri); end
+
+  def regexp(); end
+
+  def split(uri); end
+  RFC3986_URI = ::T.let(nil, ::T.untyped)
+  RFC3986_relative_ref = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::URI::RFC3986_Parser
+end
+
+module Bundler::URI::Util
+end
+
+module Bundler::URI::Util
+  def self.make_components_hash(klass, array_hash); end
+end
+
+module Bundler::URI
+  def self.decode_www_form(str, enc=T.unsafe(nil), separator: T.unsafe(nil), use__charset_: T.unsafe(nil), isindex: T.unsafe(nil)); end
+
+  def self.decode_www_form_component(str, enc=T.unsafe(nil)); end
+
+  def self.encode_www_form(enum, enc=T.unsafe(nil)); end
+
+  def self.encode_www_form_component(str, enc=T.unsafe(nil)); end
+
+  def self.extract(str, schemes=T.unsafe(nil), &block); end
+
+  def self.for(scheme, *arguments, default: T.unsafe(nil)); end
+
+  def self.get_encoding(label); end
+
+  def self.join(*str); end
+
+  def self.parse(uri); end
+
+  def self.regexp(schemes=T.unsafe(nil)); end
+
+  def self.scheme_list(); end
+
+  def self.split(uri); end
+end
+
+module Bundler::VersionRanges
+end
+
+class Bundler::VersionRanges::NEq
+  def version(); end
+
+  def version=(_); end
+end
+
+class Bundler::VersionRanges::NEq
+  def self.[](*arg); end
+
+  def self.members(); end
+end
+
+class Bundler::VersionRanges::ReqR
+  def cover?(v); end
+
+  def empty?(); end
+
+  def left(); end
+
+  def left=(_); end
+
+  def right(); end
+
+  def right=(_); end
+
+  def single?(); end
+  INFINITY = ::T.let(nil, ::T.untyped)
+  UNIVERSAL = ::T.let(nil, ::T.untyped)
+  ZERO = ::T.let(nil, ::T.untyped)
+end
+
+class Bundler::VersionRanges::ReqR::Endpoint
+  def inclusive(); end
+
+  def inclusive=(_); end
+
+  def version(); end
+
+  def version=(_); end
+end
+
+class Bundler::VersionRanges::ReqR::Endpoint
+  def self.[](*arg); end
+
+  def self.members(); end
+end
+
+class Bundler::VersionRanges::ReqR
+  def self.[](*arg); end
+
+  def self.members(); end
+end
+
+module Bundler::VersionRanges
+  def self.empty?(ranges, neqs); end
+
+  def self.for(requirement); end
+
+  def self.for_many(requirements); end
+end
+
+module Bundler
+  def self.configure_gem_home_and_path(path=T.unsafe(nil)); end
+
+  def self.most_specific_locked_platform?(platform); end
+
+  def self.original_exec(*args); end
+
+  def self.original_system(*args); end
+
+  def self.preferred_gemfile_name(); end
+
+  def self.reset_settings_and_root!(); end
+
+  def self.self_manager(); end
+
+  def self.unbundled_env(); end
+
+  def self.unbundled_exec(*args); end
+
+  def self.unbundled_system(*args); end
+end
+
+module CGI::HtmlExtension
+  def a(href=T.unsafe(nil)); end
+
+  def base(href=T.unsafe(nil)); end
+
+  def blockquote(cite=T.unsafe(nil)); end
+
+  def caption(align=T.unsafe(nil)); end
+
+  def checkbox(name=T.unsafe(nil), value=T.unsafe(nil), checked=T.unsafe(nil)); end
+
+  def checkbox_group(name=T.unsafe(nil), *values); end
+
+  def file_field(name=T.unsafe(nil), size=T.unsafe(nil), maxlength=T.unsafe(nil)); end
+
+  def form(method=T.unsafe(nil), action=T.unsafe(nil), enctype=T.unsafe(nil)); end
+
+  def hidden(name=T.unsafe(nil), value=T.unsafe(nil)); end
+
+  def html(attributes=T.unsafe(nil)); end
+
+  def image_button(src=T.unsafe(nil), name=T.unsafe(nil), alt=T.unsafe(nil)); end
+
+  def img(src=T.unsafe(nil), alt=T.unsafe(nil), width=T.unsafe(nil), height=T.unsafe(nil)); end
+
+  def multipart_form(action=T.unsafe(nil), enctype=T.unsafe(nil)); end
+
+  def password_field(name=T.unsafe(nil), value=T.unsafe(nil), size=T.unsafe(nil), maxlength=T.unsafe(nil)); end
+
+  def popup_menu(name=T.unsafe(nil), *values); end
+
+  def radio_button(name=T.unsafe(nil), value=T.unsafe(nil), checked=T.unsafe(nil)); end
+
+  def radio_group(name=T.unsafe(nil), *values); end
+
+  def reset(value=T.unsafe(nil), name=T.unsafe(nil)); end
+
+  def scrolling_list(name=T.unsafe(nil), *values); end
+
+  def submit(value=T.unsafe(nil), name=T.unsafe(nil)); end
+
+  def text_field(name=T.unsafe(nil), value=T.unsafe(nil), size=T.unsafe(nil), maxlength=T.unsafe(nil)); end
+
+  def textarea(name=T.unsafe(nil), cols=T.unsafe(nil), rows=T.unsafe(nil)); end
+end
+
+module CGI::HtmlExtension
+end
+
+module Cane
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Cane::AbcCheck::RubyAst
+  METH_CHARS = ::T.let(nil, ::T.untyped)
+end
+
+class Cane::DocCheck
+  CLASS_REGEX = ::T.let(nil, ::T.untyped)
+  DESCRIPTION = ::T.let(nil, ::T.untyped)
+  MAGIC_COMMENT_REGEX = ::T.let(nil, ::T.untyped)
+  METHOD_REGEX = ::T.let(nil, ::T.untyped)
+  SINGLE_LINE_CLASS_REGEX = ::T.let(nil, ::T.untyped)
+end
+
+class Cane::ThresholdCheck
+  THRESHOLDS = ::T.let(nil, ::T.untyped)
+end
+
+class Class
+  def json_creatable?(); end
+end
+
+module CodeRay
+  CODERAY_PATH = ::T.let(nil, ::T.untyped)
+  TokenKinds = ::T.let(nil, ::T.untyped)
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class CodeRay::Encoders::Encoder
+  DEFAULT_OPTIONS = ::T.let(nil, ::T.untyped)
+end
+
+CodeRay::Encoders::Encoder::PLUGIN_HOST = CodeRay::Encoders
+
+class CodeRay::Encoders::HTML
+  DEFAULT_OPTIONS = ::T.let(nil, ::T.untyped)
+  FILE_EXTENSION = ::T.let(nil, ::T.untyped)
+  HTML_ESCAPE = ::T.let(nil, ::T.untyped)
+  HTML_ESCAPE_PATTERN = ::T.let(nil, ::T.untyped)
+  TOKEN_KIND_TO_INFO = ::T.let(nil, ::T.untyped)
+  TRANSPARENT_TOKEN_KINDS = ::T.let(nil, ::T.untyped)
+end
+
+class CodeRay::Encoders::HTML::CSS
+  CSS_CLASS_PATTERN = ::T.let(nil, ::T.untyped)
+end
+
+module CodeRay::Encoders::HTML::Output
+  DIV = ::T.let(nil, ::T.untyped)
+  PAGE = ::T.let(nil, ::T.untyped)
+  SPAN = ::T.let(nil, ::T.untyped)
+  TABLE = ::T.let(nil, ::T.untyped)
+end
+
+class CodeRay::Encoders::Terminal
+  TOKEN_COLORS = ::T.let(nil, ::T.untyped)
+end
+
+module CodeRay::FileType
+  TypeFromExt = ::T.let(nil, ::T.untyped)
+  TypeFromName = ::T.let(nil, ::T.untyped)
+  TypeFromShebang = ::T.let(nil, ::T.untyped)
+end
+
+module CodeRay::PluginHost
+  PLUGIN_HOSTS = ::T.let(nil, ::T.untyped)
+  PLUGIN_HOSTS_BY_ID = ::T.let(nil, ::T.untyped)
+end
+
+class CodeRay::Scanners::Java
+  CONSTANTS = ::T.let(nil, ::T.untyped)
+  DIRECTIVES = ::T.let(nil, ::T.untyped)
+  ESCAPE = ::T.let(nil, ::T.untyped)
+  IDENT = ::T.let(nil, ::T.untyped)
+  IDENT_KIND = ::T.let(nil, ::T.untyped)
+  KEYWORDS = ::T.let(nil, ::T.untyped)
+  MAGIC_VARIABLES = ::T.let(nil, ::T.untyped)
+  RESERVED = ::T.let(nil, ::T.untyped)
+  STRING_CONTENT_PATTERN = ::T.let(nil, ::T.untyped)
+  TYPES = ::T.let(nil, ::T.untyped)
+  UNICODE_ESCAPE = ::T.let(nil, ::T.untyped)
+end
+
+module CodeRay::Scanners::Java::BuiltinTypes
+  List = ::T.let(nil, ::T.untyped)
+end
+
+module CodeRay::Scanners::Ruby::Patterns
+  BINARY = ::T.let(nil, ::T.untyped)
+  CHARACTER = ::T.let(nil, ::T.untyped)
+  CLASS_VARIABLE = ::T.let(nil, ::T.untyped)
+  CONTROL_META_ESCAPE = ::T.let(nil, ::T.untyped)
+  DATA = ::T.let(nil, ::T.untyped)
+  DECIMAL = ::T.let(nil, ::T.untyped)
+  ESCAPE = ::T.let(nil, ::T.untyped)
+  EXPONENT = ::T.let(nil, ::T.untyped)
+  FANCY_STRING_INTERPRETED = ::T.let(nil, ::T.untyped)
+  FANCY_STRING_KIND = ::T.let(nil, ::T.untyped)
+  FANCY_STRING_START = ::T.let(nil, ::T.untyped)
+  FLOAT_OR_INT = ::T.let(nil, ::T.untyped)
+  FLOAT_SUFFIX = ::T.let(nil, ::T.untyped)
+  GLOBAL_VARIABLE = ::T.let(nil, ::T.untyped)
+  HEREDOC_OPEN = ::T.let(nil, ::T.untyped)
+  HEXADECIMAL = ::T.let(nil, ::T.untyped)
+  IDENT = ::T.let(nil, ::T.untyped)
+  IDENT_KIND = ::T.let(nil, ::T.untyped)
+  INSTANCE_VARIABLE = ::T.let(nil, ::T.untyped)
+  KEYWORDS = ::T.let(nil, ::T.untyped)
+  KEYWORDS_EXPECTING_VALUE = ::T.let(nil, ::T.untyped)
+  KEYWORD_NEW_STATE = ::T.let(nil, ::T.untyped)
+  METHOD_AFTER_DOT = ::T.let(nil, ::T.untyped)
+  METHOD_NAME = ::T.let(nil, ::T.untyped)
+  METHOD_NAME_EX = ::T.let(nil, ::T.untyped)
+  METHOD_NAME_OPERATOR = ::T.let(nil, ::T.untyped)
+  METHOD_NAME_OR_SYMBOL = ::T.let(nil, ::T.untyped)
+  METHOD_SUFFIX = ::T.let(nil, ::T.untyped)
+  NUMERIC = ::T.let(nil, ::T.untyped)
+  OBJECT_VARIABLE = ::T.let(nil, ::T.untyped)
+  OCTAL = ::T.let(nil, ::T.untyped)
+  PREDEFINED_CONSTANTS = ::T.let(nil, ::T.untyped)
+  PREFIX_VARIABLE = ::T.let(nil, ::T.untyped)
+  QUOTE_TO_TYPE = ::T.let(nil, ::T.untyped)
+  REGEXP_MODIFIERS = ::T.let(nil, ::T.untyped)
+  RUBYDOC = ::T.let(nil, ::T.untyped)
+  RUBYDOC_OR_DATA = ::T.let(nil, ::T.untyped)
+  SIMPLE_ESCAPE = ::T.let(nil, ::T.untyped)
+  SYMBOL = ::T.let(nil, ::T.untyped)
+  VALUE_FOLLOWS = ::T.let(nil, ::T.untyped)
+  VARIABLE = ::T.let(nil, ::T.untyped)
+end
+
+class CodeRay::Scanners::Ruby::StringState
+  CLOSING_PAREN = ::T.let(nil, ::T.untyped)
+  STRING_PATTERN = ::T.let(nil, ::T.untyped)
+end
+
+class CodeRay::Scanners::Scanner
+  DEFAULT_OPTIONS = ::T.let(nil, ::T.untyped)
+  KINDS_NOT_LOC = ::T.let(nil, ::T.untyped)
+  SCANNER_STATE_INFO = ::T.let(nil, ::T.untyped)
+  SCAN_ERROR_MESSAGE = ::T.let(nil, ::T.untyped)
+end
+
+CodeRay::Scanners::Scanner::PLUGIN_HOST = CodeRay::Scanners
+
+class CodeRay::Styles::Style
+  DEFAULT_OPTIONS = ::T.let(nil, ::T.untyped)
+end
+
+CodeRay::Styles::Style::PLUGIN_HOST = CodeRay::Styles
+
+module Commander
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Commander::HelpFormatter::Base
+  def initialize(runner); end
+
+  def render(); end
+
+  def render_command(command); end
+end
+
+class Commander::HelpFormatter::Base
+end
+
+class Commander::HelpFormatter::Terminal
+  def template(name); end
+end
+
+class Commander::HelpFormatter::Terminal
+end
+
+class Commander::HelpFormatter::TerminalCompact
+end
+
+class Commander::HelpFormatter::TerminalCompact
+end
+
+module Commander::UI::AskForClass
+  DEPRECATED_CONSTANTS = ::T.let(nil, ::T.untyped)
+end
+
+class DRb::DRbArray
+  def _dump(lv); end
+end
+
+class DRb::DRbArray
+  def self._load(s); end
+end
+
+class DRb::DRbConn
+  def alive?(); end
+
+  def close(); end
+
+  def initialize(remote_uri); end
+
+  def send_message(ref, msg_id, arg, block); end
+
+  def uri(); end
+end
+
+class DRb::DRbConn
+  def self.make_pool(); end
+
+  def self.open(remote_uri); end
+
+  def self.stop_pool(); end
+end
+
+class DRb::DRbMessage
+  def dump(obj, error=T.unsafe(nil)); end
+
+  def initialize(config); end
+
+  def load(soc); end
+
+  def recv_reply(stream); end
+
+  def recv_request(stream); end
+
+  def send_reply(stream, succ, result); end
+
+  def send_request(stream, ref, msg_id, arg, b); end
+end
+
+class DRb::DRbObject
+  def ==(other); end
+
+  def eql?(other); end
+
+  def initialize(obj, uri=T.unsafe(nil)); end
+end
+
+class DRb::DRbObject
+  def self.prepare_backtrace(uri, result); end
+
+  def self.with_friend(uri); end
+end
+
+module DRb::DRbProtocol
+  def self.auto_load(uri); end
+end
+
+class DRb::DRbRemoteError
+  def initialize(error); end
+end
+
+class DRb::DRbServer
+  def initialize(uri=T.unsafe(nil), front=T.unsafe(nil), config_or_acl=T.unsafe(nil)); end
+
+  def safe_level(); end
+end
+
+class DRb::DRbServer::InvokeMethod
+  include ::DRb::DRbServer::InvokeMethod18Mixin
+  def initialize(drb_server, client); end
+
+  def perform(); end
+end
+
+class DRb::DRbServer::InvokeMethod
+end
+
+module DRb::DRbServer::InvokeMethod18Mixin
+  def block_yield(x); end
+
+  def perform_with_block(); end
+end
+
+module DRb::DRbServer::InvokeMethod18Mixin
+end
+
+class DRb::DRbServer
+  def self.default_safe_level(level); end
+
+  def self.make_config(hash=T.unsafe(nil)); end
+end
+
+class DRb::DRbTCPSocket
+  def accept(); end
+
+  def alive?(); end
+
+  def close(); end
+
+  def initialize(uri, soc, config=T.unsafe(nil)); end
+
+  def peeraddr(); end
+
+  def recv_reply(); end
+
+  def recv_request(); end
+
+  def send_reply(succ, result); end
+
+  def send_request(ref, msg_id, arg, b); end
+
+  def set_sockopt(soc); end
+
+  def shutdown(); end
+
+  def stream(); end
+
+  def uri(); end
+end
+
+class DRb::DRbTCPSocket
+  def self.getservername(); end
+
+  def self.open(uri, config); end
+
+  def self.open_server(uri, config); end
+
+  def self.open_server_inaddr_any(host, port); end
+
+  def self.parse_uri(uri); end
+
+  def self.uri_option(uri, config); end
+end
+
+class DRb::DRbURIOption
+  def ==(other); end
+
+  def eql?(other); end
+
+  def initialize(option); end
+
+  def option(); end
+end
+
+class DRb::DRbURIOption
+end
+
+module DRb::DRbUndumped
+  def _dump(dummy); end
+end
+
+class DRb::DRbUnknown
+  def _dump(lv); end
+end
+
+class DRb::DRbUnknown
+  def self._load(s); end
+end
+
+class DRb::DRbUnknownError
+  def _dump(lv); end
+
+  def initialize(unknown); end
+end
+
+class DRb::DRbUnknownError
+  def self._load(s); end
+end
+
+class DRb::ThreadObject
+  include ::MonitorMixin
+  def _execute(); end
+
+  def alive?(); end
+
+  def initialize(&blk); end
+
+  def kill(); end
+
+  def method_missing(msg, *arg, &blk); end
+end
+
+class DRb::ThreadObject
+end
+
+module DRb
+  def self.mutex(); end
+end
+
+DRbIdConv = DRb::DRbIdConv
+
+DRbObject = DRb::DRbObject
+
+DRbUndumped = DRb::DRbUndumped
+
+class Date
+  def infinite?(); end
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Date::Infinity
+  def initialize(d=T.unsafe(nil)); end
+end
+
+class Delegator
+  RUBYGEMS_ACTIVATION_MONITOR = ::T.let(nil, ::T.untyped)
+end
+
+class DidYouMean::ClassNameChecker
+  def class_name(); end
+
+  def class_names(); end
+
+  def corrections(); end
+
+  def initialize(exception); end
+
+  def scopes(); end
+end
+
+class DidYouMean::CorrectElement
+  def call(names, element); end
+end
+
+class DidYouMean::CorrectElement
+end
+
+module DidYouMean::Correctable
+  def corrections(); end
+
+  def original_message(); end
+
+  def spell_checker(); end
+
+  def to_s(); end
+end
+
+module DidYouMean::Jaro
+  def self.distance(str1, str2); end
+end
+
+module DidYouMean::JaroWinkler
+  def self.distance(str1, str2); end
+end
+
+class DidYouMean::KeyErrorChecker
+  def corrections(); end
+
+  def initialize(key_error); end
+end
+
+class DidYouMean::KeyErrorChecker
+end
+
+module DidYouMean::Levenshtein
+  def self.distance(str1, str2); end
+
+  def self.min3(a, b, c); end
+end
+
+class DidYouMean::MethodNameChecker
+  def corrections(); end
+
+  def initialize(exception); end
+
+  def method_name(); end
+
+  def method_names(); end
+
+  def names_to_exclude(); end
+
+  def receiver(); end
+  RB_RESERVED_WORDS = ::T.let(nil, ::T.untyped)
+end
+
+class DidYouMean::NullChecker
+  def corrections(); end
+
+  def initialize(*arg); end
+end
+
+class DidYouMean::ParseDimensions
+  def call(); end
+
+  def initialize(dictionary, separator); end
+end
+
+class DidYouMean::ParseDimensions
+end
+
+class DidYouMean::PlainFormatter
+  def message_for(corrections); end
+end
+
+class DidYouMean::PlainFormatter
+end
+
+class DidYouMean::TreeSpellChecker
+  def augment(); end
+
+  def correct(input); end
+
+  def dictionary(); end
+
+  def dimensions(); end
+
+  def initialize(dictionary:, separator: T.unsafe(nil), augment: T.unsafe(nil)); end
+
+  def separator(); end
+end
+
+class DidYouMean::TreeSpellChecker
+end
+
+class DidYouMean::VariableNameChecker
+  def corrections(); end
+
+  def cvar_names(); end
+
+  def initialize(exception); end
+
+  def ivar_names(); end
+
+  def lvar_names(); end
+
+  def method_names(); end
+
+  def name(); end
+  RB_RESERVED_WORDS = ::T.let(nil, ::T.untyped)
+end
+
+module DidYouMean
+  def self.correct_error(error_class, spell_checker); end
+
+  def self.formatter(); end
+
+  def self.formatter=(formatter); end
+end
+
+class Dir
+  def children(); end
+
+  def each_child(); end
+end
+
+module Dir::Tmpname
+  UNUSABLE_CHARS = ::T.let(nil, ::T.untyped)
+end
+
+class Dir
+  def self.exists?(arg); end
+end
+
+class ERB
+  def def_method(mod, methodname, fname=T.unsafe(nil)); end
+
+  def def_module(methodname=T.unsafe(nil)); end
+end
+
+class ERB::Compiler::Scanner
+  DEFAULT_ETAGS = ::T.let(nil, ::T.untyped)
+  DEFAULT_STAGS = ::T.let(nil, ::T.untyped)
+end
+
+class Encoding
+  def _dump(*arg); end
+  CESU_8 = ::T.let(nil, ::T.untyped)
+end
+
+class Encoding::Converter
+  def initialize(*arg); end
+end
+
+class Encoding
+  def self._load(arg); end
+end
+
+module Enumerable
+  def sum(*arg); end
+end
+
+class Enumerator
+  def +(arg); end
+
+  def each_with_index(); end
+end
+
+class Enumerator::ArithmeticSequence
+  def begin(); end
+
+  def each(&blk); end
+
+  def end(); end
+
+  def exclude_end?(); end
+
+  def last(*arg); end
+
+  def step(); end
+end
+
+class Enumerator::ArithmeticSequence
+end
+
+class Enumerator::Chain
+end
+
+class Enumerator::Chain
+end
+
+class Enumerator::Generator
+  def each(*arg, &blk); end
+
+  def initialize(*arg); end
+end
+
+class Enumerator::Lazy
+  def eager(); end
+end
+
+class Enumerator::Producer
+  def each(&blk); end
+end
+
+class Enumerator::Producer
+end
+
+class Enumerator::Yielder
+  def to_proc(); end
+end
+
+class Enumerator
+  def self.produce(*arg); end
+end
+
+Errno::EAUTH = Errno::NOERROR
+
+Errno::EBADARCH = Errno::NOERROR
+
+Errno::EBADEXEC = Errno::NOERROR
+
+Errno::EBADMACHO = Errno::NOERROR
+
+Errno::EBADRPC = Errno::NOERROR
+
+Errno::ECAPMODE = Errno::NOERROR
+
+Errno::EDEADLOCK = Errno::EDEADLK
+
+Errno::EDEVERR = Errno::NOERROR
+
+Errno::EDOOFUS = Errno::NOERROR
+
+Errno::EFTYPE = Errno::NOERROR
+
+Errno::EIPSEC = Errno::NOERROR
+
+Errno::ELAST = Errno::NOERROR
+
+Errno::ENEEDAUTH = Errno::NOERROR
+
+Errno::ENOATTR = Errno::NOERROR
+
+Errno::ENOPOLICY = Errno::NOERROR
+
+Errno::ENOTCAPABLE = Errno::NOERROR
+
+class Errno::ENOTSUP
+  Errno = ::T.let(nil, ::T.untyped)
+end
+
+class Errno::ENOTSUP
+end
+
+Errno::EPROCLIM = Errno::NOERROR
+
+Errno::EPROCUNAVAIL = Errno::NOERROR
+
+Errno::EPROGMISMATCH = Errno::NOERROR
+
+Errno::EPROGUNAVAIL = Errno::NOERROR
+
+Errno::EPWROFF = Errno::NOERROR
+
+Errno::EQFULL = Errno::NOERROR
+
+Errno::ERPCMISMATCH = Errno::NOERROR
+
+Errno::ESHLIBVERS = Errno::NOERROR
+
+module Etc
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Etc::Group
+  def gid(); end
+
+  def gid=(_); end
+
+  def mem(); end
+
+  def mem=(_); end
+
+  def name(); end
+
+  def name=(_); end
+
+  def passwd(); end
+
+  def passwd=(_); end
+end
+
+class Etc::Group
+  extend ::Enumerable
+  def self.[](*arg); end
+
+  def self.each(&blk); end
+
+  def self.members(); end
+end
+
+class Etc::Passwd
+  def dir=(_); end
+
+  def gecos(); end
+
+  def gecos=(_); end
+
+  def gid=(_); end
+
+  def name=(_); end
+
+  def passwd=(_); end
+
+  def shell=(_); end
+
+  def uid=(_); end
+end
+
+class Etc::Passwd
+  extend ::Enumerable
+  def self.[](*arg); end
+
+  def self.each(&blk); end
+
+  def self.members(); end
+end
+
+class ExitCalledError
+end
+
+class ExitCalledError
+end
+
+class FalseClass
+  include ::JSON::Ext::Generator::GeneratorMethods::FalseClass
+end
+
+class Fiber
+  def initialize(*arg); end
+end
+
+class File
+  def self.absolute_path?(arg); end
+
+  def self.exists?(arg); end
+end
+
+FileList = Rake::FileList
+
+module FileUtils
+  include ::FileUtils::StreamUtils_
+  LN_SUPPORTED = ::T.let(nil, ::T.untyped)
+  RUBY = ::T.let(nil, ::T.untyped)
+end
+
+module FileUtils::DryRun
+  include ::FileUtils
+  include ::FileUtils::StreamUtils_
+  include ::FileUtils::LowMethods
+end
+
+module FileUtils::DryRun
+  extend ::FileUtils::DryRun
+  extend ::FileUtils
+  extend ::FileUtils::StreamUtils_
+  extend ::FileUtils::LowMethods
+end
+
+module FileUtils::NoWrite
+  include ::FileUtils
+  include ::FileUtils::StreamUtils_
+  include ::FileUtils::LowMethods
+end
+
+module FileUtils::NoWrite
+  extend ::FileUtils::NoWrite
+  extend ::FileUtils
+  extend ::FileUtils::StreamUtils_
+  extend ::FileUtils::LowMethods
+end
+
+module FileUtils::Verbose
+  include ::FileUtils
+  include ::FileUtils::StreamUtils_
+end
+
+module FileUtils::Verbose
+  extend ::FileUtils::Verbose
+  extend ::FileUtils
+  extend ::FileUtils::StreamUtils_
+end
+
+module FileUtils
+  extend ::FileUtils::StreamUtils_
+end
+
+class Float
+  include ::JSON::Ext::Generator::GeneratorMethods::Float
+end
+
+module Forwardable
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+module Forwardable
+  def self._compile_method(src, file, line); end
+
+  def self._delegator_method(obj, accessor, method, ali); end
+
+  def self._valid_method?(method); end
+
+  def self.debug(); end
+
+  def self.debug=(debug); end
+end
+
+class FrozenError
+  def receiver(); end
+end
+
+module GC
+  def garbage_collect(full_mark: T.unsafe(nil), immediate_mark: T.unsafe(nil), immediate_sweep: T.unsafe(nil)); end
+end
+
+module GC
+  def self.verify_transient_heap_internal_consistency(); end
+end
+
+module Gem
+  ConfigMap = ::T.let(nil, ::T.untyped)
+  RbConfigPriorities = ::T.let(nil, ::T.untyped)
+  RubyGemsVersion = ::T.let(nil, ::T.untyped)
+  UNTAINT = ::T.let(nil, ::T.untyped)
+end
+
+class Gem::Exception
+  extend ::Gem::Deprecate
+end
+
+class Gem::Ext::BuildError
+end
+
+class Gem::Ext::BuildError
+end
+
+class Gem::Ext::ExtConfBuilder
+end
+
+Gem::Ext::ExtConfBuilder::FileEntry = FileUtils::Entry_
+
+class Gem::Ext::ExtConfBuilder
+  def self.build(extension, dest_path, results, args=T.unsafe(nil), lib_dir=T.unsafe(nil)); end
+
+  def self.get_relative_path(path); end
+end
+
+Gem::Installer::ExtensionBuildError = Gem::Ext::BuildError
+
+class Gem::Installer::FakePackage
+  def copy_to(path); end
+
+  def data_mode(); end
+
+  def data_mode=(data_mode); end
+
+  def dir_mode(); end
+
+  def dir_mode=(dir_mode); end
+
+  def extract_files(destination_dir, pattern=T.unsafe(nil)); end
+
+  def initialize(spec); end
+
+  def prog_mode(); end
+
+  def prog_mode=(prog_mode); end
+
+  def spec(); end
+
+  def spec=(spec); end
+end
+
+class Gem::Installer::FakePackage
+end
+
+class Gem::PathSupport
+  def home(); end
+
+  def initialize(env); end
+
+  def path(); end
+
+  def spec_cache_dir(); end
+end
+
+class Gem::Platform
+  def self.match_gem?(platform, gem_name); end
+
+  def self.match_spec?(spec); end
+end
+
+class Gem::Request
+  extend ::Gem::UserInteraction
+  extend ::Gem::DefaultUserInteraction
+  extend ::Gem::Text
+end
+
+class Gem::Requirement
+  include ::Gem::Requirement::OrderIndependentComparison
+  include ::Gem::Requirement::CorrectHashForLambdaOperator
+end
+
+module Gem::Requirement::CorrectHashForLambdaOperator
+  def hash(); end
+end
+
+module Gem::Requirement::CorrectHashForLambdaOperator
+end
+
+module Gem::Requirement::OrderIndependentComparison
+  def ==(other); end
+
+  def _requirements_sorted?(); end
+
+  def _with_sorted_requirements(); end
+end
+
+module Gem::Requirement::OrderIndependentComparison
+end
+
+class Gem::Resolver::CurrentSet
+end
+
+class Gem::Resolver::CurrentSet
+end
+
+class Gem::Resolver::LocalSpecification
+end
+
+class Gem::Resolver::LocalSpecification
+end
+
+class Gem::Resolver::Molinillo::DependencyGraph::Log
+  def add_edge_no_circular(graph, origin, destination, requirement); end
+
+  def add_vertex(graph, name, payload, root); end
+
+  def delete_edge(graph, origin_name, destination_name, requirement); end
+
+  def detach_vertex_named(graph, name); end
+
+  def each(&blk); end
+
+  def pop!(graph); end
+
+  def reverse_each(); end
+
+  def rewind_to(graph, tag); end
+
+  def set_payload(graph, name, payload); end
+
+  def tag(graph, tag); end
+end
+
+class Gem::Resolver::Molinillo::DependencyGraph::Log
+  extend ::Enumerable
+end
+
+class Gem::RuntimeRequirementNotMetError
+  def suggestion(); end
+
+  def suggestion=(suggestion); end
+end
+
+class Gem::RuntimeRequirementNotMetError
+end
+
+class Gem::SpecFetcher
+  include ::Gem::UserInteraction
+  include ::Gem::DefaultUserInteraction
+  include ::Gem::Text
+  def available_specs(type); end
+
+  def detect(type=T.unsafe(nil)); end
+
+  def initialize(sources=T.unsafe(nil)); end
+
+  def latest_specs(); end
+
+  def prerelease_specs(); end
+
+  def search_for_dependency(dependency, matching_platform=T.unsafe(nil)); end
+
+  def sources(); end
+
+  def spec_for_dependency(dependency, matching_platform=T.unsafe(nil)); end
+
+  def specs(); end
+
+  def suggest_gems_from_name(gem_name, type=T.unsafe(nil)); end
+
+  def tuples_for(source, type, gracefully_ignore=T.unsafe(nil)); end
+end
+
+class Gem::SpecFetcher
+  def self.fetcher(); end
+
+  def self.fetcher=(fetcher); end
+end
+
+class Gem::Specification
+  include ::Bundler::MatchPlatform
+  include ::Bundler::GemHelpers
+  def deleted_gem?(); end
+
+  def removed_method_calls(); end
+
+  def to_ruby(); end
+  REMOVED_METHODS = ::T.let(nil, ::T.untyped)
+end
+
+class Gem::Specification
+  extend ::Gem::Deprecate
+  extend ::Enumerable
+end
+
+class Gem::SpecificationPolicy
+  include ::Gem::UserInteraction
+  include ::Gem::DefaultUserInteraction
+  include ::Gem::Text
+  def initialize(specification); end
+
+  def packaging(); end
+
+  def packaging=(packaging); end
+
+  def validate(strict=T.unsafe(nil)); end
+
+  def validate_dependencies(); end
+
+  def validate_metadata(); end
+
+  def validate_permissions(); end
+  HOMEPAGE_URI_PATTERN = ::T.let(nil, ::T.untyped)
+  LAZY = ::T.let(nil, ::T.untyped)
+  LAZY_PATTERN = ::T.let(nil, ::T.untyped)
+  METADATA_LINK_KEYS = ::T.let(nil, ::T.untyped)
+  SPECIAL_CHARACTERS = ::T.let(nil, ::T.untyped)
+  VALID_NAME_PATTERN = ::T.let(nil, ::T.untyped)
+  VALID_URI_PATTERN = ::T.let(nil, ::T.untyped)
+end
+
+class Gem::SpecificationPolicy
+end
+
+class Gem::StreamUI
+  def _deprecated_debug(statement); end
+end
+
+class Gem::StubSpecification
+  def build_extensions(); end
+
+  def extensions(); end
+
+  def initialize(filename, base_dir, gems_dir, default_gem); end
+
+  def missing_extensions?(); end
+
+  def valid?(); end
+end
+
+class Gem::StubSpecification::StubLine
+  def extensions(); end
+
+  def full_name(); end
+
+  def initialize(data, extensions); end
+
+  def name(); end
+
+  def platform(); end
+
+  def require_paths(); end
+
+  def version(); end
+end
+
+class Gem::StubSpecification
+  def self.default_gemspec_stub(filename, base_dir, gems_dir); end
+
+  def self.gemspec_stub(filename, base_dir, gems_dir); end
+end
+
+class Gem::UninstallError
+  def spec(); end
+
+  def spec=(spec); end
+end
+
+class Gem::UninstallError
+end
+
+Gem::UnsatisfiableDepedencyError = Gem::UnsatisfiableDependencyError
+
+Gem::Version::Requirement = Gem::Requirement
+
+module Gem
+  def self.activated_gem_paths(); end
+end
+
+class Hash
+  include ::JSON::Ext::Generator::GeneratorMethods::Hash
+  def deconstruct_keys(arg); end
+end
+
+class Hash
+  def self.create(initial_hash=T.unsafe(nil), &block); end
+
+  def self.ruby2_keywords_hash(arg); end
+
+  def self.ruby2_keywords_hash?(arg); end
+
+  def self.try_convert(arg); end
+end
+
+module Hashery
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Hashery::CRUDHash
+  NA = ::T.let(nil, ::T.untyped)
+end
+
+class Hashery::LRUHash
+  FETCH = ::T.let(nil, ::T.untyped)
+end
+
+class HighLine
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+module HighLine::BuiltinStyles
+  BASIC_COLORS = ::T.let(nil, ::T.untyped)
+  BLACK = ::T.let(nil, ::T.untyped)
+  BLACK_STYLE = ::T.let(nil, ::T.untyped)
+  BLINK = ::T.let(nil, ::T.untyped)
+  BLINK_STYLE = ::T.let(nil, ::T.untyped)
+  BLUE = ::T.let(nil, ::T.untyped)
+  BLUE_STYLE = ::T.let(nil, ::T.untyped)
+  BOLD = ::T.let(nil, ::T.untyped)
+  BOLD_STYLE = ::T.let(nil, ::T.untyped)
+  BRIGHT_BLACK = ::T.let(nil, ::T.untyped)
+  BRIGHT_BLACK_STYLE = ::T.let(nil, ::T.untyped)
+  BRIGHT_BLUE = ::T.let(nil, ::T.untyped)
+  BRIGHT_BLUE_STYLE = ::T.let(nil, ::T.untyped)
+  BRIGHT_CYAN = ::T.let(nil, ::T.untyped)
+  BRIGHT_CYAN_STYLE = ::T.let(nil, ::T.untyped)
+  BRIGHT_GRAY = ::T.let(nil, ::T.untyped)
+  BRIGHT_GRAY_STYLE = ::T.let(nil, ::T.untyped)
+  BRIGHT_GREEN = ::T.let(nil, ::T.untyped)
+  BRIGHT_GREEN_STYLE = ::T.let(nil, ::T.untyped)
+  BRIGHT_GREY = ::T.let(nil, ::T.untyped)
+  BRIGHT_GREY_STYLE = ::T.let(nil, ::T.untyped)
+  BRIGHT_MAGENTA = ::T.let(nil, ::T.untyped)
+  BRIGHT_MAGENTA_STYLE = ::T.let(nil, ::T.untyped)
+  BRIGHT_NONE = ::T.let(nil, ::T.untyped)
+  BRIGHT_NONE_STYLE = ::T.let(nil, ::T.untyped)
+  BRIGHT_RED = ::T.let(nil, ::T.untyped)
+  BRIGHT_RED_STYLE = ::T.let(nil, ::T.untyped)
+  BRIGHT_WHITE = ::T.let(nil, ::T.untyped)
+  BRIGHT_WHITE_STYLE = ::T.let(nil, ::T.untyped)
+  BRIGHT_YELLOW = ::T.let(nil, ::T.untyped)
+  BRIGHT_YELLOW_STYLE = ::T.let(nil, ::T.untyped)
+  CLEAR = ::T.let(nil, ::T.untyped)
+  CLEAR_STYLE = ::T.let(nil, ::T.untyped)
+  COLORS = ::T.let(nil, ::T.untyped)
+  COLOR_LIST = ::T.let(nil, ::T.untyped)
+  CONCEALED = ::T.let(nil, ::T.untyped)
+  CONCEALED_STYLE = ::T.let(nil, ::T.untyped)
+  CYAN = ::T.let(nil, ::T.untyped)
+  CYAN_STYLE = ::T.let(nil, ::T.untyped)
+  DARK = ::T.let(nil, ::T.untyped)
+  DARK_STYLE = ::T.let(nil, ::T.untyped)
+  ERASE_CHAR = ::T.let(nil, ::T.untyped)
+  ERASE_CHAR_STYLE = ::T.let(nil, ::T.untyped)
+  ERASE_LINE = ::T.let(nil, ::T.untyped)
+  ERASE_LINE_STYLE = ::T.let(nil, ::T.untyped)
+  GRAY = ::T.let(nil, ::T.untyped)
+  GRAY_STYLE = ::T.let(nil, ::T.untyped)
+  GREEN = ::T.let(nil, ::T.untyped)
+  GREEN_STYLE = ::T.let(nil, ::T.untyped)
+  GREY = ::T.let(nil, ::T.untyped)
+  GREY_STYLE = ::T.let(nil, ::T.untyped)
+  LIGHT_BLACK = ::T.let(nil, ::T.untyped)
+  LIGHT_BLACK_STYLE = ::T.let(nil, ::T.untyped)
+  LIGHT_BLUE = ::T.let(nil, ::T.untyped)
+  LIGHT_BLUE_STYLE = ::T.let(nil, ::T.untyped)
+  LIGHT_CYAN = ::T.let(nil, ::T.untyped)
+  LIGHT_CYAN_STYLE = ::T.let(nil, ::T.untyped)
+  LIGHT_GRAY = ::T.let(nil, ::T.untyped)
+  LIGHT_GRAY_STYLE = ::T.let(nil, ::T.untyped)
+  LIGHT_GREEN = ::T.let(nil, ::T.untyped)
+  LIGHT_GREEN_STYLE = ::T.let(nil, ::T.untyped)
+  LIGHT_GREY = ::T.let(nil, ::T.untyped)
+  LIGHT_GREY_STYLE = ::T.let(nil, ::T.untyped)
+  LIGHT_MAGENTA = ::T.let(nil, ::T.untyped)
+  LIGHT_MAGENTA_STYLE = ::T.let(nil, ::T.untyped)
+  LIGHT_NONE = ::T.let(nil, ::T.untyped)
+  LIGHT_NONE_STYLE = ::T.let(nil, ::T.untyped)
+  LIGHT_RED = ::T.let(nil, ::T.untyped)
+  LIGHT_RED_STYLE = ::T.let(nil, ::T.untyped)
+  LIGHT_WHITE = ::T.let(nil, ::T.untyped)
+  LIGHT_WHITE_STYLE = ::T.let(nil, ::T.untyped)
+  LIGHT_YELLOW = ::T.let(nil, ::T.untyped)
+  LIGHT_YELLOW_STYLE = ::T.let(nil, ::T.untyped)
+  MAGENTA = ::T.let(nil, ::T.untyped)
+  MAGENTA_STYLE = ::T.let(nil, ::T.untyped)
+  NONE = ::T.let(nil, ::T.untyped)
+  NONE_STYLE = ::T.let(nil, ::T.untyped)
+  ON_BLACK = ::T.let(nil, ::T.untyped)
+  ON_BLACK_STYLE = ::T.let(nil, ::T.untyped)
+  ON_BLUE = ::T.let(nil, ::T.untyped)
+  ON_BLUE_STYLE = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_BLACK = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_BLACK_STYLE = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_BLUE = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_BLUE_STYLE = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_CYAN = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_CYAN_STYLE = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_GRAY = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_GRAY_STYLE = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_GREEN = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_GREEN_STYLE = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_GREY = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_GREY_STYLE = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_MAGENTA = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_MAGENTA_STYLE = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_NONE = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_NONE_STYLE = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_RED = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_RED_STYLE = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_WHITE = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_WHITE_STYLE = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_YELLOW = ::T.let(nil, ::T.untyped)
+  ON_BRIGHT_YELLOW_STYLE = ::T.let(nil, ::T.untyped)
+  ON_CYAN = ::T.let(nil, ::T.untyped)
+  ON_CYAN_STYLE = ::T.let(nil, ::T.untyped)
+  ON_GRAY = ::T.let(nil, ::T.untyped)
+  ON_GRAY_STYLE = ::T.let(nil, ::T.untyped)
+  ON_GREEN = ::T.let(nil, ::T.untyped)
+  ON_GREEN_STYLE = ::T.let(nil, ::T.untyped)
+  ON_GREY = ::T.let(nil, ::T.untyped)
+  ON_GREY_STYLE = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_BLACK = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_BLACK_STYLE = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_BLUE = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_BLUE_STYLE = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_CYAN = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_CYAN_STYLE = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_GRAY = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_GRAY_STYLE = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_GREEN = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_GREEN_STYLE = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_GREY = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_GREY_STYLE = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_MAGENTA = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_MAGENTA_STYLE = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_NONE = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_NONE_STYLE = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_RED = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_RED_STYLE = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_WHITE = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_WHITE_STYLE = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_YELLOW = ::T.let(nil, ::T.untyped)
+  ON_LIGHT_YELLOW_STYLE = ::T.let(nil, ::T.untyped)
+  ON_MAGENTA = ::T.let(nil, ::T.untyped)
+  ON_MAGENTA_STYLE = ::T.let(nil, ::T.untyped)
+  ON_NONE = ::T.let(nil, ::T.untyped)
+  ON_NONE_STYLE = ::T.let(nil, ::T.untyped)
+  ON_RED = ::T.let(nil, ::T.untyped)
+  ON_RED_STYLE = ::T.let(nil, ::T.untyped)
+  ON_WHITE = ::T.let(nil, ::T.untyped)
+  ON_WHITE_STYLE = ::T.let(nil, ::T.untyped)
+  ON_YELLOW = ::T.let(nil, ::T.untyped)
+  ON_YELLOW_STYLE = ::T.let(nil, ::T.untyped)
+  RED = ::T.let(nil, ::T.untyped)
+  RED_STYLE = ::T.let(nil, ::T.untyped)
+  RESET = ::T.let(nil, ::T.untyped)
+  RESET_STYLE = ::T.let(nil, ::T.untyped)
+  REVERSE = ::T.let(nil, ::T.untyped)
+  REVERSE_STYLE = ::T.let(nil, ::T.untyped)
+  STYLES = ::T.let(nil, ::T.untyped)
+  STYLE_LIST = ::T.let(nil, ::T.untyped)
+  UNDERLINE = ::T.let(nil, ::T.untyped)
+  UNDERLINE_STYLE = ::T.let(nil, ::T.untyped)
+  UNDERSCORE = ::T.let(nil, ::T.untyped)
+  UNDERSCORE_STYLE = ::T.let(nil, ::T.untyped)
+  WHITE = ::T.let(nil, ::T.untyped)
+  WHITE_STYLE = ::T.let(nil, ::T.untyped)
+  YELLOW = ::T.let(nil, ::T.untyped)
+  YELLOW_STYLE = ::T.let(nil, ::T.untyped)
+end
+
+module HighLine::BuiltinStyles::ClassMethods
+  RGB_COLOR_PATTERN = ::T.let(nil, ::T.untyped)
+end
+
+class HighLine::SampleColorScheme
+  SAMPLE_SCHEME = ::T.let(nil, ::T.untyped)
+end
+
+module HighLine::StringExtensions
+  STYLE_METHOD_NAME_PATTERN = ::T.let(nil, ::T.untyped)
+end
+
+class IO
+  def beep(); end
+
+  def check_winsize_changed(); end
+
+  def clear_screen(); end
+
+  def console_mode(); end
+
+  def console_mode=(console_mode); end
+
+  def cooked(); end
+
+  def cooked!(); end
+
+  def cursor(); end
+
+  def cursor=(cursor); end
+
+  def cursor_down(arg); end
+
+  def cursor_left(arg); end
+
+  def cursor_right(arg); end
+
+  def cursor_up(arg); end
+
+  def echo=(echo); end
+
+  def echo?(); end
+
+  def erase_line(arg); end
+
+  def erase_screen(arg); end
+
+  def getch(*arg); end
+
+  def getpass(*arg); end
+
+  def goto(arg, arg1); end
+
+  def goto_column(arg); end
+
+  def iflush(); end
+
+  def ioflush(); end
+
+  def noecho(); end
+
+  def nonblock(*arg); end
+
+  def nonblock=(nonblock); end
+
+  def nonblock?(); end
+
+  def nread(); end
+
+  def oflush(); end
+
+  def pathconf(arg); end
+
+  def pressed?(); end
+
+  def raw(*arg); end
+
+  def raw!(*arg); end
+
+  def ready?(); end
+
+  def scroll_backward(arg); end
+
+  def scroll_forward(arg); end
+
+  def set_encoding_by_bom(); end
+
+  def wait(*arg); end
+
+  def wait_readable(*arg); end
+
+  def wait_writable(*arg); end
+
+  def winsize(); end
+
+  def winsize=(winsize); end
+end
+
+class IO::ConsoleMode
+  def echo=(echo); end
+
+  def raw(*arg); end
+
+  def raw!(*arg); end
+end
+
+class IO::ConsoleMode
+end
+
+IO::EWOULDBLOCKWaitReadable = IO::EAGAINWaitReadable
+
+IO::EWOULDBLOCKWaitWritable = IO::EAGAINWaitWritable
+
+class IO
+  def self.console(*arg); end
+
+  def self.console_size(); end
+
+  def self.default_console_size(); end
+end
+
+class IPAddr
+  def ==(other); end
+
+  def initialize(addr=T.unsafe(nil), family=T.unsafe(nil)); end
+end
+
+class Integer
+  include ::JSON::Ext::Generator::GeneratorMethods::Integer
+  def to_bn(); end
+end
+
+class JSON::Ext::Generator::State
+  def self.from_state(arg); end
+end
+
+class JSON::Ext::Parser
+  def initialize(*arg); end
+end
+
+JSON::Parser = JSON::Ext::Parser
+
+JSON::State = JSON::Ext::Generator::State
+
+JSON::UnparserError = JSON::GeneratorError
+
+module Kernel
+  def itself(); end
+
+  def object_id(); end
+
+  def pretty_inspect(); end
+
+  def then(); end
+
+  def yield_self(); end
+end
+
+module Kernel
+  def self.at_exit(); end
+end
+
+class KeyError
+  include ::DidYouMean::Correctable
+end
+
+module MethodSource
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+module MethodSource::CodeHelpers::IncompleteExpression
+  GENERIC_REGEXPS = ::T.let(nil, ::T.untyped)
+  RBX_ONLY_REGEXPS = ::T.let(nil, ::T.untyped)
+end
+
+class Monitor
+  def enter(); end
+
+  def exit(); end
+
+  def mon_check_owner(); end
+
+  def mon_enter(); end
+
+  def mon_exit(); end
+
+  def mon_locked?(); end
+
+  def mon_owned?(); end
+
+  def mon_synchronize(); end
+
+  def mon_try_enter(); end
+
+  def new_cond(); end
+
+  def synchronize(); end
+
+  def try_enter(); end
+
+  def try_mon_enter(); end
+
+  def wait_for_cond(arg, arg1); end
+end
+
+module MonitorMixin
+  def initialize(*args); end
+end
+
+class MonitorMixin::ConditionVariable
+  def initialize(monitor); end
+end
+
+class NameError
+  include ::DidYouMean::Correctable
+end
+
+class NilClass
+  include ::JSON::Ext::Generator::GeneratorMethods::NilClass
+end
+
+class NoMatchingPatternError
+end
+
+class NoMatchingPatternError
+end
+
+class Object
+  include ::JSON::Ext::Generator::GeneratorMethods::Object
+  include ::PP::ObjectMixin
+  def to_yaml(options=T.unsafe(nil)); end
+  ARGF = ::T.let(nil, ::T.untyped)
+  ARGV = ::T.let(nil, ::T.untyped)
+  CROSS_COMPILING = ::T.let(nil, ::T.untyped)
+  ENV = ::T.let(nil, ::T.untyped)
+  RUBY_COPYRIGHT = ::T.let(nil, ::T.untyped)
+  RUBY_DESCRIPTION = ::T.let(nil, ::T.untyped)
+  RUBY_ENGINE = ::T.let(nil, ::T.untyped)
+  RUBY_ENGINE_VERSION = ::T.let(nil, ::T.untyped)
+  RUBY_PATCHLEVEL = ::T.let(nil, ::T.untyped)
+  RUBY_PLATFORM = ::T.let(nil, ::T.untyped)
+  RUBY_RELEASE_DATE = ::T.let(nil, ::T.untyped)
+  RUBY_REVISION = ::T.let(nil, ::T.untyped)
+  RUBY_VERSION = ::T.let(nil, ::T.untyped)
+  STDERR = ::T.let(nil, ::T.untyped)
+  STDIN = ::T.let(nil, ::T.untyped)
+  STDOUT = ::T.let(nil, ::T.untyped)
+  TOPLEVEL_BINDING = ::T.let(nil, ::T.untyped)
+end
+
+class Object
+  def self.yaml_tag(url); end
+end
+
+class OpenSSL::ASN1::ASN1Data
+  def indefinite_length(); end
+
+  def indefinite_length=(indefinite_length); end
+end
+
+class OpenSSL::BN
+  def +@(); end
+
+  def -@(); end
+
+  def /(arg); end
+
+  def negative?(); end
+end
+
+module OpenSSL::KDF
+end
+
+class OpenSSL::KDF::KDFError
+end
+
+class OpenSSL::KDF::KDFError
+end
+
+module OpenSSL::KDF
+  def self.hkdf(*arg); end
+
+  def self.pbkdf2_hmac(*arg); end
+
+  def self.scrypt(*arg); end
+end
+
+class OpenSSL::OCSP::Request
+  def signed?(); end
+end
+
+OpenSSL::PKCS7::Signer = OpenSSL::PKCS7::SignerInfo
+
+class OpenSSL::PKey::EC
+  EXPLICIT_CURVE = ::T.let(nil, ::T.untyped)
+end
+
+class OpenSSL::PKey::EC::Point
+  def to_octet_string(arg); end
+end
+
+module OpenSSL::SSL
+  OP_ALLOW_NO_DHE_KEX = ::T.let(nil, ::T.untyped)
+  OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION = ::T.let(nil, ::T.untyped)
+  OP_CRYPTOPRO_TLSEXT_BUG = ::T.let(nil, ::T.untyped)
+  OP_LEGACY_SERVER_CONNECT = ::T.let(nil, ::T.untyped)
+  OP_NO_ENCRYPT_THEN_MAC = ::T.let(nil, ::T.untyped)
+  OP_NO_RENEGOTIATION = ::T.let(nil, ::T.untyped)
+  OP_NO_TLSv1_3 = ::T.let(nil, ::T.untyped)
+  OP_SAFARI_ECDHE_ECDSA_BUG = ::T.let(nil, ::T.untyped)
+  OP_TLSEXT_PADDING = ::T.let(nil, ::T.untyped)
+  SSL2_VERSION = ::T.let(nil, ::T.untyped)
+  SSL3_VERSION = ::T.let(nil, ::T.untyped)
+  TLS1_1_VERSION = ::T.let(nil, ::T.untyped)
+  TLS1_2_VERSION = ::T.let(nil, ::T.untyped)
+  TLS1_3_VERSION = ::T.let(nil, ::T.untyped)
+  TLS1_VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class OpenSSL::SSL::SSLContext
+  def alpn_protocols(); end
+
+  def alpn_protocols=(alpn_protocols); end
+
+  def alpn_select_cb(); end
+
+  def alpn_select_cb=(alpn_select_cb); end
+
+  def enable_fallback_scsv(); end
+
+  def max_version=(version); end
+
+  def min_version=(version); end
+  DEFAULT_TMP_DH_CALLBACK = ::T.let(nil, ::T.untyped)
+end
+
+class OpenSSL::SSL::SSLSocket
+  def alpn_protocol(); end
+
+  def tmp_key(); end
+end
+
+module OpenSSL::X509
+  V_ERR_CA_KEY_TOO_SMALL = ::T.let(nil, ::T.untyped)
+  V_ERR_CA_MD_TOO_WEAK = ::T.let(nil, ::T.untyped)
+  V_ERR_CRL_PATH_VALIDATION_ERROR = ::T.let(nil, ::T.untyped)
+  V_ERR_DANE_NO_MATCH = ::T.let(nil, ::T.untyped)
+  V_ERR_DIFFERENT_CRL_SCOPE = ::T.let(nil, ::T.untyped)
+  V_ERR_EE_KEY_TOO_SMALL = ::T.let(nil, ::T.untyped)
+  V_ERR_EMAIL_MISMATCH = ::T.let(nil, ::T.untyped)
+  V_ERR_EXCLUDED_VIOLATION = ::T.let(nil, ::T.untyped)
+  V_ERR_HOSTNAME_MISMATCH = ::T.let(nil, ::T.untyped)
+  V_ERR_INVALID_CALL = ::T.let(nil, ::T.untyped)
+  V_ERR_INVALID_EXTENSION = ::T.let(nil, ::T.untyped)
+  V_ERR_INVALID_NON_CA = ::T.let(nil, ::T.untyped)
+  V_ERR_INVALID_POLICY_EXTENSION = ::T.let(nil, ::T.untyped)
+  V_ERR_IP_ADDRESS_MISMATCH = ::T.let(nil, ::T.untyped)
+  V_ERR_KEYUSAGE_NO_CRL_SIGN = ::T.let(nil, ::T.untyped)
+  V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE = ::T.let(nil, ::T.untyped)
+  V_ERR_NO_EXPLICIT_POLICY = ::T.let(nil, ::T.untyped)
+  V_ERR_NO_VALID_SCTS = ::T.let(nil, ::T.untyped)
+  V_ERR_OCSP_CERT_UNKNOWN = ::T.let(nil, ::T.untyped)
+  V_ERR_OCSP_VERIFY_FAILED = ::T.let(nil, ::T.untyped)
+  V_ERR_OCSP_VERIFY_NEEDED = ::T.let(nil, ::T.untyped)
+  V_ERR_PATH_LOOP = ::T.let(nil, ::T.untyped)
+  V_ERR_PERMITTED_VIOLATION = ::T.let(nil, ::T.untyped)
+  V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED = ::T.let(nil, ::T.untyped)
+  V_ERR_PROXY_PATH_LENGTH_EXCEEDED = ::T.let(nil, ::T.untyped)
+  V_ERR_PROXY_SUBJECT_NAME_VIOLATION = ::T.let(nil, ::T.untyped)
+  V_ERR_STORE_LOOKUP = ::T.let(nil, ::T.untyped)
+  V_ERR_SUBTREE_MINMAX = ::T.let(nil, ::T.untyped)
+  V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 = ::T.let(nil, ::T.untyped)
+  V_ERR_SUITE_B_INVALID_ALGORITHM = ::T.let(nil, ::T.untyped)
+  V_ERR_SUITE_B_INVALID_CURVE = ::T.let(nil, ::T.untyped)
+  V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM = ::T.let(nil, ::T.untyped)
+  V_ERR_SUITE_B_INVALID_VERSION = ::T.let(nil, ::T.untyped)
+  V_ERR_SUITE_B_LOS_NOT_ALLOWED = ::T.let(nil, ::T.untyped)
+  V_ERR_UNABLE_TO_GET_CRL_ISSUER = ::T.let(nil, ::T.untyped)
+  V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION = ::T.let(nil, ::T.untyped)
+  V_ERR_UNHANDLED_CRITICAL_EXTENSION = ::T.let(nil, ::T.untyped)
+  V_ERR_UNNESTED_RESOURCE = ::T.let(nil, ::T.untyped)
+  V_ERR_UNSPECIFIED = ::T.let(nil, ::T.untyped)
+  V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX = ::T.let(nil, ::T.untyped)
+  V_ERR_UNSUPPORTED_CONSTRAINT_TYPE = ::T.let(nil, ::T.untyped)
+  V_ERR_UNSUPPORTED_EXTENSION_FEATURE = ::T.let(nil, ::T.untyped)
+  V_ERR_UNSUPPORTED_NAME_SYNTAX = ::T.let(nil, ::T.untyped)
+  V_FLAG_NO_CHECK_TIME = ::T.let(nil, ::T.untyped)
+  V_FLAG_PARTIAL_CHAIN = ::T.let(nil, ::T.untyped)
+  V_FLAG_SUITEB_128_LOS = ::T.let(nil, ::T.untyped)
+  V_FLAG_SUITEB_128_LOS_ONLY = ::T.let(nil, ::T.untyped)
+  V_FLAG_SUITEB_192_LOS = ::T.let(nil, ::T.untyped)
+  V_FLAG_TRUSTED_FIRST = ::T.let(nil, ::T.untyped)
+  V_FLAG_USE_CHECK_TIME = ::T.let(nil, ::T.untyped)
+end
+
+class OpenSSL::X509::Attribute
+  def ==(other); end
+end
+
+class OpenSSL::X509::CRL
+  def ==(other); end
+end
+
+class OpenSSL::X509::Extension
+  def ==(other); end
+end
+
+class OpenSSL::X509::Name
+  def to_utf8(); end
+end
+
+class OpenSSL::X509::Request
+  def ==(other); end
+end
+
+class OpenSSL::X509::Revoked
+  def ==(other); end
+
+  def to_der(); end
+end
+
+module OpenSSL
+  def self.fips_mode(); end
+end
+
+class OpenStruct
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class OptionParser
+  def additional_message(typ, opt); end
+end
+
+class OptionParser::List
+  def get_candidates(id); end
+end
+
+class OptionParser::ParseError
+  def additional(); end
+
+  def additional=(additional); end
+end
+
+class PDF::Reader::TransformationMatrix
+  def multiply_with_an_object!(m2); end
+end
+
+module Parallel
+  Stop = ::T.let(nil, ::T.untyped)
+  VERSION = ::T.let(nil, ::T.untyped)
+  Version = ::T.let(nil, ::T.untyped)
+end
+
+class Parallel::Break
+  def initialize(value=T.unsafe(nil)); end
+
+  def value(); end
+end
+
+class Parallel::UserInterruptHandler
+  INTERRUPT_SIGNAL = ::T.let(nil, ::T.untyped)
+end
+
+module Parallel
+  def self.flat_map(*args, &block); end
+end
+
+module Parlour
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Parlour::ConflictResolver
+  def resolve_conflicts(*args, &blk); end
+end
+
+class Parlour::ConflictResolver
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+module Parlour::Conversion
+end
+
+class Parlour::Conversion::Converter
+  def add_warning(*args, &blk); end
+
+  def warnings(*args, &blk); end
+end
+
+class Parlour::Conversion::Converter
+  extend ::T::Sig
+  extend ::T::Helpers
+  extend ::T::Private::Abstract::Hooks
+  extend ::T::InterfaceWrapper::Helpers
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::Conversion::RbiToRbs
+  def convert_all(*args, &blk); end
+
+  def convert_object(*args, &blk); end
+
+  def initialize(*args, &blk); end
+
+  def rbs_gen(*args, &blk); end
+end
+
+class Parlour::Conversion::RbiToRbs
+end
+
+module Parlour::Conversion
+end
+
+module Parlour::Debugging
+end
+
+module Parlour::Debugging::Tree
+  INDENT_SPACES = ::T.let(nil, ::T.untyped)
+end
+
+module Parlour::Debugging::Tree
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+  def self.begin(*args, &blk); end
+
+  def self.end(*args, &blk); end
+
+  def self.here(*args, &blk); end
+
+  def self.line_prefix(); end
+
+  def self.text_prefix(); end
+end
+
+module Parlour::Debugging
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+  def self.debug_mode=(*args, &blk); end
+
+  def self.debug_mode?(*args, &blk); end
+
+  def self.debug_puts(*args, &blk); end
+
+  def self.name_for_debug_caller(*args, &blk); end
+end
+
+class Parlour::DetachedRbiGenerator
+  def detached!(*args, &blk); end
+end
+
+class Parlour::DetachedRbiGenerator
+end
+
+class Parlour::DetachedRbsGenerator
+  def detached!(*args, &blk); end
+end
+
+class Parlour::DetachedRbsGenerator
+end
+
+class Parlour::Generator
+  def current_plugin(*args, &blk); end
+
+  def current_plugin=(current_plugin); end
+
+  def initialize(*args, &blk); end
+
+  def options(*args, &blk); end
+end
+
+class Parlour::Generator
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::Options
+  def break_params(*args, &blk); end
+
+  def indented(*args, &blk); end
+
+  def initialize(*args, &blk); end
+
+  def sort_namespaces(*args, &blk); end
+
+  def tab_size(*args, &blk); end
+end
+
+class Parlour::Options
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::ParseError
+  def buffer(*args, &blk); end
+
+  def initialize(buffer, range); end
+
+  def range(*args, &blk); end
+end
+
+class Parlour::ParseError
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::Plugin
+  def generate(*args, &blk); end
+
+  def initialize(*args, &blk); end
+
+  def strictness(*args, &blk); end
+
+  def strictness=(strictness); end
+end
+
+class Parlour::Plugin
+  extend ::T::Sig
+  extend ::T::Helpers
+  extend ::T::Private::Abstract::Hooks
+  extend ::T::InterfaceWrapper::Helpers
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+  def self.inherited(*args, &blk); end
+
+  def self.registered_plugins(*args, &blk); end
+
+  def self.run_plugins(*args, &blk); end
+end
+
+class Parlour::RbiGenerator
+  def initialize(**hash); end
+
+  def rbi(*args, &blk); end
+
+  def root(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::Arbitrary
+  def ==(*args, &blk); end
+
+  def code(*args, &blk); end
+
+  def code=(code); end
+end
+
+class Parlour::RbiGenerator::Arbitrary
+end
+
+class Parlour::RbiGenerator::Attribute
+  def class_attribute(*args, &blk); end
+
+  def kind(*args, &blk); end
+
+  def type(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::Attribute
+end
+
+class Parlour::RbiGenerator::ClassNamespace
+  def abstract(*args, &blk); end
+
+  def superclass(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::ClassNamespace
+end
+
+class Parlour::RbiGenerator::Constant
+  def ==(*args, &blk); end
+
+  def eigen_constant(); end
+
+  def value(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::Constant
+end
+
+class Parlour::RbiGenerator::EnumClassNamespace
+  def enums(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::EnumClassNamespace
+end
+
+class Parlour::RbiGenerator::Extend
+  def ==(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::Extend
+end
+
+class Parlour::RbiGenerator::Include
+  def ==(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::Include
+end
+
+class Parlour::RbiGenerator::Method
+  def ==(*args, &blk); end
+
+  def abstract(*args, &blk); end
+
+  def class_method(*args, &blk); end
+
+  def final(*args, &blk); end
+
+  def implementation(*args, &blk); end
+
+  def overridable(*args, &blk); end
+
+  def override(*args, &blk); end
+
+  def parameters(*args, &blk); end
+
+  def return_type(*args, &blk); end
+
+  def type_parameters(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::Method
+end
+
+class Parlour::RbiGenerator::ModuleNamespace
+  def abstract(*args, &blk); end
+
+  def interface(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::ModuleNamespace
+end
+
+class Parlour::RbiGenerator::Namespace
+  def add_comment_to_next_child(*args, &blk); end
+
+  def aliases(*args, &blk); end
+
+  def children(*args, &blk); end
+
+  def constants(*args, &blk); end
+
+  def create_arbitrary(code:, &block); end
+
+  def create_attr(*args, &blk); end
+
+  def create_attr_accessor(*args, &blk); end
+
+  def create_attr_reader(*args, &blk); end
+
+  def create_attr_writer(*args, &blk); end
+
+  def create_attribute(*args, &blk); end
+
+  def create_class(*args, &blk); end
+
+  def create_constant(*args, &blk); end
+
+  def create_enum_class(*args, &blk); end
+
+  def create_extend(*args, &blk); end
+
+  def create_extends(*args, &blk); end
+
+  def create_include(*args, &blk); end
+
+  def create_includes(*args, &blk); end
+
+  def create_method(*args, &blk); end
+
+  def create_module(*args, &blk); end
+
+  def create_struct_class(*args, &blk); end
+
+  def create_type_alias(*args, &blk); end
+
+  def extends(*args, &blk); end
+
+  def final(*args, &blk); end
+
+  def includes(*args, &blk); end
+
+  def path(*args, &blk); end
+
+  def sealed(*args, &blk); end
+
+  def type_aliases(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::Namespace
+end
+
+Parlour::RbiGenerator::Options = Parlour::Options
+
+class Parlour::RbiGenerator::Parameter
+  def ==(*args, &blk); end
+
+  def default(*args, &blk); end
+
+  def generalize_from_rbi!(*args, &blk); end
+
+  def initialize(*args, &blk); end
+
+  def kind(*args, &blk); end
+
+  def name(*args, &blk); end
+
+  def name_without_kind(*args, &blk); end
+
+  def to_def_param(*args, &blk); end
+
+  def to_sig_param(*args, &blk); end
+
+  def type(*args, &blk); end
+  PREFIXES = ::T.let(nil, ::T.untyped)
+end
+
+class Parlour::RbiGenerator::Parameter
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::RbiGenerator::RbiObject
+  def generalize_from_rbi!(*args, &blk); end
+
+  def generate_rbi(*args, &blk); end
+
+  def generator(*args, &blk); end
+
+  def merge_into_self(*args, &blk); end
+
+  def mergeable?(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::RbiObject
+end
+
+class Parlour::RbiGenerator::StructClassNamespace
+  def props(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::StructClassNamespace
+end
+
+class Parlour::RbiGenerator::StructProp
+  def ==(*args, &blk); end
+
+  def array(*args, &blk); end
+
+  def default(*args, &blk); end
+
+  def dont_store(*args, &blk); end
+
+  def enum(*args, &blk); end
+
+  def factory(*args, &blk); end
+
+  def foreign(*args, &blk); end
+
+  def generalize_from_rbi!(*args, &blk); end
+
+  def immutable(*args, &blk); end
+
+  def initialize(*args, &blk); end
+
+  def name(*args, &blk); end
+
+  def optional(*args, &blk); end
+
+  def override(*args, &blk); end
+
+  def redaction(*args, &blk); end
+
+  def to_prop_call(*args, &blk); end
+
+  def type(*args, &blk); end
+  EXTRA_PROPERTIES = ::T.let(nil, ::T.untyped)
+end
+
+class Parlour::RbiGenerator::StructProp
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::RbiGenerator::TypeAlias
+  def ==(*args, &blk); end
+
+  def type(*args, &blk); end
+end
+
+class Parlour::RbiGenerator::TypeAlias
+end
+
+class Parlour::RbiGenerator
+end
+
+class Parlour::RbsGenerator
+  def initialize(**hash); end
+
+  def rbs(*args, &blk); end
+
+  def root(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Arbitrary
+  def ==(*args, &blk); end
+
+  def code(*args, &blk); end
+
+  def code=(code); end
+end
+
+class Parlour::RbsGenerator::Arbitrary
+end
+
+class Parlour::RbsGenerator::Attribute
+  def kind(*args, &blk); end
+
+  def type(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Attribute
+end
+
+class Parlour::RbsGenerator::Block
+  def ==(*args, &blk); end
+
+  def generate_rbs(*args, &blk); end
+
+  def initialize(*args, &blk); end
+
+  def required(*args, &blk); end
+
+  def type(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Block
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::RbsGenerator::ClassNamespace
+  def superclass(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::ClassNamespace
+end
+
+class Parlour::RbsGenerator::Constant
+  def ==(*args, &blk); end
+
+  def type(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Constant
+end
+
+class Parlour::RbsGenerator::Extend
+  def ==(*args, &blk); end
+
+  def type(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Extend
+end
+
+class Parlour::RbsGenerator::Include
+  def ==(*args, &blk); end
+
+  def type(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Include
+end
+
+class Parlour::RbsGenerator::InterfaceNamespace
+end
+
+class Parlour::RbsGenerator::InterfaceNamespace
+end
+
+class Parlour::RbsGenerator::Method
+  def ==(*args, &blk); end
+
+  def class_method(*args, &blk); end
+
+  def signatures(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Method
+end
+
+class Parlour::RbsGenerator::MethodSignature
+  def ==(*args, &blk); end
+
+  def block(*args, &blk); end
+
+  def generate_rbs(*args, &blk); end
+
+  def initialize(*args, &blk); end
+
+  def parameters(*args, &blk); end
+
+  def return_type(*args, &blk); end
+
+  def type_parameters(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::MethodSignature
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::RbsGenerator::ModuleNamespace
+end
+
+class Parlour::RbsGenerator::ModuleNamespace
+end
+
+class Parlour::RbsGenerator::Namespace
+  def add_comment_to_next_child(*args, &blk); end
+
+  def aliases(*args, &blk); end
+
+  def children(*args, &blk); end
+
+  def constants(*args, &blk); end
+
+  def create_arbitrary(code:, &block); end
+
+  def create_attr(*args, &blk); end
+
+  def create_attr_accessor(*args, &blk); end
+
+  def create_attr_reader(*args, &blk); end
+
+  def create_attr_writer(*args, &blk); end
+
+  def create_attribute(*args, &blk); end
+
+  def create_class(*args, &blk); end
+
+  def create_constant(*args, &blk); end
+
+  def create_extend(*args, &blk); end
+
+  def create_extends(*args, &blk); end
+
+  def create_include(*args, &blk); end
+
+  def create_includes(*args, &blk); end
+
+  def create_interface(*args, &blk); end
+
+  def create_method(*args, &blk); end
+
+  def create_module(*args, &blk); end
+
+  def create_type_alias(*args, &blk); end
+
+  def extends(*args, &blk); end
+
+  def includes(*args, &blk); end
+
+  def path(*args, &blk); end
+
+  def type_aliases(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::Namespace
+end
+
+class Parlour::RbsGenerator::Parameter
+  def ==(*args, &blk); end
+
+  def initialize(*args, &blk); end
+
+  def kind(*args, &blk); end
+
+  def name(*args, &blk); end
+
+  def name_without_kind(*args, &blk); end
+
+  def required(*args, &blk); end
+
+  def to_rbs_param(*args, &blk); end
+
+  def type(*args, &blk); end
+  PREFIXES = ::T.let(nil, ::T.untyped)
+  RBS_KEYWORDS = ::T.let(nil, ::T.untyped)
+end
+
+class Parlour::RbsGenerator::Parameter
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::RbsGenerator::RbsObject
+  def generate_rbs(*args, &blk); end
+
+  def generator(*args, &blk); end
+
+  def merge_into_self(*args, &blk); end
+
+  def mergeable?(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::RbsObject
+end
+
+class Parlour::RbsGenerator::TypeAlias
+  def ==(*args, &blk); end
+
+  def type(*args, &blk); end
+end
+
+class Parlour::RbsGenerator::TypeAlias
+end
+
+class Parlour::RbsGenerator
+end
+
+module Parlour::TypeLoader
+end
+
+module Parlour::TypeLoader
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+  def self.load_file(*args, &blk); end
+
+  def self.load_project(*args, &blk); end
+
+  def self.load_source(*args, &blk); end
+end
+
+class Parlour::TypeParser
+  def ast(*args, &blk); end
+
+  def ast=(ast); end
+
+  def body_has_modifier?(*args, &blk); end
+
+  def body_includes_and_extends(*args, &blk); end
+
+  def constant_names(*args, &blk); end
+
+  def generator(*args, &blk); end
+
+  def generator=(generator); end
+
+  def initialize(*args, &blk); end
+
+  def node_to_s(*args, &blk); end
+
+  def parse_all(*args, &blk); end
+
+  def parse_err(*args, &blk); end
+
+  def parse_method_into_methods(*args, &blk); end
+
+  def parse_node_to_type(*args, &blk); end
+
+  def parse_path_to_object(*args, &blk); end
+
+  def parse_sig_into_methods(*args, &blk); end
+
+  def parse_sig_into_sig(*args, &blk); end
+
+  def previous_sibling_sig_node?(*args, &blk); end
+
+  def sig_node?(*args, &blk); end
+
+  def unknown_node_errors(*args, &blk); end
+
+  def warning(*args, &blk); end
+
+  def zip_by(*args, &blk); end
+end
+
+class Parlour::TypeParser::IntermediateSig
+  def abstract(); end
+
+  def abstract=(val); end
+
+  def final(); end
+
+  def final=(val); end
+
+  def initialize(*args, &blk); end
+
+  def overridable(); end
+
+  def overridable=(val); end
+
+  def override(); end
+
+  def override=(val); end
+
+  def params(); end
+
+  def params=(val); end
+
+  def return_type(); end
+
+  def return_type=(val); end
+
+  def type_parameters(); end
+
+  def type_parameters=(val); end
+end
+
+class Parlour::TypeParser::IntermediateSig
+  def self.inherited(s); end
+end
+
+class Parlour::TypeParser::NodePath
+  def child(*args, &blk); end
+
+  def indices(*args, &blk); end
+
+  def initialize(*args, &blk); end
+
+  def parent(*args, &blk); end
+
+  def sibling(*args, &blk); end
+
+  def traverse(*args, &blk); end
+end
+
+class Parlour::TypeParser::NodePath
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::TypeParser
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+  def self.from_source(*args, &blk); end
+
+  def self.parse_single_type(*args, &blk); end
+end
+
+class Parlour::TypedObject
+  def add_comment(*args, &blk); end
+
+  def add_comments(*args, &blk); end
+
+  def comments(*args, &blk); end
+
+  def describe(*args, &blk); end
+
+  def generate_comments(*args, &blk); end
+
+  def generated_by(*args, &blk); end
+
+  def initialize(*args, &blk); end
+
+  def name(*args, &blk); end
+end
+
+class Parlour::TypedObject
+  extend ::T::Sig
+  extend ::T::Helpers
+  extend ::T::Private::Abstract::Hooks
+  extend ::T::InterfaceWrapper::Helpers
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+module Parlour::Types
+  TypeLike = ::T.let(nil, ::T.untyped)
+end
+
+class Parlour::Types::Array
+  def ==(*args, &blk); end
+end
+
+class Parlour::Types::Array
+end
+
+class Parlour::Types::Boolean
+  def ==(*args, &blk); end
+end
+
+class Parlour::Types::Boolean
+end
+
+class Parlour::Types::Class
+  def ==(*args, &blk); end
+
+  def type(*args, &blk); end
+end
+
+class Parlour::Types::Class
+end
+
+class Parlour::Types::Enumerable
+  def ==(*args, &blk); end
+end
+
+class Parlour::Types::Enumerable
+end
+
+class Parlour::Types::Enumerator
+  def ==(*args, &blk); end
+end
+
+class Parlour::Types::Enumerator
+end
+
+class Parlour::Types::Generic
+  def ==(*args, &blk); end
+
+  def type(*args, &blk); end
+
+  def type_params(*args, &blk); end
+end
+
+class Parlour::Types::Generic
+end
+
+class Parlour::Types::Hash
+  def ==(*args, &blk); end
+
+  def key(*args, &blk); end
+
+  def value(*args, &blk); end
+end
+
+class Parlour::Types::Hash
+end
+
+class Parlour::Types::Intersection
+  def ==(*args, &blk); end
+
+  def types(*args, &blk); end
+end
+
+class Parlour::Types::Intersection
+end
+
+class Parlour::Types::Nilable
+  def ==(*args, &blk); end
+
+  def type(*args, &blk); end
+end
+
+class Parlour::Types::Nilable
+end
+
+class Parlour::Types::Proc
+  def ==(*args, &blk); end
+
+  def parameters(*args, &blk); end
+
+  def return_type(*args, &blk); end
+end
+
+class Parlour::Types::Proc::Parameter
+  def ==(*args, &blk); end
+
+  def default(*args, &blk); end
+
+  def initialize(*args, &blk); end
+
+  def name(*args, &blk); end
+
+  def type(*args, &blk); end
+end
+
+class Parlour::Types::Proc::Parameter
+  extend ::T::Sig
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+end
+
+class Parlour::Types::Proc
+end
+
+class Parlour::Types::Range
+  def ==(*args, &blk); end
+end
+
+class Parlour::Types::Range
+end
+
+class Parlour::Types::Raw
+  def ==(*args, &blk); end
+
+  def str(*args, &blk); end
+end
+
+class Parlour::Types::Raw
+end
+
+class Parlour::Types::Record
+  def ==(*args, &blk); end
+
+  def keys_to_types(*args, &blk); end
+end
+
+class Parlour::Types::Record
+end
+
+class Parlour::Types::Self
+  def ==(*args, &blk); end
+end
+
+class Parlour::Types::Self
+end
+
+class Parlour::Types::Set
+  def ==(*args, &blk); end
+end
+
+class Parlour::Types::Set
+end
+
+class Parlour::Types::SingleElementCollection
+  def collection_name(*args, &blk); end
+
+  def element(*args, &blk); end
+end
+
+class Parlour::Types::SingleElementCollection
+end
+
+class Parlour::Types::Tuple
+  def ==(*args, &blk); end
+
+  def types(*args, &blk); end
+end
+
+class Parlour::Types::Tuple
+end
+
+class Parlour::Types::Type
+  def describe(*args, &blk); end
+
+  def generate_rbi(*args, &blk); end
+
+  def generate_rbs(*args, &blk); end
+
+  def initialize(*args, &blk); end
+
+  def to_type(*args, &blk); end
+end
+
+class Parlour::Types::Type
+  extend ::T::Sig
+  extend ::T::Helpers
+  extend ::T::Private::Abstract::Hooks
+  extend ::T::InterfaceWrapper::Helpers
+  extend ::T::Private::Methods::MethodHooks
+  extend ::T::Private::Methods::SingletonMethodHooks
+  def self.to_type(*args, &blk); end
+end
+
+class Parlour::Types::Union
+  def ==(*args, &blk); end
+
+  def types(*args, &blk); end
+end
+
+class Parlour::Types::Union
+end
+
+class Parlour::Types::Untyped
+  def ==(*args, &blk); end
+end
+
+class Parlour::Types::Untyped
+end
+
+module Parlour::Types
+end
+
+module Parlour
+end
+
+ParseError = Racc::ParseError
+
+module Parser
+  MESSAGES = ::T.let(nil, ::T.untyped)
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Builders::Default
+  def pair_label(key_t); end
+end
+
+class Parser::Context
+  def in_argdef(); end
+
+  def in_argdef=(in_argdef); end
+
+  def in_block(); end
+
+  def in_block=(in_block); end
+
+  def in_class(); end
+
+  def in_class=(in_class); end
+
+  def in_def(); end
+
+  def in_def=(in_def); end
+
+  def in_defined(); end
+
+  def in_defined=(in_defined); end
+
+  def in_kwarg(); end
+
+  def in_kwarg=(in_kwarg); end
+
+  def in_lambda(); end
+
+  def in_lambda=(in_lambda); end
+  FLAGS = ::T.let(nil, ::T.untyped)
+end
+
+Parser::CurrentRuby = Parser::Ruby27
+
+class Parser::Diagnostic
+  LEVELS = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Lexer
+  ESCAPES = ::T.let(nil, ::T.untyped)
+  KEYWORDS = ::T.let(nil, ::T.untyped)
+  KEYWORDS_BEGIN = ::T.let(nil, ::T.untyped)
+  LEX_STATES = ::T.let(nil, ::T.untyped)
+  PUNCTUATION = ::T.let(nil, ::T.untyped)
+  PUNCTUATION_BEGIN = ::T.let(nil, ::T.untyped)
+  REGEXP_META_CHARACTERS = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Lexer::Dedenter
+  TAB_WIDTH = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Lexer::Literal
+  DELIMITERS = ::T.let(nil, ::T.untyped)
+  TYPES = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::MaxNumparamStack
+  ORDINARY_PARAMS = ::T.let(nil, ::T.untyped)
+end
+
+module Parser::Meta
+  NODE_TYPES = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Rewriter
+  DEPRECATION_WARNING = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Ruby24
+  def _reduce_335(val, _values, result); end
+
+  def _reduce_336(val, _values, result); end
+
+  def _reduce_339(val, _values, result); end
+
+  def _reduce_345(val, _values, result); end
+
+  def _reduce_350(val, _values, result); end
+
+  def _reduce_370(val, _values, result); end
+
+  def _reduce_379(val, _values, result); end
+
+  def _reduce_390(val, _values, result); end
+
+  def _reduce_426(val, _values, result); end
+
+  def _reduce_430(val, _values, result); end
+
+  def _reduce_431(val, _values, result); end
+
+  def _reduce_436(val, _values, result); end
+
+  def _reduce_474(val, _values, result); end
+
+  def _reduce_532(val, _values, result); end
+
+  def _reduce_548(val, _values, result); end
+
+  def _reduce_549(val, _values, result); end
+
+  def _reduce_558(val, _values, result); end
+
+  def _reduce_559(val, _values, result); end
+
+  def _reduce_562(val, _values, result); end
+
+  def _reduce_563(val, _values, result); end
+
+  def _reduce_567(val, _values, result); end
+
+  def _reduce_570(val, _values, result); end
+
+  def _reduce_577(val, _values, result); end
+
+  def _reduce_578(val, _values, result); end
+
+  def _reduce_591(val, _values, result); end
+
+  def _reduce_592(val, _values, result); end
+
+  def _reduce_597(val, _values, result); end
+
+  def _reduce_598(val, _values, result); end
+
+  def _reduce_602(val, _values, result); end
+
+  def _reduce_606(val, _values, result); end
+
+  def local_pop(); end
+
+  def local_push(); end
+  Racc_arg = ::T.let(nil, ::T.untyped)
+  Racc_debug_parser = ::T.let(nil, ::T.untyped)
+  Racc_token_to_s_table = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Ruby27
+  def _reduce_345(val, _values, result); end
+
+  def _reduce_346(val, _values, result); end
+
+  def _reduce_350(val, _values, result); end
+
+  def _reduce_354(val, _values, result); end
+
+  def _reduce_360(val, _values, result); end
+
+  def _reduce_379(val, _values, result); end
+
+  def _reduce_388(val, _values, result); end
+
+  def _reduce_398(val, _values, result); end
+
+  def _reduce_434(val, _values, result); end
+
+  def _reduce_439(val, _values, result); end
+
+  def _reduce_443(val, _values, result); end
+
+  def _reduce_448(val, _values, result); end
+
+  def _reduce_450(val, _values, result); end
+
+  def _reduce_452(val, _values, result); end
+
+  def _reduce_477(val, _values, result); end
+
+  def _reduce_486(val, _values, result); end
+
+  def _reduce_502(val, _values, result); end
+
+  def _reduce_507(val, _values, result); end
+
+  def _reduce_508(val, _values, result); end
+
+  def _reduce_509(val, _values, result); end
+
+  def _reduce_513(val, _values, result); end
+
+  def _reduce_514(val, _values, result); end
+
+  def _reduce_531(val, _values, result); end
+
+  def _reduce_532(val, _values, result); end
+
+  def _reduce_536(val, _values, result); end
+
+  def _reduce_538(val, _values, result); end
+
+  def _reduce_574(val, _values, result); end
+
+  def _reduce_575(val, _values, result); end
+
+  def _reduce_576(val, _values, result); end
+
+  def _reduce_638(val, _values, result); end
+
+  def _reduce_654(val, _values, result); end
+
+  def _reduce_655(val, _values, result); end
+
+  def _reduce_665(val, _values, result); end
+
+  def _reduce_666(val, _values, result); end
+
+  def _reduce_670(val, _values, result); end
+
+  def _reduce_674(val, _values, result); end
+
+  def _reduce_684(val, _values, result); end
+
+  def _reduce_685(val, _values, result); end
+
+  def _reduce_686(val, _values, result); end
+
+  def _reduce_699(val, _values, result); end
+
+  def _reduce_700(val, _values, result); end
+
+  def _reduce_705(val, _values, result); end
+
+  def _reduce_706(val, _values, result); end
+
+  def _reduce_707(val, _values, result); end
+
+  def _reduce_711(val, _values, result); end
+
+  def _reduce_715(val, _values, result); end
+
+  def local_pop(); end
+
+  def local_push(); end
+
+  def try_declare_numparam(node); end
+  Racc_arg = ::T.let(nil, ::T.untyped)
+  Racc_debug_parser = ::T.let(nil, ::T.untyped)
+  Racc_token_to_s_table = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Source::Buffer
+  ENCODING_RE = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Source::Comment::Associator
+  MAGIC_COMMENT_RE = ::T.let(nil, ::T.untyped)
+  POSTFIX_TYPES = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Source::Rewriter
+  DEPRECATION_WARNING = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::Source::TreeRewriter
+  ACTIONS = ::T.let(nil, ::T.untyped)
+  DEPRECATION_WARNING = ::T.let(nil, ::T.untyped)
+  POLICY_TO_LEVEL = ::T.let(nil, ::T.untyped)
+end
+
+class Parser::StaticEnvironment
+  def declare_anonymous_blockarg(); end
+
+  def declared_anonymous_blockarg?(); end
+  ANONYMOUS_BLOCKARG = ::T.let(nil, ::T.untyped)
+  FORWARD_ARGS = ::T.let(nil, ::T.untyped)
+end
+
+class Proc
+  def <<(arg); end
+
+  def >>(arg); end
+
+  def clone(); end
+end
+
+module Process
+  CLOCK_TAI = ::T.let(nil, ::T.untyped)
+end
+
+class Pry
+  BINDING_METHOD_IMPL = ::T.let(nil, ::T.untyped)
+  Commands = ::T.let(nil, ::T.untyped)
+  EMPTY_COMPLETIONS = ::T.let(nil, ::T.untyped)
+  HAS_SAFE_LEVEL = ::T.let(nil, ::T.untyped)
+  LOCAL_RC_FILE = ::T.let(nil, ::T.untyped)
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::BasicObject
+  ENV = ::T.let(nil, ::T.untyped)
+end
+
+Pry::BasicObject::Dir = Dir
+
+Pry::BasicObject::File = File
+
+Pry::BasicObject::Kernel = Kernel
+
+Pry::BasicObject::LoadError = LoadError
+
+Pry::BasicObject::Pry = Pry
+
+class Pry::Code
+  extend ::MethodSource::CodeHelpers
+end
+
+class Pry::CodeFile
+  DEFAULT_EXT = ::T.let(nil, ::T.untyped)
+  EXTENSIONS = ::T.let(nil, ::T.untyped)
+  FILES = ::T.let(nil, ::T.untyped)
+  INITIAL_PWD = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Command
+  VOID_VALUE = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Command::Ls
+  DEFAULT_OPTIONS = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Command::Ls::Constants
+  DEPRECATED_CONSTANTS = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Command::Ls::Globals
+  BUILTIN_GLOBALS = ::T.let(nil, ::T.untyped)
+  PSEUDO_GLOBALS = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Command::Wtf
+  RUBY_FRAME_PATTERN = ::T.let(nil, ::T.untyped)
+end
+
+module Pry::Helpers::DocumentationHelpers
+  YARD_TAGS = ::T.let(nil, ::T.untyped)
+end
+
+module Pry::Helpers::Text
+  COLORS = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Indent
+  IGNORE_TOKENS = ::T.let(nil, ::T.untyped)
+  MIDWAY_TOKENS = ::T.let(nil, ::T.untyped)
+  OPEN_TOKENS = ::T.let(nil, ::T.untyped)
+  OPTIONAL_DO_TOKENS = ::T.let(nil, ::T.untyped)
+  SINGLELINE_TOKENS = ::T.let(nil, ::T.untyped)
+  SPACES = ::T.let(nil, ::T.untyped)
+  STATEMENT_END_TOKENS = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::InputCompleter
+  ARRAY_REGEXP = ::T.let(nil, ::T.untyped)
+  CONSTANT_OR_METHOD_REGEXP = ::T.let(nil, ::T.untyped)
+  CONSTANT_REGEXP = ::T.let(nil, ::T.untyped)
+  GLOBALVARIABLE_REGEXP = ::T.let(nil, ::T.untyped)
+  HEX_REGEXP = ::T.let(nil, ::T.untyped)
+  NUMERIC_REGEXP = ::T.let(nil, ::T.untyped)
+  PROC_OR_HASH_REGEXP = ::T.let(nil, ::T.untyped)
+  REGEX_REGEXP = ::T.let(nil, ::T.untyped)
+  RESERVED_WORDS = ::T.let(nil, ::T.untyped)
+  SYMBOL_METHOD_CALL_REGEXP = ::T.let(nil, ::T.untyped)
+  SYMBOL_REGEXP = ::T.let(nil, ::T.untyped)
+  TOPLEVEL_LOOKUP_REGEXP = ::T.let(nil, ::T.untyped)
+  VARIABLE_REGEXP = ::T.let(nil, ::T.untyped)
+  WORD_ESCAPE_STR = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Inspector
+  MAP = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::ObjectPath
+  SPECIAL_TERMS = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Output
+  DEFAULT_SIZE = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Slop
+  DEFAULT_OPTIONS = ::T.let(nil, ::T.untyped)
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Pry::Slop::Option
+  DEFAULT_OPTIONS = ::T.let(nil, ::T.untyped)
+end
+
+module Psych
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Psych::Visitors::RestrictedYAMLTree
+  def visit_Symbol(sym); end
+  DEFAULT_PERMITTED_CLASSES = ::T.let(nil, ::T.untyped)
+end
+
+class Psych::Visitors::RestrictedYAMLTree
+end
+
+class Psych::Visitors::Visitor
+  def self.dispatch_cache(); end
+end
+
+module Psych
+  def self.add_builtin_type(type_tag, &block); end
+
+  def self.add_domain_type(domain, type_tag, &block); end
+
+  def self.add_tag(tag, klass); end
+
+  def self.domain_types(); end
+
+  def self.domain_types=(domain_types); end
+
+  def self.dump_tags(); end
+
+  def self.dump_tags=(dump_tags); end
+
+  def self.libyaml_version(); end
+
+  def self.load_tags(); end
+
+  def self.load_tags=(load_tags); end
+
+  def self.remove_type(type_tag); end
+
+  def self.safe_dump(o, io=T.unsafe(nil), options=T.unsafe(nil)); end
+
+  def self.safe_load_file(filename, **kwargs); end
+
+  def self.unsafe_load(yaml, filename: T.unsafe(nil), fallback: T.unsafe(nil), symbolize_names: T.unsafe(nil), freeze: T.unsafe(nil)); end
+
+  def self.unsafe_load_file(filename, **kwargs); end
+end
+
+class RDoc::Alias
+  def initialize(text, old_name, new_name, comment, singleton=T.unsafe(nil)); end
+end
+
+class RDoc::AnyMethod
+  def _call_seq(); end
+
+  def section_title(); end
+
+  def section_title=(section_title); end
+end
+
+class RDoc::Attr
+  def initialize(text, name, rw, comment, singleton=T.unsafe(nil)); end
+end
+
+class RDoc::ClassModule
+  def initialize(name, superclass=T.unsafe(nil)); end
+end
+
+class RDoc::CodeObject
+  def initialize_visibility(); end
+end
+
+class RDoc::Comment
+  def initialize(text=T.unsafe(nil), location=T.unsafe(nil), language=T.unsafe(nil)); end
+
+  def line(); end
+
+  def line=(line); end
+end
+
+class RDoc::Constant
+  def initialize(name, value, comment); end
+  MARSHAL_VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class RDoc::Context
+  def add_module_by_normal_module(mod); end
+
+  def initialize_methods_etc(); end
+
+  def instance_methods(); end
+end
+
+class RDoc::Context::Section
+  def initialize(parent, title, comment); end
+end
+
+class RDoc::CrossReference
+  def initialize(context); end
+
+  def resolve_method(name); end
+end
+
+module RDoc::Encoding
+  HEADER_REGEXP = ::T.let(nil, ::T.untyped)
+end
+
+module RDoc::Encoding
+  def self.detect_encoding(string); end
+
+  def self.remove_magic_comment(string); end
+end
+
+class RDoc::Generator::Darkfish
+  def initialize(store, options); end
+end
+
+class RDoc::Generator::JsonIndex
+  def initialize(parent_generator, options); end
+end
+
+class RDoc::Generator::POT
+  def initialize(store, options); end
+end
+
+class RDoc::Generator::POT::MessageExtractor
+  def initialize(store); end
+end
+
+class RDoc::Generator::POT::POEntry
+  def initialize(msgid, options=T.unsafe(nil)); end
+end
+
+class RDoc::Generator::RI
+  def initialize(store, options); end
+end
+
+class RDoc::I18n::Locale
+  def initialize(name); end
+end
+
+class RDoc::I18n::Text
+  def initialize(raw); end
+end
+
+class RDoc::Markdown
+  def _Table(); end
+
+  def _TableColumn(); end
+
+  def _TableItem(); end
+
+  def _TableLine(); end
+
+  def _TableRow(); end
+
+  def initialize(extensions=T.unsafe(nil), debug=T.unsafe(nil)); end
+end
+
+class RDoc::Markdown::Literals
+  def initialize(str, debug=T.unsafe(nil)); end
+end
+
+class RDoc::Markdown::Literals::MemoEntry
+  def initialize(ans, pos); end
+end
+
+class RDoc::Markdown::Literals::RuleInfo
+  def initialize(name, rendered); end
+end
+
+class RDoc::Markdown::MemoEntry
+  def initialize(ans, pos); end
+end
+
+class RDoc::Markdown::RuleInfo
+  def initialize(name, rendered); end
+end
+
+class RDoc::Markup
+  def add_regexp_handling(pattern, name); end
+
+  def initialize(attribute_manager=T.unsafe(nil)); end
+end
+
+class RDoc::Markup::AttrSpan
+  def initialize(length, exclusive); end
+end
+
+class RDoc::Markup::AttributeManager
+  def add_regexp_handling(pattern, name, exclusive=T.unsafe(nil)); end
+
+  def convert_attrs_matching_word_pairs(str, attrs, exclusive); end
+
+  def convert_attrs_word_pair_map(str, attrs, exclusive); end
+
+  def convert_regexp_handlings(str, attrs, exclusive=T.unsafe(nil)); end
+
+  def exclusive?(attr); end
+
+  def exclusive_bitmap(); end
+
+  def regexp_handlings(); end
+  NON_PRINTING_END = ::T.let(nil, ::T.untyped)
+  NON_PRINTING_START = ::T.let(nil, ::T.untyped)
+end
+
+class RDoc::Markup::Attributes
+  def regexp_handling(); end
+end
+
+class RDoc::Markup::Document
+  def initialize(*parts); end
+end
+
+class RDoc::Markup::Formatter
+  def add_regexp_handling_RDOCLINK(); end
+
+  def add_regexp_handling_TIDYLINK(); end
+
+  def convert_regexp_handling(target); end
+
+  def initialize(options, markup=T.unsafe(nil)); end
+end
+
+class RDoc::Markup::Include
+  def initialize(file, include_path); end
+end
+
+class RDoc::Markup::IndentedParagraph
+  def initialize(indent, *parts); end
+end
+
+class RDoc::Markup::List
+  def initialize(type=T.unsafe(nil), *items); end
+end
+
+class RDoc::Markup::ListItem
+  def initialize(label=T.unsafe(nil), *parts); end
+end
+
+class RDoc::Markup::Parser::MyStringScanner
+  def [](i); end
+
+  def eos?(); end
+
+  def initialize(input); end
+
+  def matched(); end
+
+  def newline!(); end
+
+  def pos(); end
+
+  def scan(re); end
+
+  def unscan(s); end
+end
+
+class RDoc::Markup::Parser::MyStringScanner
+end
+
+class RDoc::Markup::PreProcess
+  def initialize(input_file_name, include_path); end
+end
+
+class RDoc::Markup::Raw
+  def initialize(*parts); end
+end
+
+class RDoc::Markup::RegexpHandling
+  def ==(o); end
+
+  def initialize(type, text); end
+
+  def text(); end
+
+  def text=(text); end
+
+  def type(); end
+end
+
+class RDoc::Markup::RegexpHandling
+end
+
+class RDoc::Markup::Table
+  def ==(other); end
+
+  def accept(visitor); end
+
+  def align(); end
+
+  def align=(align); end
+
+  def body(); end
+
+  def body=(body); end
+
+  def header(); end
+
+  def header=(header); end
+
+  def initialize(header, align, body); end
+end
+
+class RDoc::Markup::Table
+end
+
+class RDoc::Markup::ToHtml
+  def accept_table(header, body, aligns); end
+
+  def handle_regexp_HARD_BREAK(target); end
+
+  def handle_regexp_HYPERLINK(target); end
+
+  def handle_regexp_RDOCLINK(target); end
+
+  def handle_regexp_TIDYLINK(target); end
+
+  def init_link_notation_regexp_handlings(); end
+
+  def init_regexp_handlings(); end
+end
+
+class RDoc::Markup::ToHtmlCrossref
+  def handle_regexp_CROSSREF(target); end
+
+  def initialize(options, from_path, context, markup=T.unsafe(nil)); end
+end
+
+class RDoc::Markup::ToHtmlSnippet
+  def handle_regexp_CROSSREF(target); end
+
+  def initialize(options, characters=T.unsafe(nil), paragraphs=T.unsafe(nil), markup=T.unsafe(nil)); end
+end
+
+class RDoc::Markup::ToJoinedParagraph
+  def accept_table(*node); end
+
+  def initialize(); end
+end
+
+class RDoc::Markup::ToLabel
+  def handle_regexp_CROSSREF(target); end
+
+  def handle_regexp_HARD_BREAK(*node); end
+
+  def handle_regexp_TIDYLINK(target); end
+
+  def initialize(markup=T.unsafe(nil)); end
+end
+
+class RDoc::Markup::ToMarkdown
+  def handle_regexp_RDOCLINK(target); end
+
+  def handle_regexp_TIDYLINK(target); end
+end
+
+class RDoc::Markup::ToRdoc
+  def accept_table(header, body, aligns); end
+
+  def handle_regexp_HARD_BREAK(target); end
+
+  def handle_regexp_SUPPRESSED_CROSSREF(target); end
+
+  def initialize(markup=T.unsafe(nil)); end
+end
+
+class RDoc::Markup::ToTableOfContents
+  def accept_table(*node); end
+
+  def initialize(); end
+end
+
+class RDoc::Markup::ToTtOnly
+  def initialize(markup=T.unsafe(nil)); end
+end
+
+class RDoc::MethodAttr
+  def initialize(text, name); end
+end
+
+class RDoc::Mixin
+  def initialize(name, comment); end
+end
+
+class RDoc::Options
+  def override(map); end
+end
+
+class RDoc::Options
+  def self.load_options(); end
+end
+
+class RDoc::Parser
+  def initialize(top_level, file_name, content, options, stats); end
+end
+
+class RDoc::Parser::C
+  def add_alias(var_name, class_obj, old_name, new_name, comment); end
+
+  def do_classes_and_modules(); end
+
+  def new_comment(text=T.unsafe(nil), location=T.unsafe(nil), language=T.unsafe(nil)); end
+end
+
+class RDoc::Parser::ChangeLog
+  def parse_date(date); end
+end
+
+module RDoc::Parser::ChangeLog::Git
+  def create_entries(entries); end
+
+  def parse_entries(); end
+
+  def parse_info(info); end
+  HEADING_LEVEL = ::T.let(nil, ::T.untyped)
+end
+
+class RDoc::Parser::ChangeLog::Git::LogEntry
+  def accept(visitor); end
+
+  def aref(); end
+
+  def author(); end
+
+  def author=(_); end
+
+  def base(); end
+
+  def base=(_); end
+
+  def commit(); end
+
+  def commit=(_); end
+
+  def contents(); end
+
+  def contents=(_); end
+
+  def date(); end
+
+  def date=(_); end
+
+  def email(); end
+
+  def email=(_); end
+
+  def initialize(base, commit, author, email, date, contents); end
+
+  def label(context=T.unsafe(nil)); end
+
+  def level(); end
+
+  def text(); end
+end
+
+class RDoc::Parser::ChangeLog::Git::LogEntry
+  def self.[](*arg); end
+
+  def self.members(); end
+end
+
+module RDoc::Parser::ChangeLog::Git
+end
+
+class RDoc::Parser::RipperStateLex
+  def get_squashed_tk(); end
+
+  def initialize(code); end
+  EXPR_ARG = ::T.let(nil, ::T.untyped)
+  EXPR_ARG_ANY = ::T.let(nil, ::T.untyped)
+  EXPR_BEG = ::T.let(nil, ::T.untyped)
+  EXPR_BEG_ANY = ::T.let(nil, ::T.untyped)
+  EXPR_CLASS = ::T.let(nil, ::T.untyped)
+  EXPR_CMDARG = ::T.let(nil, ::T.untyped)
+  EXPR_DOT = ::T.let(nil, ::T.untyped)
+  EXPR_END = ::T.let(nil, ::T.untyped)
+  EXPR_ENDARG = ::T.let(nil, ::T.untyped)
+  EXPR_ENDFN = ::T.let(nil, ::T.untyped)
+  EXPR_END_ANY = ::T.let(nil, ::T.untyped)
+  EXPR_FITEM = ::T.let(nil, ::T.untyped)
+  EXPR_FNAME = ::T.let(nil, ::T.untyped)
+  EXPR_LABEL = ::T.let(nil, ::T.untyped)
+  EXPR_LABELED = ::T.let(nil, ::T.untyped)
+  EXPR_MID = ::T.let(nil, ::T.untyped)
+  EXPR_NONE = ::T.let(nil, ::T.untyped)
+  EXPR_VALUE = ::T.let(nil, ::T.untyped)
+  RIPPER_HAS_LEX_STATE = ::T.let(nil, ::T.untyped)
+end
+
+class RDoc::Parser::RipperStateLex::InnerStateLex
+  def initialize(code); end
+
+  def on_default(event, tok, data); end
+end
+
+class RDoc::Parser::RipperStateLex::InnerStateLex
+end
+
+class RDoc::Parser::RipperStateLex::Token
+  def char_no(); end
+
+  def char_no=(_); end
+
+  def kind(); end
+
+  def kind=(_); end
+
+  def line_no(); end
+
+  def line_no=(_); end
+
+  def state(); end
+
+  def state=(_); end
+
+  def text(); end
+
+  def text=(_); end
+end
+
+class RDoc::Parser::RipperStateLex::Token
+  def self.[](*arg); end
+
+  def self.members(); end
+end
+
+class RDoc::Parser::RipperStateLex
+  def self.end?(token); end
+
+  def self.parse(code); end
+end
+
+class RDoc::Parser::Ruby
+  def get_included_module_with_optional_parens(); end
+
+  def parse_included_with_activesupport_concern(container, comment); end
+
+  def retrieve_comment_body(tk); end
+end
+
+module RDoc::Parser::RubyTools
+  def skip_tkspace_without_nl(); end
+end
+
+class RDoc::RD::BlockParser
+  Racc_debug_parser = ::T.let(nil, ::T.untyped)
+end
+
+class RDoc::RD::Inline
+  def initialize(rdoc, reference); end
+end
+
+class RDoc::RD::InlineParser
+  def initialize(block_parser); end
+  Racc_debug_parser = ::T.let(nil, ::T.untyped)
+end
+
+class RDoc::RI::Driver
+  def initialize(initial_options=T.unsafe(nil)); end
+end
+
+class RDoc::RI::Driver::NotFoundError
+  def initialize(klass, suggestions=T.unsafe(nil)); end
+end
+
+RDoc::RI::Store = RDoc::Store
+
+class RDoc::Require
+  def initialize(name, comment); end
+end
+
+class RDoc::Servlet
+  def initialize(server, stores, cache, mount_path=T.unsafe(nil), extra_doc_dirs=T.unsafe(nil)); end
+end
+
+class RDoc::Stats
+  def initialize(store, num_files, verbosity=T.unsafe(nil)); end
+end
+
+class RDoc::Stats::Quiet
+  def initialize(num_files); end
+end
+
+class RDoc::Store
+  def initialize(path=T.unsafe(nil), type=T.unsafe(nil)); end
+
+  def unmatched_constant_alias(); end
+
+  def update_parser_of_file(absolute_name, parser); end
+end
+
+class RDoc::Store::MissingFileError
+  def initialize(store, file, name); end
+end
+
+class RDoc::Task
+  def before_running_rdoc(&block); end
+
+  def check_names(names); end
+
+  def clobber_task_description(); end
+
+  def defaults(); end
+
+  def define(); end
+
+  def external(); end
+
+  def external=(external); end
+
+  def generator(); end
+
+  def generator=(generator); end
+
+  def initialize(name=T.unsafe(nil)); end
+
+  def inline_source(); end
+
+  def inline_source=(value); end
+
+  def main(); end
+
+  def main=(main); end
+
+  def markup(); end
+
+  def markup=(markup); end
+
+  def name(); end
+
+  def name=(name); end
+
+  def option_list(); end
+
+  def options(); end
+
+  def options=(options); end
+
+  def rdoc_dir(); end
+
+  def rdoc_dir=(rdoc_dir); end
+
+  def rdoc_files(); end
+
+  def rdoc_files=(rdoc_files); end
+
+  def rdoc_task_description(); end
+
+  def rerdoc_task_description(); end
+
+  def template(); end
+
+  def template=(template); end
+
+  def title(); end
+
+  def title=(title); end
+end
+
+class RDoc::Task
+end
+
+module RDoc::Text
+  def language(); end
+
+  def language=(language); end
+end
+
+class RDoc::TopLevel
+  def initialize(absolute_name, relative_name=T.unsafe(nil)); end
+end
+
+module RDoc
+  def self.home(); end
+end
+
+module RSpec
+  MODULES_TO_AUTOLOAD = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::CallerFilter
+  ADDITIONAL_TOP_LEVEL_FILES = ::T.let(nil, ::T.untyped)
+  IGNORE_REGEX = ::T.let(nil, ::T.untyped)
+  LIB_REGEX = ::T.let(nil, ::T.untyped)
+  RSPEC_LIBS = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Configuration
+  DEFAULT_FORMATTER = ::T.let(nil, ::T.untyped)
+  FAILED_STATUS = ::T.let(nil, ::T.untyped)
+  MOCKING_ADAPTERS = ::T.let(nil, ::T.untyped)
+  PASSED_STATUS = ::T.let(nil, ::T.untyped)
+  PENDING_STATUS = ::T.let(nil, ::T.untyped)
+  RAISE_ERROR_WARNING_NOTIFIER = ::T.let(nil, ::T.untyped)
+  UNKNOWN_STATUS = ::T.let(nil, ::T.untyped)
+  VALID_STATUSES = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::ConfigurationOptions
+  OPTIONS_ORDER = ::T.let(nil, ::T.untyped)
+  UNFORCED_OPTIONS = ::T.let(nil, ::T.untyped)
+  UNPROCESSABLE_OPTIONS = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::Core::Example::AllExceptionsExcludingDangerousOnesOnRubiesThatAllowIt = RSpec::Support::AllExceptionsExceptOnesWeMustNotRescue
+
+class RSpec::Core::ExampleGroup
+  INSTANCE_VARIABLE_TO_IGNORE = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::Core::ExclusionRules = RSpec::Core::FilterRules
+
+class RSpec::Core::FilterRules
+  PROC_HEX_NUMBER = ::T.let(nil, ::T.untyped)
+  PROJECT_DIR = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Core::Formatters::ConsoleCodes
+  VT100_CODES = ::T.let(nil, ::T.untyped)
+  VT100_CODE_VALUES = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Formatters::DeprecationFormatter
+  DEPRECATION_STREAM_NOTICE = ::T.let(nil, ::T.untyped)
+  RAISE_ERROR_CONFIG_NOTICE = ::T.let(nil, ::T.untyped)
+  TOO_MANY_WARNINGS_NOTICE = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Formatters::DeprecationFormatter::DelayedPrinter
+  TOO_MANY_USES_LIMIT = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Formatters::ExceptionPresenter
+  PENDING_DETAIL_FORMATTER = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Core::Formatters::Helpers
+  DEFAULT_PRECISION = ::T.let(nil, ::T.untyped)
+  SUB_SECOND_PRECISION = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Formatters::HtmlPrinter
+  GLOBAL_SCRIPTS = ::T.let(nil, ::T.untyped)
+  GLOBAL_STYLES = ::T.let(nil, ::T.untyped)
+  HTML_HEADER = ::T.let(nil, ::T.untyped)
+  REPORT_HEADER = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Core::Formatters::SyntaxHighlighter::CodeRayImplementation
+  RESET_CODE = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::Core::Formatters::SyntaxHighlighter::WindowsImplementation = RSpec::Core::Formatters::SyntaxHighlighter::NoSyntaxHighlightingImplementation
+
+class RSpec::Core::Hooks::HookCollections
+  EMPTY_HOOK_ARRAY = ::T.let(nil, ::T.untyped)
+  HOOK_TYPES = ::T.let(nil, ::T.untyped)
+  SCOPES = ::T.let(nil, ::T.untyped)
+  SCOPE_ALIASES = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Core::Metadata
+  RESERVED_KEYS = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Ordering::Random
+  MAX_32_BIT = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Core::Pending
+  NOT_YET_IMPLEMENTED = ::T.let(nil, ::T.untyped)
+  NO_REASON_GIVEN = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Profiler
+  NOTIFICATIONS = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Core::Reporter
+  RSPEC_NOTIFICATIONS = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Core::ShellEscape
+  SHELLS_ALLOWING_UNQUOTED_IDS = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Core::Version
+  STRING = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Expectations::Configuration
+  FALSE_POSITIVE_BEHAVIOURS = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::Expectations::LegacyMacherAdapter = RSpec::Expectations::LegacyMatcherAdapter
+
+module RSpec::Expectations::Version
+  STRING = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Matchers
+  def be_close_to(*expected, &block_arg); end
+  BE_PREDICATE_REGEX = ::T.let(nil, ::T.untyped)
+  DYNAMIC_MATCHER_REGEX = ::T.let(nil, ::T.untyped)
+  HAS_REGEX = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::Matchers::AliasedNegatedMatcher::DefaultFailureMessages = RSpec::Matchers::BuiltIn::BaseMatcher::DefaultFailureMessages
+
+class RSpec::Matchers::BuiltIn::BaseMatcher
+  UNDEFINED = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Matchers::BuiltIn::BePredicate
+  REGEX = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Matchers::BuiltIn::Equal
+  LITERAL_SINGLETONS = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Matchers::BuiltIn::Has
+  REGEX = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Matchers::BuiltIn::RaiseError
+  UndefinedValue = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::Matchers::BuiltIn::SpecificValuesChange::MATCH_ANYTHING = BasicObject
+
+RSpec::Matchers::BuiltIn::StartAndEndWith = RSpec::Matchers::BuiltIn::StartOrEndWith
+
+module RSpec::Matchers::DSL::Macros
+  RAISE_NOTIFIER = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Matchers::ExpectedsForMultipleDiffs
+  DEFAULT_DIFF_LABEL = ::T.let(nil, ::T.untyped)
+  DESCRIPTION_MAX_LENGTH = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Mocks
+  DEFAULT_CALLBACK_INVOCATION_STRATEGY = ::T.let(nil, ::T.untyped)
+  IGNORED_BACKTRACE_LINE = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Mocks::AnyInstance::PositiveExpectationChain
+  ExpectationInvocationOrder = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Mocks::AnyInstance::StubChain
+  EmptyInvocationOrder = ::T.let(nil, ::T.untyped)
+  InvocationOrder = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Mocks::ArgumentListMatcher
+  MATCH_ALL = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Mocks::Matchers::HaveReceived
+  ARGS_CONSTRAINTS = ::T.let(nil, ::T.untyped)
+  CONSTRAINTS = ::T.let(nil, ::T.untyped)
+  COUNT_CONSTRAINTS = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Mocks::ObjectReference
+  MODULE_NAME_METHOD = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Mocks::Proxy
+  DEFAULT_MESSAGE_EXPECTATION_OPTS = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Mocks::Version
+  STRING = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::SharedContext = RSpec::Core::SharedContext
+
+module RSpec::Support
+  DEFAULT_FAILURE_NOTIFIER = ::T.let(nil, ::T.untyped)
+  DEFAULT_WARNING_NOTIFIER = ::T.let(nil, ::T.untyped)
+  KERNEL_METHOD_METHOD = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Support::AllExceptionsExceptOnesWeMustNotRescue
+  AVOID_RESCUING = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Support::Differ
+  def color?(); end
+
+  def diff(actual, expected); end
+
+  def diff_as_object(actual, expected); end
+
+  def diff_as_string(actual, expected); end
+
+  def initialize(opts=T.unsafe(nil)); end
+end
+
+class RSpec::Support::Differ
+end
+
+class RSpec::Support::EncodedString
+  REPLACE = ::T.let(nil, ::T.untyped)
+  US_ASCII = ::T.let(nil, ::T.untyped)
+  UTF_8 = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Support::MethodSignature
+  INFINITY = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Support::Mutex
+  NEW_MUTEX_METHOD = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Support::ObjectFormatter
+  ELLIPSIS = ::T.let(nil, ::T.untyped)
+  INSPECTOR_CLASSES = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Support::ObjectFormatter::DateTimeInspector
+  FORMAT = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Support::ObjectFormatter::TimeInspector
+  FORMAT = ::T.let(nil, ::T.untyped)
+end
+
+class RSpec::Support::ObjectFormatter::UninspectableObjectInspector
+  OBJECT_ID_FORMAT = ::T.let(nil, ::T.untyped)
+end
+
+RSpec::Support::StrictSignatureVerifier = RSpec::Support::MethodSignatureVerifier
+
+module RSpec::Support::Version
+  STRING = ::T.let(nil, ::T.untyped)
+end
+
+module RSpec::Version
+  STRING = ::T.let(nil, ::T.untyped)
+end
+
+module Racc
+  Copyright = ::T.let(nil, ::T.untyped)
+  Racc_No_Extentions = ::T.let(nil, ::T.untyped)
+  VERSION = ::T.let(nil, ::T.untyped)
+  Version = ::T.let(nil, ::T.untyped)
+end
+
+class Racc::CparseParams
+end
+
+class Racc::CparseParams
+end
+
+class Racc::Parser
+  Racc_Main_Parsing_Routine = ::T.let(nil, ::T.untyped)
+  Racc_Runtime_Core_Id_C = ::T.let(nil, ::T.untyped)
+  Racc_Runtime_Core_Revision = ::T.let(nil, ::T.untyped)
+  Racc_Runtime_Core_Revision_C = ::T.let(nil, ::T.untyped)
+  Racc_Runtime_Core_Revision_R = ::T.let(nil, ::T.untyped)
+  Racc_Runtime_Core_Version = ::T.let(nil, ::T.untyped)
+  Racc_Runtime_Core_Version_C = ::T.let(nil, ::T.untyped)
+  Racc_Runtime_Core_Version_R = ::T.let(nil, ::T.untyped)
+  Racc_Runtime_Revision = ::T.let(nil, ::T.untyped)
+  Racc_Runtime_Type = ::T.let(nil, ::T.untyped)
+  Racc_Runtime_Version = ::T.let(nil, ::T.untyped)
+  Racc_YY_Parse_Method = ::T.let(nil, ::T.untyped)
+end
+
+class Rainbow::Color::Named
+  NAMES = ::T.let(nil, ::T.untyped)
+end
+
+class Rainbow::Presenter
+  TERM_EFFECTS = ::T.let(nil, ::T.untyped)
+end
+
+module Rainbow::X11ColorNames
+  NAMES = ::T.let(nil, ::T.untyped)
+end
+
+module Rake
+  EARLY = ::T.let(nil, ::T.untyped)
+  EMPTY_TASK_ARGS = ::T.let(nil, ::T.untyped)
+  LATE = ::T.let(nil, ::T.untyped)
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class Rake::Application
+  DEFAULT_RAKEFILES = ::T.let(nil, ::T.untyped)
+end
+
+module Rake::Backtrace
+  SUPPRESSED_PATHS = ::T.let(nil, ::T.untyped)
+  SUPPRESSED_PATHS_RE = ::T.let(nil, ::T.untyped)
+  SUPPRESS_PATTERN = ::T.let(nil, ::T.untyped)
+  SYS_KEYS = ::T.let(nil, ::T.untyped)
+  SYS_PATHS = ::T.let(nil, ::T.untyped)
+end
+
+module Rake::DSL
+  include ::FileUtils::StreamUtils_
+end
+
+class Rake::FileList
+  ARRAY_METHODS = ::T.let(nil, ::T.untyped)
+  DEFAULT_IGNORE_PATTERNS = ::T.let(nil, ::T.untyped)
+  DEFAULT_IGNORE_PROCS = ::T.let(nil, ::T.untyped)
+  DELEGATING_METHODS = ::T.let(nil, ::T.untyped)
+  GLOB_PATTERN = ::T.let(nil, ::T.untyped)
+  MUST_DEFINE = ::T.let(nil, ::T.untyped)
+  MUST_NOT_DEFINE = ::T.let(nil, ::T.untyped)
+  SPECIAL_RETURN = ::T.let(nil, ::T.untyped)
+end
+
+module Rake::FileUtilsExt
+  include ::FileUtils::StreamUtils_
+  DEFAULT = ::T.let(nil, ::T.untyped)
+end
+
+module Rake::FileUtilsExt
+  extend ::FileUtils::StreamUtils_
+end
+
+class Rake::InvocationChain
+  EMPTY = ::T.let(nil, ::T.untyped)
+end
+
+class Rake::LinkedList
+  EMPTY = ::T.let(nil, ::T.untyped)
+end
+
+class Rake::Promise
+  NOT_SET = ::T.let(nil, ::T.untyped)
+end
+
+Rake::RDocTask = RDoc::Task
+
+class Rake::Scope
+  EMPTY = ::T.let(nil, ::T.untyped)
+end
+
+class Rake::TaskLib
+  include ::FileUtils::StreamUtils_
+end
+
+module Rake::Version
+  BUILD = ::T.let(nil, ::T.untyped)
+  MAJOR = ::T.let(nil, ::T.untyped)
+  MINOR = ::T.let(nil, ::T.untyped)
+  NUMBERS = ::T.let(nil, ::T.untyped)
+  OTHER = ::T.let(nil, ::T.untyped)
+end
+
+module Rake
+  extend ::FileUtils::StreamUtils_
+end
+
+RakeFileUtils = Rake::FileUtilsExt
+
+class Random
+  def self.bytes(arg); end
+end
+
+class Range
+  def %(arg); end
+
+  def entries(); end
+
+  def to_a(); end
+end
+
+module RbConfig
+  def self.expand(val, config=T.unsafe(nil)); end
+
+  def self.fire_update!(key, val, mkconf=T.unsafe(nil), conf=T.unsafe(nil)); end
+
+  def self.ruby(); end
+end
+
+class Ripper
+  def column(); end
+
+  def debug_output(); end
+
+  def debug_output=(debug_output); end
+
+  def encoding(); end
+
+  def end_seen?(); end
+
+  def error?(); end
+
+  def filename(); end
+
+  def initialize(*arg); end
+
+  def lineno(); end
+
+  def parse(); end
+
+  def state(); end
+
+  def token(); end
+
+  def yydebug(); end
+
+  def yydebug=(yydebug); end
+  EXPR_ARG = ::T.let(nil, ::T.untyped)
+  EXPR_ARG_ANY = ::T.let(nil, ::T.untyped)
+  EXPR_BEG = ::T.let(nil, ::T.untyped)
+  EXPR_BEG_ANY = ::T.let(nil, ::T.untyped)
+  EXPR_CLASS = ::T.let(nil, ::T.untyped)
+  EXPR_CMDARG = ::T.let(nil, ::T.untyped)
+  EXPR_DOT = ::T.let(nil, ::T.untyped)
+  EXPR_END = ::T.let(nil, ::T.untyped)
+  EXPR_ENDARG = ::T.let(nil, ::T.untyped)
+  EXPR_ENDFN = ::T.let(nil, ::T.untyped)
+  EXPR_END_ANY = ::T.let(nil, ::T.untyped)
+  EXPR_FITEM = ::T.let(nil, ::T.untyped)
+  EXPR_FNAME = ::T.let(nil, ::T.untyped)
+  EXPR_LABEL = ::T.let(nil, ::T.untyped)
+  EXPR_LABELED = ::T.let(nil, ::T.untyped)
+  EXPR_MID = ::T.let(nil, ::T.untyped)
+  EXPR_NONE = ::T.let(nil, ::T.untyped)
+  EXPR_VALUE = ::T.let(nil, ::T.untyped)
+  PARSER_EVENT_TABLE = ::T.let(nil, ::T.untyped)
+  SCANNER_EVENT_TABLE = ::T.let(nil, ::T.untyped)
+  Version = ::T.let(nil, ::T.untyped)
+end
+
+class Ripper::Filter
+  def initialize(src, filename=T.unsafe(nil), lineno=T.unsafe(nil)); end
+end
+
+class Ripper::Lexer
+  def errors(); end
+
+  def lex(); end
+
+  def scan(); end
+
+  def tokenize(); end
+end
+
+class Ripper::Lexer::Elem
+  def event(); end
+
+  def event=(_); end
+
+  def initialize(pos, event, tok, state, message=T.unsafe(nil)); end
+
+  def message(); end
+
+  def message=(_); end
+
+  def pos(); end
+
+  def pos=(_); end
+
+  def state(); end
+
+  def state=(_); end
+
+  def tok(); end
+
+  def tok=(_); end
+end
+
+class Ripper::Lexer::Elem
+  def self.[](*arg); end
+
+  def self.members(); end
+end
+
+class Ripper::Lexer::State
+  def &(i); end
+
+  def ==(i); end
+
+  def allbits?(i); end
+
+  def anybits?(i); end
+
+  def initialize(i); end
+
+  def nobits?(i); end
+
+  def to_i(); end
+
+  def to_int(); end
+
+  def to_int=(_); end
+
+  def to_s=(_); end
+
+  def |(i); end
+end
+
+class Ripper::Lexer::State
+  def self.[](*arg); end
+
+  def self.members(); end
+end
+
+class Ripper::Lexer
+end
+
+class Ripper::SexpBuilder
+  def on_BEGIN(*args); end
+
+  def on_CHAR(tok); end
+
+  def on_END(*args); end
+
+  def on___end__(tok); end
+
+  def on_alias(*args); end
+
+  def on_alias_error(*args); end
+
+  def on_aref(*args); end
+
+  def on_aref_field(*args); end
+
+  def on_arg_ambiguous(*args); end
+
+  def on_arg_paren(*args); end
+
+  def on_args_add(*args); end
+
+  def on_args_add_block(*args); end
+
+  def on_args_add_star(*args); end
+
+  def on_args_forward(*args); end
+
+  def on_args_new(*args); end
+
+  def on_array(*args); end
+
+  def on_aryptn(*args); end
+
+  def on_assign(*args); end
+
+  def on_assign_error(*args); end
+
+  def on_assoc_new(*args); end
+
+  def on_assoc_splat(*args); end
+
+  def on_assoclist_from_args(*args); end
+
+  def on_backref(tok); end
+
+  def on_backtick(tok); end
+
+  def on_bare_assoc_hash(*args); end
+
+  def on_begin(*args); end
+
+  def on_binary(*args); end
+
+  def on_block_var(*args); end
+
+  def on_blockarg(*args); end
+
+  def on_bodystmt(*args); end
+
+  def on_brace_block(*args); end
+
+  def on_break(*args); end
+
+  def on_call(*args); end
+
+  def on_case(*args); end
+
+  def on_class(*args); end
+
+  def on_class_name_error(*args); end
+
+  def on_comma(tok); end
+
+  def on_command(*args); end
+
+  def on_command_call(*args); end
+
+  def on_comment(tok); end
+
+  def on_const(tok); end
+
+  def on_const_path_field(*args); end
+
+  def on_const_path_ref(*args); end
+
+  def on_const_ref(*args); end
+
+  def on_cvar(tok); end
+
+  def on_def(*args); end
+
+  def on_defined(*args); end
+
+  def on_defs(*args); end
+
+  def on_do_block(*args); end
+
+  def on_dot2(*args); end
+
+  def on_dot3(*args); end
+
+  def on_dyna_symbol(*args); end
+
+  def on_else(*args); end
+
+  def on_elsif(*args); end
+
+  def on_embdoc(tok); end
+
+  def on_embdoc_beg(tok); end
+
+  def on_embdoc_end(tok); end
+
+  def on_embexpr_beg(tok); end
+
+  def on_embexpr_end(tok); end
+
+  def on_embvar(tok); end
+
+  def on_ensure(*args); end
+
+  def on_excessed_comma(*args); end
+
+  def on_fcall(*args); end
+
+  def on_field(*args); end
+
+  def on_float(tok); end
+
+  def on_for(*args); end
+
+  def on_gvar(tok); end
+
+  def on_hash(*args); end
+
+  def on_heredoc_beg(tok); end
+
+  def on_heredoc_end(tok); end
+
+  def on_hshptn(*args); end
+
+  def on_ident(tok); end
+
+  def on_if(*args); end
+
+  def on_if_mod(*args); end
+
+  def on_ifop(*args); end
+
+  def on_ignored_nl(tok); end
+
+  def on_ignored_sp(tok); end
+
+  def on_imaginary(tok); end
+
+  def on_in(*args); end
+
+  def on_int(tok); end
+
+  def on_ivar(tok); end
+
+  def on_kw(tok); end
+
+  def on_kwrest_param(*args); end
+
+  def on_label(tok); end
+
+  def on_label_end(tok); end
+
+  def on_lambda(*args); end
+
+  def on_lbrace(tok); end
+
+  def on_lbracket(tok); end
+
+  def on_lparen(tok); end
+
+  def on_magic_comment(*args); end
+
+  def on_massign(*args); end
+
+  def on_method_add_arg(*args); end
+
+  def on_method_add_block(*args); end
+
+  def on_mlhs_add(*args); end
+
+  def on_mlhs_add_post(*args); end
+
+  def on_mlhs_add_star(*args); end
+
+  def on_mlhs_new(*args); end
+
+  def on_mlhs_paren(*args); end
+
+  def on_module(*args); end
+
+  def on_mrhs_add(*args); end
+
+  def on_mrhs_add_star(*args); end
+
+  def on_mrhs_new(*args); end
+
+  def on_mrhs_new_from_args(*args); end
+
+  def on_next(*args); end
+
+  def on_nl(tok); end
+
+  def on_nokw_param(*args); end
+
+  def on_op(tok); end
+
+  def on_opassign(*args); end
+
+  def on_operator_ambiguous(*args); end
+
+  def on_param_error(*args); end
+
+  def on_params(*args); end
+
+  def on_paren(*args); end
+
+  def on_parse_error(*args); end
+
+  def on_period(tok); end
+
+  def on_program(*args); end
+
+  def on_qsymbols_add(*args); end
+
+  def on_qsymbols_beg(tok); end
+
+  def on_qsymbols_new(*args); end
+
+  def on_qwords_add(*args); end
+
+  def on_qwords_beg(tok); end
+
+  def on_qwords_new(*args); end
+
+  def on_rational(tok); end
+
+  def on_rbrace(tok); end
+
+  def on_rbracket(tok); end
+
+  def on_redo(*args); end
+
+  def on_regexp_add(*args); end
+
+  def on_regexp_beg(tok); end
+
+  def on_regexp_end(tok); end
+
+  def on_regexp_literal(*args); end
+
+  def on_regexp_new(*args); end
+
+  def on_rescue(*args); end
+
+  def on_rescue_mod(*args); end
+
+  def on_rest_param(*args); end
+
+  def on_retry(*args); end
+
+  def on_return(*args); end
+
+  def on_return0(*args); end
+
+  def on_rparen(tok); end
+
+  def on_sclass(*args); end
+
+  def on_semicolon(tok); end
+
+  def on_sp(tok); end
+
+  def on_stmts_add(*args); end
+
+  def on_stmts_new(*args); end
+
+  def on_string_add(*args); end
+
+  def on_string_concat(*args); end
+
+  def on_string_content(*args); end
+
+  def on_string_dvar(*args); end
+
+  def on_string_embexpr(*args); end
+
+  def on_string_literal(*args); end
+
+  def on_super(*args); end
+
+  def on_symbeg(tok); end
+
+  def on_symbol(*args); end
+
+  def on_symbol_literal(*args); end
+
+  def on_symbols_add(*args); end
+
+  def on_symbols_beg(tok); end
+
+  def on_symbols_new(*args); end
+
+  def on_tlambda(tok); end
+
+  def on_tlambeg(tok); end
+
+  def on_top_const_field(*args); end
+
+  def on_top_const_ref(*args); end
+
+  def on_tstring_beg(tok); end
+
+  def on_tstring_content(tok); end
+
+  def on_tstring_end(tok); end
+
+  def on_unary(*args); end
+
+  def on_undef(*args); end
+
+  def on_unless(*args); end
+
+  def on_unless_mod(*args); end
+
+  def on_until(*args); end
+
+  def on_until_mod(*args); end
+
+  def on_var_alias(*args); end
+
+  def on_var_field(*args); end
+
+  def on_var_ref(*args); end
+
+  def on_vcall(*args); end
+
+  def on_void_stmt(*args); end
+
+  def on_when(*args); end
+
+  def on_while(*args); end
+
+  def on_while_mod(*args); end
+
+  def on_word_add(*args); end
+
+  def on_word_new(*args); end
+
+  def on_words_add(*args); end
+
+  def on_words_beg(tok); end
+
+  def on_words_new(*args); end
+
+  def on_words_sep(tok); end
+
+  def on_xstring_add(*args); end
+
+  def on_xstring_literal(*args); end
+
+  def on_xstring_new(*args); end
+
+  def on_yield(*args); end
+
+  def on_yield0(*args); end
+
+  def on_zsuper(*args); end
+end
+
+class Ripper::TokenPattern
+  def initialize(pattern); end
+
+  def match(str); end
+
+  def match_list(tokens); end
+  MAP = ::T.let(nil, ::T.untyped)
+end
+
+class Ripper::TokenPattern::CompileError
+end
+
+class Ripper::TokenPattern::CompileError
+end
+
+class Ripper::TokenPattern::Error
+end
+
+class Ripper::TokenPattern::Error
+end
+
+class Ripper::TokenPattern::MatchData
+  def initialize(tokens, match); end
+
+  def string(n=T.unsafe(nil)); end
+end
+
+class Ripper::TokenPattern::MatchData
+end
+
+class Ripper::TokenPattern::MatchError
+end
+
+class Ripper::TokenPattern::MatchError
+end
+
+class Ripper::TokenPattern
+  def self.compile(*arg); end
+end
+
+class Ripper
+  def self.dedent_string(arg, arg1); end
+
+  def self.lex_state_name(arg); end
+
+  def self.token_match(src, pattern); end
+end
+
+class RubyVM::AbstractSyntaxTree::Node
+  def pretty_print_children(q, names=T.unsafe(nil)); end
+end
+
+module RubyVM::MJIT
+end
+
+module RubyVM::MJIT
+  def self.enabled?(); end
+
+  def self.pause(*arg); end
+
+  def self.resume(); end
+end
+
+ScanError = StringScanner::Error
+
+class Set
+  def ==(other); end
+
+  def ===(o); end
+
+  def divide(&func); end
+
+  def eql?(o); end
+
+  def flatten_merge(set, seen=T.unsafe(nil)); end
+
+  def pretty_print(pp); end
+
+  def pretty_print_cycle(pp); end
+
+  def reset(); end
+  InspectKey = ::T.let(nil, ::T.untyped)
+end
+
+class SimpleDelegator
+  RUBYGEMS_ACTIVATION_MONITOR = ::T.let(nil, ::T.untyped)
+end
+
+module Singleton
+  def _dump(depth=T.unsafe(nil)); end
+
+  def clone(); end
+
+  def dup(); end
+end
+
+module Singleton::SingletonClassMethods
+  def _load(str); end
+
+  def clone(); end
+end
+
+module Singleton
+  def self.__init__(klass); end
+end
+
+class Socket
+  IPV6_DONTFRAG = ::T.let(nil, ::T.untyped)
+  IPV6_PATHMTU = ::T.let(nil, ::T.untyped)
+  IPV6_RECVPATHMTU = ::T.let(nil, ::T.untyped)
+  SO_BPF_EXTENSIONS = ::T.let(nil, ::T.untyped)
+end
+
+module Socket::Constants
+  IPV6_DONTFRAG = ::T.let(nil, ::T.untyped)
+  IPV6_PATHMTU = ::T.let(nil, ::T.untyped)
+  IPV6_RECVPATHMTU = ::T.let(nil, ::T.untyped)
+  SO_BPF_EXTENSIONS = ::T.let(nil, ::T.untyped)
+end
+
+class SortedSet
+  def initialize(*args, &block); end
+end
+
+class SortedSet
+  def self.setup(); end
+end
+
+class String
+  include ::JSON::Ext::Generator::GeneratorMethods::String
+  def shellescape(); end
+
+  def shellsplit(); end
+end
+
+class StringIO
+  def set_encoding_by_bom(); end
+  VERSION = ::T.let(nil, ::T.untyped)
+end
+
+class StringScanner
+  def bol?(); end
+
+  def fixed_anchor?(); end
+
+  def initialize(*arg); end
+  Id = ::T.let(nil, ::T.untyped)
+  Version = ::T.let(nil, ::T.untyped)
+end
+
+class Struct
+  def deconstruct(); end
+
+  def deconstruct_keys(arg); end
+
+  def filter(*arg); end
+end
+
+Struct::Group = Etc::Group
+
+Struct::Passwd = Etc::Passwd
+
+Struct::Tms = Process::Tms
+
+class TTFunk::OTFEncoder
+  OPTIMAL_TABLE_ORDER = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::TTFEncoder
+  OPTIMAL_TABLE_ORDER = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff
+  TAG = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::Charset
+  include ::Enumerable
+  def [](glyph_id); end
+
+  def count(); end
+
+  def each(&blk); end
+
+  def encode(mapping); end
+
+  def entries(); end
+
+  def format(); end
+
+  def initialize(top_dict, file, offset_or_id=T.unsafe(nil), length=T.unsafe(nil)); end
+
+  def offset(); end
+
+  def offset_or_id(); end
+
+  def top_dict(); end
+  ARRAY_FORMAT = ::T.let(nil, ::T.untyped)
+  DEFAULT_CHARSET_ID = ::T.let(nil, ::T.untyped)
+  EXPERT_CHARSET_ID = ::T.let(nil, ::T.untyped)
+  EXPERT_SUBSET_CHARSET_ID = ::T.let(nil, ::T.untyped)
+  FIRST_GLYPH_STRING = ::T.let(nil, ::T.untyped)
+  ISO_ADOBE_CHARSET_ID = ::T.let(nil, ::T.untyped)
+  RANGE_FORMAT_16 = ::T.let(nil, ::T.untyped)
+  RANGE_FORMAT_8 = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::Charset
+  def self.standard_strings(); end
+
+  def self.strings_for_charset_id(charset_id); end
+end
+
+module TTFunk::Table::Cff::Charsets
+  EXPERT = ::T.let(nil, ::T.untyped)
+  EXPERT_SUBSET = ::T.let(nil, ::T.untyped)
+  ISO_ADOBE = ::T.let(nil, ::T.untyped)
+  STANDARD_STRINGS = ::T.let(nil, ::T.untyped)
+end
+
+module TTFunk::Table::Cff::Charsets
+end
+
+class TTFunk::Table::Cff::Charstring
+  def encode(); end
+
+  def glyph(); end
+
+  def glyph_id(); end
+
+  def initialize(glyph_id, top_dict, font_dict, raw); end
+
+  def path(); end
+
+  def raw(); end
+
+  def render(x: T.unsafe(nil), y: T.unsafe(nil), font_size: T.unsafe(nil)); end
+  CODE_MAP = ::T.let(nil, ::T.untyped)
+  FLEX_CODE_MAP = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::Charstring
+end
+
+class TTFunk::Table::Cff::CharstringsIndex
+  def encode(mapping); end
+
+  def initialize(top_dict, *remaining_args); end
+
+  def top_dict(); end
+end
+
+class TTFunk::Table::Cff::CharstringsIndex
+end
+
+class TTFunk::Table::Cff::Dict
+  include ::Enumerable
+  def [](operator); end
+
+  def each(&block); end
+
+  def each_pair(&block); end
+
+  def encode(); end
+  MAX_OPERANDS = ::T.let(nil, ::T.untyped)
+  OPERAND_BZERO = ::T.let(nil, ::T.untyped)
+  OPERATOR_BZERO = ::T.let(nil, ::T.untyped)
+  VALID_SCI_EXPONENT_RE = ::T.let(nil, ::T.untyped)
+  VALID_SCI_SIGNIFICAND_RE = ::T.let(nil, ::T.untyped)
+  WIDE_OPERATOR_ADJUSTMENT = ::T.let(nil, ::T.untyped)
+  WIDE_OPERATOR_BZERO = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::Dict::InvalidOperandError
+end
+
+class TTFunk::Table::Cff::Dict::InvalidOperandError
+end
+
+class TTFunk::Table::Cff::Dict::TooManyOperandsError
+end
+
+class TTFunk::Table::Cff::Dict::TooManyOperandsError
+end
+
+class TTFunk::Table::Cff::Dict
+end
+
+class TTFunk::Table::Cff::Encoding
+  include ::Enumerable
+  def [](glyph_id); end
+
+  def count(); end
+
+  def each(&blk); end
+
+  def encode(new_to_old, old_to_new); end
+
+  def format(); end
+
+  def initialize(top_dict, file, offset_or_id=T.unsafe(nil), length=T.unsafe(nil)); end
+
+  def offset(); end
+
+  def offset_or_id(); end
+
+  def supplemental?(); end
+
+  def top_dict(); end
+  DEFAULT_ENCODING_ID = ::T.let(nil, ::T.untyped)
+  EXPERT_ENCODING_ID = ::T.let(nil, ::T.untyped)
+  STANDARD_ENCODING_ID = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::Encoding
+  def self.codes_for_encoding_id(encoding_id); end
+end
+
+module TTFunk::Table::Cff::Encodings
+  EXPERT = ::T.let(nil, ::T.untyped)
+  STANDARD = ::T.let(nil, ::T.untyped)
+end
+
+module TTFunk::Table::Cff::Encodings
+end
+
+class TTFunk::Table::Cff::FdSelector
+  include ::Enumerable
+  def [](glyph_id); end
+
+  def count(); end
+
+  def each(&blk); end
+
+  def encode(mapping); end
+
+  def entries(); end
+
+  def initialize(top_dict, file, offset, length=T.unsafe(nil)); end
+
+  def n_glyphs(); end
+
+  def top_dict(); end
+  ARRAY_ENTRY_SIZE = ::T.let(nil, ::T.untyped)
+  ARRAY_FORMAT = ::T.let(nil, ::T.untyped)
+  RANGE_ENTRY_SIZE = ::T.let(nil, ::T.untyped)
+  RANGE_FORMAT = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::FdSelector
+end
+
+class TTFunk::Table::Cff::FontDict
+  def encode(_mapping); end
+
+  def finalize(new_cff_data, mapping); end
+
+  def initialize(top_dict, file, offset, length=T.unsafe(nil)); end
+
+  def private_dict(); end
+
+  def top_dict(); end
+  OPERATORS = ::T.let(nil, ::T.untyped)
+  OPERATOR_CODES = ::T.let(nil, ::T.untyped)
+  PLACEHOLDER_LENGTH = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::FontDict
+end
+
+class TTFunk::Table::Cff::FontIndex
+  def finalize(new_cff_data, mapping); end
+
+  def initialize(top_dict, file, offset, length=T.unsafe(nil)); end
+
+  def top_dict(); end
+end
+
+class TTFunk::Table::Cff::FontIndex
+end
+
+class TTFunk::Table::Cff::Header
+  def absolute_offset_size(); end
+
+  def encode(); end
+
+  def header_size(); end
+
+  def major(); end
+
+  def minor(); end
+end
+
+class TTFunk::Table::Cff::Header
+end
+
+class TTFunk::Table::Cff::Index
+  include ::Enumerable
+  def [](index); end
+
+  def count(); end
+
+  def data_start_pos(); end
+
+  def each(&blk); end
+
+  def encode(); end
+
+  def offset_size(); end
+
+  def offsets(); end
+
+  def raw_data(); end
+
+  def raw_offset_length(); end
+end
+
+class TTFunk::Table::Cff::Index
+end
+
+class TTFunk::Table::Cff::OneBasedIndex
+  def [](idx); end
+
+  def base_index(); end
+
+  def count(*args, &block); end
+
+  def each(*args, &block); end
+
+  def encode(*args, &block); end
+
+  def initialize(*args); end
+
+  def length(*args, &block); end
+
+  def table_offset(*args, &block); end
+end
+
+class TTFunk::Table::Cff::OneBasedIndex
+  extend ::Forwardable
+end
+
+class TTFunk::Table::Cff::Path
+  def close_path(); end
+
+  def commands(); end
+
+  def curve_to(x1, y1, x2, y2, x, y); end
+
+  def line_to(x, y); end
+
+  def move_to(x, y); end
+
+  def number_of_contours(); end
+
+  def render(x: T.unsafe(nil), y: T.unsafe(nil), font_size: T.unsafe(nil), units_per_em: T.unsafe(nil)); end
+  CLOSE_PATH_CMD = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::Path
+end
+
+class TTFunk::Table::Cff::PrivateDict
+  def default_width_x(); end
+
+  def encode(_mapping); end
+
+  def finalize(private_dict_data); end
+
+  def nominal_width_x(); end
+
+  def subr_index(); end
+  DEFAULT_WIDTH_X_DEFAULT = ::T.let(nil, ::T.untyped)
+  DEFAULT_WIDTH_X_NOMINAL = ::T.let(nil, ::T.untyped)
+  OPERATORS = ::T.let(nil, ::T.untyped)
+  OPERATOR_CODES = ::T.let(nil, ::T.untyped)
+  PLACEHOLDER_LENGTH = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::PrivateDict
+end
+
+class TTFunk::Table::Cff::SubrIndex
+  def bias(); end
+end
+
+class TTFunk::Table::Cff::SubrIndex
+end
+
+class TTFunk::Table::Cff::TopDict
+  def cff(); end
+
+  def cff_offset(); end
+
+  def charset(); end
+
+  def charstring_type(); end
+
+  def charstrings_index(); end
+
+  def encode(*arg); end
+
+  def encoding(); end
+
+  def finalize(new_cff_data, new_to_old, old_to_new); end
+
+  def font_dict_selector(); end
+
+  def font_index(); end
+
+  def is_cid_font?(); end
+
+  def private_dict(); end
+
+  def ros(); end
+
+  def ros?(); end
+  DEFAULT_CHARSTRING_TYPE = ::T.let(nil, ::T.untyped)
+  OPERATORS = ::T.let(nil, ::T.untyped)
+  OPERATOR_CODES = ::T.let(nil, ::T.untyped)
+  PLACEHOLDER_LENGTH = ::T.let(nil, ::T.untyped)
+  POINTER_OPERATORS = ::T.let(nil, ::T.untyped)
+  POINTER_PLACEHOLDER_LENGTH = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Cff::TopDict
+end
+
+class TTFunk::Table::Cff::TopIndex
+end
+
+class TTFunk::Table::Cff::TopIndex
+end
+
+class TTFunk::Table::Cmap::Subtable
+  ENCODING_MAPPINGS = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Dsig
+  TAG = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Glyf::Compound
+  ARG_1_AND_2_ARE_WORDS = ::T.let(nil, ::T.untyped)
+  MORE_COMPONENTS = ::T.let(nil, ::T.untyped)
+  WE_HAVE_AN_X_AND_Y_SCALE = ::T.let(nil, ::T.untyped)
+  WE_HAVE_A_SCALE = ::T.let(nil, ::T.untyped)
+  WE_HAVE_A_TWO_BY_TWO = ::T.let(nil, ::T.untyped)
+  WE_HAVE_INSTRUCTIONS = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Name
+  COMPATIBLE_FULL_NAME_ID = ::T.let(nil, ::T.untyped)
+  COPYRIGHT_NAME_ID = ::T.let(nil, ::T.untyped)
+  DESCRIPTION_NAME_ID = ::T.let(nil, ::T.untyped)
+  DESIGNER_NAME_ID = ::T.let(nil, ::T.untyped)
+  DESIGNER_URL_NAME_ID = ::T.let(nil, ::T.untyped)
+  FONT_FAMILY_NAME_ID = ::T.let(nil, ::T.untyped)
+  FONT_NAME_NAME_ID = ::T.let(nil, ::T.untyped)
+  FONT_SUBFAMILY_NAME_ID = ::T.let(nil, ::T.untyped)
+  LICENSE_NAME_ID = ::T.let(nil, ::T.untyped)
+  LICENSE_URL_NAME_ID = ::T.let(nil, ::T.untyped)
+  MANUFACTURER_NAME_ID = ::T.let(nil, ::T.untyped)
+  POSTSCRIPT_NAME_NAME_ID = ::T.let(nil, ::T.untyped)
+  PREFERRED_FAMILY_NAME_ID = ::T.let(nil, ::T.untyped)
+  PREFERRED_SUBFAMILY_NAME_ID = ::T.let(nil, ::T.untyped)
+  SAMPLE_TEXT_NAME_ID = ::T.let(nil, ::T.untyped)
+  TRADEMARK_NAME_ID = ::T.let(nil, ::T.untyped)
+  UNIQUE_SUBFAMILY_NAME_ID = ::T.let(nil, ::T.untyped)
+  VENDOR_URL_NAME_ID = ::T.let(nil, ::T.untyped)
+  VERSION_NAME_ID = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::OS2
+  CODEPOINT_SPACE = ::T.let(nil, ::T.untyped)
+  CODE_PAGE_BITS = ::T.let(nil, ::T.untyped)
+  LOWERCASE_COUNT = ::T.let(nil, ::T.untyped)
+  LOWERCASE_END = ::T.let(nil, ::T.untyped)
+  LOWERCASE_START = ::T.let(nil, ::T.untyped)
+  SPACE_GLYPH_MISSING_ERROR = ::T.let(nil, ::T.untyped)
+  UNICODE_BLOCKS = ::T.let(nil, ::T.untyped)
+  UNICODE_MAX = ::T.let(nil, ::T.untyped)
+  UNICODE_RANGES = ::T.let(nil, ::T.untyped)
+  WEIGHT_LOWERCASE = ::T.let(nil, ::T.untyped)
+  WEIGHT_SPACE = ::T.let(nil, ::T.untyped)
+end
+
+module TTFunk::Table::Post::Format10
+  POSTSCRIPT_GLYPHS = ::T.let(nil, ::T.untyped)
+end
+
+class TTFunk::Table::Vorg
+  TAG = ::T.let(nil, ::T.untyped)
+end
+
+class Tempfile
+  def _close(); end
+  RUBYGEMS_ACTIVATION_MONITOR = ::T.let(nil, ::T.untyped)
+end
+
+class Tempfile::Remover
+  def call(*args); end
+
+  def initialize(tmpfile); end
+end
+
+class Tempfile::Remover
+end
+
+class TracePoint
+  def eval_script(); end
+
+  def instruction_sequence(); end
+
+  def parameters(); end
+end
+
+class TracePoint
+  def self.new(*events); end
+end
+
+class TrueClass
+  include ::JSON::Ext::Generator::GeneratorMethods::TrueClass
+end
+
+module URI
+  include ::URI::RFC2396_REGEXP
+end
+
+class URI::FTP
+  def self.new2(user, password, host, port, path, typecode=T.unsafe(nil), arg_check=T.unsafe(nil)); end
+end
+
+class URI::File
+  def check_password(user); end
+
+  def check_user(user); end
+
+  def check_userinfo(user); end
+
+  def set_userinfo(v); end
+  COMPONENT = ::T.let(nil, ::T.untyped)
+  DEFAULT_PORT = ::T.let(nil, ::T.untyped)
+end
+
+class URI::File
+end
+
+class URI::LDAP
+  def attributes(); end
+
+  def attributes=(val); end
+
+  def dn(); end
+
+  def dn=(val); end
+
+  def extensions(); end
+
+  def extensions=(val); end
+
+  def filter(); end
+
+  def filter=(val); end
+
+  def initialize(*arg); end
+
+  def scope(); end
+
+  def scope=(val); end
+
+  def set_attributes(val); end
+
+  def set_dn(val); end
+
+  def set_extensions(val); end
+
+  def set_filter(val); end
+
+  def set_scope(val); end
+end
+
+class URI::MailTo
+  def initialize(*arg); end
+end
+
+URI::Parser = URI::RFC2396_Parser
+
+URI::REGEXP = URI::RFC2396_REGEXP
+
+class URI::RFC2396_Parser
+  def initialize(opts=T.unsafe(nil)); end
+end
+
+class URI::RFC3986_Parser
+  def join(*uris); end
+
+  def parse(uri); end
+
+  def regexp(); end
+
+  def split(uri); end
+  RFC3986_relative_ref = ::T.let(nil, ::T.untyped)
+end
+
+module URI::Util
+  def self.make_components_hash(klass, array_hash); end
+end
+
+module URI
+  extend ::URI::Escape
+  def self.get_encoding(label); end
+end
+
+module UnicodeNormalize
+end
+
+module UnicodeNormalize
+end
+
+module Warning
+  extend ::Warning
+end
+
+class Zlib::Deflate
+  def initialize(*arg); end
+end
+
+class Zlib::GzipReader
+  def initialize(*arg); end
+end
+
+class Zlib::GzipWriter
+  def initialize(*arg); end
+end
+
+class Zlib::Inflate
+  def initialize(*arg); end
+end
diff --git a/sorbet/rbi/sorbet-typed/lib/rake/all/rake.rbi b/sorbet/rbi/sorbet-typed/lib/rake/all/rake.rbi
new file mode 100644
index 0000000..53d5b85
--- /dev/null
+++ b/sorbet/rbi/sorbet-typed/lib/rake/all/rake.rbi
@@ -0,0 +1,645 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi sorbet-typed
+#
+# If you would like to make changes to this file, great! Please upstream any changes you make here:
+#
+#   https://github.com/sorbet/sorbet-typed/edit/master/lib/rake/all/rake.rbi
+#
+# typed: false
+
+module Rake
+  def self.add_rakelib(*files); end
+  def self.application; end
+  def self.application=(app); end
+  def self.each_dir_parent(dir); end
+  def self.from_pathname(path); end
+  def self.load_rakefile(path); end
+  def self.original_dir; end
+  def self.suggested_thread_count; end
+  def self.with_application(block_application = nil); end
+  extend Rake::FileUtilsExt
+end
+module Rake::Version
+end
+class Module
+  def rake_extension(method); end
+end
+class String
+  def ext(newext = nil); end
+  def pathmap(spec = nil, &block); end
+  def pathmap_explode; end
+  def pathmap_partial(n); end
+  def pathmap_replace(patterns, &block); end
+end
+module Rake::Win32
+  def self.normalize(path); end
+  def self.win32_system_dir; end
+  def self.windows?; end
+end
+class Rake::Win32::Win32HomeError < RuntimeError
+end
+class Rake::LinkedList
+  def ==(other); end
+  def conj(item); end
+  def each; end
+  def empty?; end
+  def head; end
+  def initialize(head, tail = nil); end
+  def inspect; end
+  def self.cons(head, tail); end
+  def self.empty; end
+  def self.make(*args); end
+  def tail; end
+  def to_s; end
+  include Enumerable
+end
+class Rake::LinkedList::EmptyLinkedList < Rake::LinkedList
+  def empty?; end
+  def initialize; end
+  def self.cons(head, tail); end
+end
+class Rake::CpuCounter
+  def count; end
+  def count_with_default(default = nil); end
+  def self.count; end
+end
+class Rake::Scope < Rake::LinkedList
+  def path; end
+  def path_with_task_name(task_name); end
+  def trim(n); end
+end
+class Rake::Scope::EmptyScope < Rake::LinkedList::EmptyLinkedList
+  def path; end
+  def path_with_task_name(task_name); end
+end
+class Rake::TaskArgumentError < ArgumentError
+end
+class Rake::RuleRecursionOverflowError < StandardError
+  def add_target(target); end
+  def initialize(*args); end
+  def message; end
+end
+module Rake::TaskManager
+  def [](task_name, scopes = nil); end
+  def add_location(task); end
+  def attempt_rule(task_name, task_pattern, args, extensions, block, level); end
+  def clear; end
+  def create_rule(*args, &block); end
+  def current_scope; end
+  def define_task(task_class, *args, &block); end
+  def enhance_with_matching_rule(task_name, level = nil); end
+  def find_location; end
+  def generate_did_you_mean_suggestions(task_name); end
+  def generate_message_for_undefined_task(task_name); end
+  def generate_name; end
+  def get_description(task); end
+  def in_namespace(name); end
+  def initialize; end
+  def intern(task_class, task_name); end
+  def last_description; end
+  def last_description=(arg0); end
+  def lookup(task_name, initial_scope = nil); end
+  def lookup_in_scope(name, scope); end
+  def make_sources(task_name, task_pattern, extensions); end
+  def resolve_args(args); end
+  def resolve_args_with_dependencies(args, hash); end
+  def resolve_args_without_dependencies(args); end
+  def self.record_task_metadata; end
+  def self.record_task_metadata=(arg0); end
+  def synthesize_file_task(task_name); end
+  def tasks; end
+  def tasks_in_scope(scope); end
+  def trace_rule(level, message); end
+end
+module Rake::Cloneable
+  def initialize_copy(source); end
+end
+module FileUtils
+  def create_shell_runner(cmd); end
+  def ruby(*args, **options, &block); end
+  def safe_ln(*args, **options); end
+  def set_verbose_option(options); end
+  def sh(*cmd, &block); end
+  def sh_show_command(cmd); end
+  def split_all(path); end
+end
+module Rake::FileUtilsExt
+  def cd(*args, **options, &block); end
+  def chdir(*args, **options, &block); end
+  def chmod(*args, **options, &block); end
+  def chmod_R(*args, **options, &block); end
+  def chown(*args, **options, &block); end
+  def chown_R(*args, **options, &block); end
+  def copy(*args, **options, &block); end
+  def cp(*args, **options, &block); end
+  def cp_lr(*args, **options, &block); end
+  def cp_r(*args, **options, &block); end
+  def install(*args, **options, &block); end
+  def link(*args, **options, &block); end
+  def ln(*args, **options, &block); end
+  def ln_s(*args, **options, &block); end
+  def ln_sf(*args, **options, &block); end
+  def makedirs(*args, **options, &block); end
+  def mkdir(*args, **options, &block); end
+  def mkdir_p(*args, **options, &block); end
+  def mkpath(*args, **options, &block); end
+  def move(*args, **options, &block); end
+  def mv(*args, **options, &block); end
+  def nowrite(value = nil); end
+  def rake_check_options(options, *optdecl); end
+  def rake_output_message(message); end
+  def remove(*args, **options, &block); end
+  def rm(*args, **options, &block); end
+  def rm_f(*args, **options, &block); end
+  def rm_r(*args, **options, &block); end
+  def rm_rf(*args, **options, &block); end
+  def rmdir(*args, **options, &block); end
+  def rmtree(*args, **options, &block); end
+  def safe_unlink(*args, **options, &block); end
+  def self.nowrite_flag; end
+  def self.nowrite_flag=(arg0); end
+  def self.verbose_flag; end
+  def self.verbose_flag=(arg0); end
+  def symlink(*args, **options, &block); end
+  def touch(*args, **options, &block); end
+  def verbose(value = nil); end
+  def when_writing(msg = nil); end
+  extend Rake::FileUtilsExt
+  include FileUtils
+end
+class Rake::FileList
+  def &(*args, &block); end
+  def *(other); end
+  def +(*args, &block); end
+  def -(*args, &block); end
+  def <<(obj); end
+  def <=>(*args, &block); end
+  def ==(array); end
+  def [](*args, &block); end
+  def []=(*args, &block); end
+  def add(*filenames); end
+  def add_matching(pattern); end
+  def all?(*args, &block); end
+  def any?(*args, &block); end
+  def append(*args, &block); end
+  def assoc(*args, &block); end
+  def at(*args, &block); end
+  def bsearch(*args, &block); end
+  def bsearch_index(*args, &block); end
+  def chain(*args, &block); end
+  def chunk(*args, &block); end
+  def chunk_while(*args, &block); end
+  def clear(*args, &block); end
+  def clear_exclude; end
+  def collect!(*args, &block); end
+  def collect(*args, &block); end
+  def collect_concat(*args, &block); end
+  def combination(*args, &block); end
+  def compact!(*args, &block); end
+  def compact(*args, &block); end
+  def concat(*args, &block); end
+  def count(*args, &block); end
+  def cycle(*args, &block); end
+  def delete(*args, &block); end
+  def delete_at(*args, &block); end
+  def delete_if(*args, &block); end
+  def detect(*args, &block); end
+  def difference(*args, &block); end
+  def dig(*args, &block); end
+  def drop(*args, &block); end
+  def drop_while(*args, &block); end
+  def each(*args, &block); end
+  def each_cons(*args, &block); end
+  def each_entry(*args, &block); end
+  def each_index(*args, &block); end
+  def each_slice(*args, &block); end
+  def each_with_index(*args, &block); end
+  def each_with_object(*args, &block); end
+  def egrep(pattern, *options); end
+  def empty?(*args, &block); end
+  def entries(*args, &block); end
+  def exclude(*patterns, &block); end
+  def excluded_from_list?(fn); end
+  def existing!; end
+  def existing; end
+  def ext(newext = nil); end
+  def fetch(*args, &block); end
+  def fill(*args, &block); end
+  def filter!(*args, &block); end
+  def filter(*args, &block); end
+  def find(*args, &block); end
+  def find_all(*args, &block); end
+  def find_index(*args, &block); end
+  def first(*args, &block); end
+  def flat_map(*args, &block); end
+  def flatten!(*args, &block); end
+  def flatten(*args, &block); end
+  def grep(*args, &block); end
+  def grep_v(*args, &block); end
+  def group_by(*args, &block); end
+  def gsub!(pat, rep); end
+  def gsub(pat, rep); end
+  def import(array); end
+  def include(*filenames); end
+  def include?(*args, &block); end
+  def index(*args, &block); end
+  def initialize(*patterns); end
+  def inject(*args, &block); end
+  def insert(*args, &block); end
+  def inspect(*args, &block); end
+  def is_a?(klass); end
+  def join(*args, &block); end
+  def keep_if(*args, &block); end
+  def kind_of?(klass); end
+  def last(*args, &block); end
+  def lazy(*args, &block); end
+  def length(*args, &block); end
+  def map!(*args, &block); end
+  def map(*args, &block); end
+  def max(*args, &block); end
+  def max_by(*args, &block); end
+  def member?(*args, &block); end
+  def min(*args, &block); end
+  def min_by(*args, &block); end
+  def minmax(*args, &block); end
+  def minmax_by(*args, &block); end
+  def none?(*args, &block); end
+  def one?(*args, &block); end
+  def pack(*args, &block); end
+  def partition(&block); end
+  def pathmap(spec = nil, &block); end
+  def permutation(*args, &block); end
+  def pop(*args, &block); end
+  def prepend(*args, &block); end
+  def product(*args, &block); end
+  def push(*args, &block); end
+  def rassoc(*args, &block); end
+  def reduce(*args, &block); end
+  def reject!(*args, &block); end
+  def reject(*args, &block); end
+  def repeated_combination(*args, &block); end
+  def repeated_permutation(*args, &block); end
+  def replace(*args, &block); end
+  def resolve; end
+  def resolve_add(fn); end
+  def resolve_exclude; end
+  def reverse!(*args, &block); end
+  def reverse(*args, &block); end
+  def reverse_each(*args, &block); end
+  def rindex(*args, &block); end
+  def rotate!(*args, &block); end
+  def rotate(*args, &block); end
+  def sample(*args, &block); end
+  def select!(*args, &block); end
+  def select(*args, &block); end
+  def self.[](*args); end
+  def self.glob(pattern, *args); end
+  def shelljoin(*args, &block); end
+  def shift(*args, &block); end
+  def shuffle!(*args, &block); end
+  def shuffle(*args, &block); end
+  def size(*args, &block); end
+  def slice!(*args, &block); end
+  def slice(*args, &block); end
+  def slice_after(*args, &block); end
+  def slice_before(*args, &block); end
+  def slice_when(*args, &block); end
+  def sort!(*args, &block); end
+  def sort(*args, &block); end
+  def sort_by!(*args, &block); end
+  def sort_by(*args, &block); end
+  def sub!(pat, rep); end
+  def sub(pat, rep); end
+  def sum(*args, &block); end
+  def take(*args, &block); end
+  def take_while(*args, &block); end
+  def to_a; end
+  def to_ary; end
+  def to_h(*args, &block); end
+  def to_s; end
+  def to_set(*args, &block); end
+  def transpose(*args, &block); end
+  def union(*args, &block); end
+  def uniq!(*args, &block); end
+  def uniq(*args, &block); end
+  def unshift(*args, &block); end
+  def values_at(*args, &block); end
+  def zip(*args, &block); end
+  def |(*args, &block); end
+  include Rake::Cloneable
+end
+class Rake::Promise
+  def chore; end
+  def complete?; end
+  def discard; end
+  def error?; end
+  def initialize(args, &block); end
+  def recorder; end
+  def recorder=(arg0); end
+  def result?; end
+  def stat(*args); end
+  def value; end
+  def work; end
+end
+class Rake::ThreadPool
+  def __queue__; end
+  def future(*args, &block); end
+  def gather_history; end
+  def history; end
+  def initialize(thread_count); end
+  def join; end
+  def process_queue_item; end
+  def safe_thread_count; end
+  def start_thread; end
+  def stat(event, data = nil); end
+  def statistics; end
+end
+module Rake::PrivateReader
+  def self.included(base); end
+end
+module Rake::PrivateReader::ClassMethods
+  def private_reader(*names); end
+end
+class Rake::ThreadHistoryDisplay
+  def initialize(stats); end
+  def items; end
+  def rename(hash, key, renames); end
+  def show; end
+  def stats; end
+  def threads; end
+  extend Rake::PrivateReader::ClassMethods
+  include Rake::PrivateReader
+end
+module Rake::TraceOutput
+  def trace_on(out, *strings); end
+end
+class Rake::CommandLineOptionError < StandardError
+end
+class Rake::Application
+  def add_import(fn); end
+  def add_loader(ext, loader); end
+  def collect_command_line_tasks(args); end
+  def default_task_name; end
+  def deprecate(old_usage, new_usage, call_site); end
+  def display_cause_details(ex); end
+  def display_error_message(ex); end
+  def display_exception_backtrace(ex); end
+  def display_exception_details(ex); end
+  def display_exception_details_seen; end
+  def display_exception_message_details(ex); end
+  def display_prerequisites; end
+  def display_tasks_and_comments; end
+  def dynamic_width; end
+  def dynamic_width_stty; end
+  def dynamic_width_tput; end
+  def exit_because_of_exception(ex); end
+  def find_rakefile_location; end
+  def glob(path, &block); end
+  def handle_options(argv); end
+  def has_cause?(ex); end
+  def has_chain?(exception); end
+  def have_rakefile; end
+  def init(app_name = nil, argv = nil); end
+  def initialize; end
+  def invoke_task(task_string); end
+  def load_imports; end
+  def load_rakefile; end
+  def name; end
+  def options; end
+  def original_dir; end
+  def parse_task_string(string); end
+  def print_rakefile_directory(location); end
+  def rake_require(file_name, paths = nil, loaded = nil); end
+  def rakefile; end
+  def rakefile_location(backtrace = nil); end
+  def raw_load_rakefile; end
+  def run(argv = nil); end
+  def run_with_threads; end
+  def select_tasks_to_show(options, show_tasks, value); end
+  def select_trace_output(options, trace_option, value); end
+  def set_default_options; end
+  def sort_options(options); end
+  def standard_exception_handling; end
+  def standard_rake_options; end
+  def standard_system_dir; end
+  def system_dir; end
+  def terminal_columns; end
+  def terminal_columns=(arg0); end
+  def terminal_width; end
+  def thread_pool; end
+  def top_level; end
+  def top_level_tasks; end
+  def trace(*strings); end
+  def truncate(string, width); end
+  def truncate_output?; end
+  def tty_output=(arg0); end
+  def tty_output?; end
+  def unix?; end
+  def windows?; end
+  include Rake::TaskManager
+  include Rake::TraceOutput
+end
+class Rake::PseudoStatus
+  def >>(n); end
+  def exited?; end
+  def exitstatus; end
+  def initialize(code = nil); end
+  def stopped?; end
+  def to_i; end
+end
+class Rake::TaskArguments
+  def [](index); end
+  def each(&block); end
+  def extras; end
+  def fetch(*args, &block); end
+  def has_key?(key); end
+  def initialize(names, values, parent = nil); end
+  def inspect; end
+  def key?(key); end
+  def lookup(name); end
+  def method_missing(sym, *args); end
+  def names; end
+  def new_scope(names); end
+  def to_a; end
+  def to_hash; end
+  def to_s; end
+  def values_at(*keys); end
+  def with_defaults(defaults); end
+  include Enumerable
+end
+class Rake::InvocationChain < Rake::LinkedList
+  def append(invocation); end
+  def member?(invocation); end
+  def prefix; end
+  def self.append(invocation, chain); end
+  def to_s; end
+end
+class Rake::InvocationChain::EmptyInvocationChain < Rake::LinkedList::EmptyLinkedList
+  def append(invocation); end
+  def member?(obj); end
+  def to_s; end
+end
+module Rake::InvocationExceptionMixin
+  def chain; end
+  def chain=(value); end
+end
+class Rake::Task
+  def actions; end
+  def add_chain_to(exception, new_chain); end
+  def add_comment(comment); end
+  def add_description(description); end
+  def all_prerequisite_tasks; end
+  def already_invoked; end
+  def application; end
+  def application=(arg0); end
+  def arg_description; end
+  def arg_names; end
+  def clear; end
+  def clear_actions; end
+  def clear_args; end
+  def clear_comments; end
+  def clear_prerequisites; end
+  def collect_prerequisites(seen); end
+  def comment; end
+  def comment=(comment); end
+  def enhance(deps = nil, &block); end
+  def execute(args = nil); end
+  def first_sentence(string); end
+  def format_trace_flags; end
+  def full_comment; end
+  def initialize(task_name, app); end
+  def inspect; end
+  def investigation; end
+  def invoke(*args); end
+  def invoke_prerequisites(task_args, invocation_chain); end
+  def invoke_prerequisites_concurrently(task_args, invocation_chain); end
+  def invoke_with_call_chain(task_args, invocation_chain); end
+  def locations; end
+  def lookup_prerequisite(prerequisite_name); end
+  def name; end
+  def name_with_args; end
+  def needed?; end
+  def order_only_prerequisites; end
+  def prereqs; end
+  def prerequisite_tasks; end
+  def prerequisites; end
+  def reenable; end
+  def scope; end
+  def self.[](task_name); end
+  def self.clear; end
+  def self.create_rule(*args, &block); end
+  def self.define_task(*args, &block); end
+  def self.format_deps(deps); end
+  def self.scope_name(scope, task_name); end
+  def self.task_defined?(task_name); end
+  def self.tasks; end
+  def set_arg_names(args); end
+  def source; end
+  def sources; end
+  def sources=(arg0); end
+  def timestamp; end
+  def to_s; end
+  def transform_comments(separator, &block); end
+  def |(deps); end
+end
+class Rake::EarlyTime
+  def <=>(other); end
+  def self.allocate; end
+  def self.instance; end
+  def self.new(*arg0); end
+  def to_s; end
+  extend Singleton::SingletonClassMethods
+  include Comparable
+  include Singleton
+end
+class Rake::FileTask < Rake::Task
+  def needed?; end
+  def out_of_date?(stamp); end
+  def self.scope_name(scope, task_name); end
+  def timestamp; end
+end
+class Rake::FileCreationTask < Rake::FileTask
+  def needed?; end
+  def timestamp; end
+end
+class Rake::MultiTask < Rake::Task
+  def invoke_prerequisites(task_args, invocation_chain); end
+end
+module Rake::DSL
+  def cd(*args, **options, &block); end
+  def chdir(*args, **options, &block); end
+  def chmod(*args, **options, &block); end
+  def chmod_R(*args, **options, &block); end
+  def chown(*args, **options, &block); end
+  def chown_R(*args, **options, &block); end
+  def copy(*args, **options, &block); end
+  def cp(*args, **options, &block); end
+  def cp_lr(*args, **options, &block); end
+  def cp_r(*args, **options, &block); end
+  def desc(description); end
+  def directory(*args, &block); end
+  def file(*args, &block); end
+  def file_create(*args, &block); end
+  def import(*fns); end
+  def install(*args, **options, &block); end
+  def link(*args, **options, &block); end
+  def ln(*args, **options, &block); end
+  def ln_s(*args, **options, &block); end
+  def ln_sf(*args, **options, &block); end
+  def makedirs(*args, **options, &block); end
+  def mkdir(*args, **options, &block); end
+  def mkdir_p(*args, **options, &block); end
+  def mkpath(*args, **options, &block); end
+  def move(*args, **options, &block); end
+  def multitask(*args, &block); end
+  def mv(*args, **options, &block); end
+  def namespace(name = nil, &block); end
+  def nowrite(value = nil); end
+  def rake_check_options(options, *optdecl); end
+  def rake_output_message(message); end
+  def remove(*args, **options, &block); end
+  def rm(*args, **options, &block); end
+  def rm_f(*args, **options, &block); end
+  def rm_r(*args, **options, &block); end
+  def rm_rf(*args, **options, &block); end
+  def rmdir(*args, **options, &block); end
+  def rmtree(*args, **options, &block); end
+  def ruby(*args, **options, &block); end
+  def rule(*args, &block); end
+  def safe_ln(*args, **options); end
+  def safe_unlink(*args, **options, &block); end
+  def sh(*cmd, &block); end
+  def split_all(path); end
+  def symlink(*args, **options, &block); end
+  def task(*args, &block); end
+  def touch(*args, **options, &block); end
+  def verbose(value = nil); end
+  def when_writing(msg = nil); end
+  include Rake::FileUtilsExt
+end
+class Rake::DefaultLoader
+  def load(fn); end
+end
+class Rake::LateTime
+  def <=>(other); end
+  def self.allocate; end
+  def self.instance; end
+  def self.new(*arg0); end
+  def to_s; end
+  extend Singleton::SingletonClassMethods
+  include Comparable
+  include Singleton
+end
+class Rake::NameSpace
+  def [](name); end
+  def initialize(task_manager, scope_list); end
+  def scope; end
+  def tasks; end
+end
+module Rake::Backtrace
+  def self.collapse(backtrace); end
+end
+class Rake::TaskLib
+  include Rake::Cloneable
+  include Rake::DSL
+end
diff --git a/sorbet/rbi/sorbet-typed/lib/rspec-core/all/rspec-core.rbi b/sorbet/rbi/sorbet-typed/lib/rspec-core/all/rspec-core.rbi
new file mode 100644
index 0000000..e2cad3b
--- /dev/null
+++ b/sorbet/rbi/sorbet-typed/lib/rspec-core/all/rspec-core.rbi
@@ -0,0 +1,1891 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi sorbet-typed
+#
+# If you would like to make changes to this file, great! Please upstream any changes you make here:
+#
+#   https://github.com/sorbet/sorbet-typed/edit/master/lib/rspec-core/all/rspec-core.rbi
+#
+# typed: false
+
+module RSpec
+  def self.clear_examples; end
+  def self.configuration; end
+  def self.configuration=(arg0); end
+  def self.configure; end
+  def self.const_missing(name); end
+  def self.context(*args, &example_group_block); end
+  def self.current_example; end
+  def self.current_example=(example); end
+  def self.describe(*args, &example_group_block); end
+  def self.example_group(*args, &example_group_block); end
+  def self.fcontext(*args, &example_group_block); end
+  def self.fdescribe(*args, &example_group_block); end
+  def self.reset; end
+  def self.shared_context(name, *args, &block); end
+  def self.shared_examples(name, *args, &block); end
+  def self.shared_examples_for(name, *args, &block); end
+  def self.world; end
+  def self.world=(arg0); end
+  def self.xcontext(*args, &example_group_block); end
+  def self.xdescribe(*args, &example_group_block); end
+  extend RSpec::Core::Warnings
+end
+module RSpec::Core
+  def self.path_to_executable; end
+end
+module RSpec::Core::Version
+end
+module RSpec::Core::Warnings
+  def deprecate(deprecated, data = nil); end
+  def warn_deprecation(message, opts = nil); end
+  def warn_with(message, options = nil); end
+end
+class RSpec::Core::Set
+  def <<(key); end
+  def clear; end
+  def delete(key); end
+  def each(&block); end
+  def empty?; end
+  def include?(key); end
+  def initialize(array = nil); end
+  def merge(values); end
+  include Enumerable
+end
+module RSpec::Core::FlatMap
+  def flat_map(array, &block); end
+  def self.flat_map(array, &block); end
+end
+class RSpec::Core::FilterManager
+  def add_ids(rerun_path, scoped_ids); end
+  def add_location(file_path, line_numbers); end
+  def add_path_to_arrays_filter(filter_key, path, values); end
+  def empty?; end
+  def exclude(*args); end
+  def exclude_only(*args); end
+  def exclude_with_low_priority(*args); end
+  def exclusions; end
+  def file_scoped_include?(ex_metadata, ids, locations); end
+  def include(*args); end
+  def include_only(*args); end
+  def include_with_low_priority(*args); end
+  def inclusions; end
+  def initialize; end
+  def prune(examples); end
+  def prune_conditionally_filtered_examples(examples); end
+end
+class RSpec::Core::FilterRules
+  def [](key); end
+  def add(updated); end
+  def add_with_low_priority(updated); end
+  def clear; end
+  def delete(key); end
+  def description; end
+  def each_pair(&block); end
+  def empty?; end
+  def fetch(*args, &block); end
+  def include_example?(example); end
+  def initialize(rules = nil); end
+  def opposite; end
+  def opposite=(arg0); end
+  def rules; end
+  def self.build; end
+  def use_only(updated); end
+end
+class RSpec::Core::InclusionRules < RSpec::Core::FilterRules
+  def add(*args); end
+  def add_with_low_priority(*args); end
+  def apply_standalone_filter(updated); end
+  def include_example?(example); end
+  def is_standalone_filter?(rules); end
+  def replace_filters(new_rules); end
+  def split_file_scoped_rules; end
+  def standalone?; end
+end
+module RSpec::Core::DSL
+  def self.change_global_dsl(&changes); end
+  def self.example_group_aliases; end
+  def self.expose_example_group_alias(name); end
+  def self.expose_example_group_alias_globally(method_name); end
+  def self.expose_globally!; end
+  def self.exposed_globally?; end
+  def self.remove_globally!; end
+  def self.top_level; end
+  def self.top_level=(arg0); end
+end
+module RSpec::Core::Formatters
+  def self.register(formatter_class, *notifications); end
+end
+module RSpec::Core::Formatters::ConsoleCodes
+  def config_colors_to_methods; end
+  def console_code_for(code_or_symbol); end
+  def self.config_colors_to_methods; end
+  def self.console_code_for(code_or_symbol); end
+  def self.wrap(text, code_or_symbol); end
+  def wrap(text, code_or_symbol); end
+end
+class RSpec::Core::Formatters::SnippetExtractor
+  def beginning_line_number; end
+  def expression_lines; end
+  def expression_node; end
+  def expression_outmost_node?(node); end
+  def initialize(source, beginning_line_number, max_line_count = nil); end
+  def line_range_of_expression; end
+  def line_range_of_location_nodes_in_expression; end
+  def location_nodes_at_beginning_line; end
+  def max_line_count; end
+  def self.extract_expression_lines_at(file_path, beginning_line_number, max_line_count = nil); end
+  def self.extract_line_at(file_path, line_number); end
+  def self.least_indentation_from(lines); end
+  def self.source_from_file(path); end
+  def source; end
+  def unclosed_tokens_in_line_range(line_range); end
+end
+class RSpec::Core::Formatters::SnippetExtractor::NoSuchFileError < StandardError
+end
+class RSpec::Core::Formatters::SnippetExtractor::NoSuchLineError < StandardError
+end
+class RSpec::Core::Formatters::SnippetExtractor::NoExpressionAtLineError < StandardError
+end
+class RSpec::Core::Formatters::SyntaxHighlighter
+  def color_enabled_implementation; end
+  def highlight(lines); end
+  def implementation; end
+  def initialize(configuration); end
+  def self.attempt_to_add_rspec_terms_to_coderay_keywords; end
+end
+module RSpec::Core::Formatters::SyntaxHighlighter::CodeRayImplementation
+  def self.highlight_syntax(lines); end
+end
+module RSpec::Core::Formatters::SyntaxHighlighter::NoSyntaxHighlightingImplementation
+  def self.highlight_syntax(lines); end
+end
+class RSpec::Core::Formatters::ExceptionPresenter
+  def add_shared_group_lines(lines, colorizer); end
+  def backtrace_formatter; end
+  def colorized_formatted_backtrace(colorizer = nil); end
+  def colorized_message_lines(colorizer = nil); end
+  def description; end
+  def detail_formatter; end
+  def encoded_description(description); end
+  def encoded_string(string); end
+  def encoding_of(string); end
+  def example; end
+  def exception; end
+  def exception_backtrace; end
+  def exception_class_name(exception = nil); end
+  def exception_lines; end
+  def exception_message_string(exception); end
+  def extra_detail_formatter; end
+  def extra_failure_lines; end
+  def failure_lines; end
+  def failure_slash_error_lines; end
+  def final_exception(exception, previous = nil); end
+  def find_failed_line; end
+  def formatted_backtrace(exception = nil); end
+  def formatted_cause(exception); end
+  def formatted_message_and_backtrace(colorizer); end
+  def fully_formatted(failure_number, colorizer = nil); end
+  def fully_formatted_lines(failure_number, colorizer); end
+  def indent_lines(lines, failure_number); end
+  def initialize(exception, example, options = nil); end
+  def message_color; end
+  def message_lines; end
+  def read_failed_lines; end
+end
+class RSpec::Core::Formatters::ExceptionPresenter::Factory
+  def build; end
+  def initialize(example); end
+  def multiple_exception_summarizer(exception, prior_detail_formatter, color); end
+  def multiple_exceptions_error?(exception); end
+  def options; end
+  def pending_options; end
+  def sub_failure_list_formatter(exception, message_color); end
+  def with_multiple_error_options_as_needed(exception, options); end
+end
+module RSpec::Core::Formatters::ExceptionPresenter::Factory::EmptyBacktraceFormatter
+  def self.format_backtrace(*arg0); end
+end
+class RSpec::Core::Formatters::ExceptionPresenter::Factory::CommonBacktraceTruncater
+  def initialize(parent); end
+  def with_truncated_backtrace(child); end
+end
+class RSpec::Core::MultipleExceptionError < StandardError
+  def aggregation_block_label; end
+  def aggregation_metadata; end
+  def all_exceptions; end
+  def exception_count_description; end
+  def failures; end
+  def initialize(*exceptions); end
+  def message; end
+  def other_errors; end
+  def summary; end
+  include RSpec::Core::MultipleExceptionError::InterfaceTag
+end
+module RSpec::Core::MultipleExceptionError::InterfaceTag
+  def add(exception); end
+  def self.for(ex); end
+end
+module RSpec::Core::ShellEscape
+  def conditionally_quote(id); end
+  def escape(shell_command); end
+  def quote(argument); end
+  def self.conditionally_quote(id); end
+  def self.escape(shell_command); end
+  def self.quote(argument); end
+  def self.shell_allows_unquoted_ids?; end
+  def shell_allows_unquoted_ids?; end
+end
+module RSpec::Core::Formatters::Helpers
+  def self.format_duration(duration); end
+  def self.format_seconds(float, precision = nil); end
+  def self.organize_ids(ids); end
+  def self.pluralize(count, string); end
+  def self.strip_trailing_zeroes(string); end
+end
+module RSpec::Core::Notifications
+end
+module RSpec::Core::Notifications::NullColorizer
+  def self.wrap(line, _code_or_symbol); end
+  def wrap(line, _code_or_symbol); end
+end
+class RSpec::Core::Notifications::StartNotification < Struct
+  def count; end
+  def count=(_); end
+  def load_time; end
+  def load_time=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::ExampleNotification < Struct
+  def example; end
+  def example=(_); end
+  def self.[](*arg0); end
+  def self.for(example); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::ExamplesNotification
+  def examples; end
+  def failed_examples; end
+  def failure_notifications; end
+  def format_examples(examples); end
+  def fully_formatted_failed_examples(colorizer = nil); end
+  def fully_formatted_pending_examples(colorizer = nil); end
+  def initialize(reporter); end
+  def notifications; end
+  def pending_examples; end
+  def pending_notifications; end
+end
+class RSpec::Core::Notifications::FailedExampleNotification < RSpec::Core::Notifications::ExampleNotification
+  def colorized_formatted_backtrace(colorizer = nil); end
+  def colorized_message_lines(colorizer = nil); end
+  def description; end
+  def exception; end
+  def formatted_backtrace; end
+  def fully_formatted(failure_number, colorizer = nil); end
+  def fully_formatted_lines(failure_number, colorizer = nil); end
+  def initialize(example, exception_presenter = nil); end
+  def message_lines; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::PendingExampleFixedNotification < RSpec::Core::Notifications::FailedExampleNotification
+end
+class RSpec::Core::Notifications::PendingExampleFailedAsExpectedNotification < RSpec::Core::Notifications::FailedExampleNotification
+end
+class RSpec::Core::Notifications::SkippedExampleNotification < RSpec::Core::Notifications::ExampleNotification
+  def fully_formatted(pending_number, colorizer = nil); end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::GroupNotification < Struct
+  def group; end
+  def group=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::MessageNotification < Struct
+  def message; end
+  def message=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::SeedNotification < Struct
+  def fully_formatted; end
+  def seed; end
+  def seed=(_); end
+  def seed_used?; end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def used; end
+  def used=(_); end
+end
+class RSpec::Core::Notifications::SummaryNotification < Struct
+  def colorized_rerun_commands(colorizer = nil); end
+  def colorized_totals_line(colorizer = nil); end
+  def duplicate_rerun_locations; end
+  def duration; end
+  def duration=(_); end
+  def errors_outside_of_examples_count; end
+  def errors_outside_of_examples_count=(_); end
+  def example_count; end
+  def examples; end
+  def examples=(_); end
+  def failed_examples; end
+  def failed_examples=(_); end
+  def failure_count; end
+  def formatted_duration; end
+  def formatted_load_time; end
+  def fully_formatted(colorizer = nil); end
+  def load_time; end
+  def load_time=(_); end
+  def pending_count; end
+  def pending_examples; end
+  def pending_examples=(_); end
+  def rerun_argument_for(example); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def totals_line; end
+  include RSpec::Core::ShellEscape
+end
+class RSpec::Core::Notifications::ProfileNotification
+  def calculate_slowest_groups; end
+  def duration; end
+  def examples; end
+  def initialize(duration, examples, number_of_examples, example_groups); end
+  def number_of_examples; end
+  def percentage; end
+  def slow_duration; end
+  def slowest_examples; end
+  def slowest_groups; end
+end
+class RSpec::Core::Notifications::DeprecationNotification < Struct
+  def call_site; end
+  def call_site=(_); end
+  def deprecated; end
+  def deprecated=(_); end
+  def message; end
+  def message=(_); end
+  def replacement; end
+  def replacement=(_); end
+  def self.[](*arg0); end
+  def self.from_hash(data); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Notifications::NullNotification
+end
+class RSpec::Core::Notifications::CustomNotification < Struct
+  def self.for(options = nil); end
+end
+class RSpec::Core::Reporter
+  def abort_with(msg, exit_status); end
+  def close; end
+  def close_after; end
+  def deprecation(hash); end
+  def ensure_listeners_ready; end
+  def example_failed(example); end
+  def example_finished(example); end
+  def example_group_finished(group); end
+  def example_group_started(group); end
+  def example_passed(example); end
+  def example_pending(example); end
+  def example_started(example); end
+  def examples; end
+  def exit_early(exit_code); end
+  def fail_fast_limit_met?; end
+  def failed_examples; end
+  def finish; end
+  def initialize(configuration); end
+  def message(message); end
+  def mute_profile_output?; end
+  def notify(event, notification); end
+  def notify_non_example_exception(exception, context_description); end
+  def pending_examples; end
+  def prepare_default(loader, output_stream, deprecation_stream); end
+  def publish(event, options = nil); end
+  def register_listener(listener, *notifications); end
+  def registered_listeners(notification); end
+  def report(expected_example_count); end
+  def seed_used?; end
+  def start(expected_example_count, time = nil); end
+  def stop; end
+end
+class RSpec::Core::NullReporter
+  def self.method_missing(*arg0); end
+end
+module RSpec::Core::Hooks
+  def after(*args, &block); end
+  def append_after(*args, &block); end
+  def append_before(*args, &block); end
+  def around(*args, &block); end
+  def before(*args, &block); end
+  def hooks; end
+  def prepend_after(*args, &block); end
+  def prepend_before(*args, &block); end
+end
+class RSpec::Core::Hooks::Hook < Struct
+  def block; end
+  def block=(_); end
+  def options; end
+  def options=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Hooks::BeforeHook < RSpec::Core::Hooks::Hook
+  def run(example); end
+end
+class RSpec::Core::Hooks::AfterHook < RSpec::Core::Hooks::Hook
+  def run(example); end
+end
+class RSpec::Core::Hooks::AfterContextHook < RSpec::Core::Hooks::Hook
+  def run(example); end
+end
+class RSpec::Core::Hooks::AroundHook < RSpec::Core::Hooks::Hook
+  def execute_with(example, procsy); end
+  def hook_description; end
+end
+class RSpec::Core::Hooks::HookCollections
+  def all_hooks_for(position, scope); end
+  def ensure_hooks_initialized_for(position, scope); end
+  def extract_scope_from(args); end
+  def hooks_for(position, scope); end
+  def initialize(owner, filterable_item_repo_class); end
+  def known_scope?(scope); end
+  def matching_hooks_for(position, scope, example_or_group); end
+  def normalized_scope_for(scope); end
+  def owner_parent_groups; end
+  def process(host, parent_groups, globals, position, scope); end
+  def processable_hooks_for(position, scope, host); end
+  def register(prepend_or_append, position, *args, &block); end
+  def register_global_singleton_context_hooks(example, globals); end
+  def register_globals(host, globals); end
+  def run(position, scope, example_or_group); end
+  def run_around_example_hooks_for(example); end
+  def run_example_hooks_for(example, position, each_method); end
+  def run_owned_hooks_for(position, scope, example_or_group); end
+  def scope_and_options_from(*args); end
+end
+module RSpec::Core::MemoizedHelpers
+  def __init_memoized; end
+  def __memoized; end
+  def initialize(*arg0); end
+  def is_expected; end
+  def self.define_helpers_on(example_group); end
+  def self.get_constant_or_yield(example_group, name); end
+  def self.module_for(example_group); end
+  def should(matcher = nil, message = nil); end
+  def should_not(matcher = nil, message = nil); end
+  def subject; end
+end
+class RSpec::Core::MemoizedHelpers::ThreadsafeMemoized
+  def fetch_or_store(key); end
+  def initialize; end
+end
+class RSpec::Core::MemoizedHelpers::NonThreadSafeMemoized
+  def fetch_or_store(key); end
+  def initialize; end
+end
+class RSpec::Core::MemoizedHelpers::ContextHookMemoized
+  def self.fetch_or_store(key, &_block); end
+  def self.isolate_for_context_hook(example_group_instance); end
+end
+class RSpec::Core::MemoizedHelpers::ContextHookMemoized::Before < RSpec::Core::MemoizedHelpers::ContextHookMemoized
+  def self.article; end
+  def self.hook_expression; end
+  def self.hook_intention; end
+end
+class RSpec::Core::MemoizedHelpers::ContextHookMemoized::After < RSpec::Core::MemoizedHelpers::ContextHookMemoized
+  def self.article; end
+  def self.hook_expression; end
+  def self.hook_intention; end
+end
+module RSpec::Core::MemoizedHelpers::ClassMethods
+  def let!(name, &block); end
+  def let(name, &block); end
+  def subject!(name = nil, &block); end
+  def subject(name = nil, &block); end
+end
+module RSpec::Core::Metadata
+  def self.ascend(metadata); end
+  def self.ascending(metadata); end
+  def self.build_hash_from(args, warn_about_example_group_filtering = nil); end
+  def self.deep_hash_dup(object); end
+  def self.id_from(metadata); end
+  def self.location_tuple_from(metadata); end
+  def self.relative_path(line); end
+  def self.relative_path_regex; end
+end
+class RSpec::Core::Metadata::HashPopulator
+  def block; end
+  def build_description_from(parent_description = nil, my_description = nil); end
+  def build_scoped_id_for(file_path); end
+  def description_args; end
+  def description_separator(parent_part, child_part); end
+  def ensure_valid_user_keys; end
+  def file_path_and_line_number_from(backtrace); end
+  def initialize(metadata, user_metadata, index_provider, description_args, block); end
+  def metadata; end
+  def populate; end
+  def populate_location_attributes; end
+  def user_metadata; end
+end
+class RSpec::Core::Metadata::ExampleHash < RSpec::Core::Metadata::HashPopulator
+  def described_class; end
+  def full_description; end
+  def self.create(group_metadata, user_metadata, index_provider, description, block); end
+end
+class RSpec::Core::Metadata::ExampleGroupHash < RSpec::Core::Metadata::HashPopulator
+  def described_class; end
+  def full_description; end
+  def self.backwards_compatibility_default_proc(&example_group_selector); end
+  def self.create(parent_group_metadata, user_metadata, example_group_index, *args, &block); end
+  def self.hash_with_backwards_compatibility_default_proc; end
+end
+module RSpec::Core::HashImitatable
+  def <(*args, &block); end
+  def <=(*args, &block); end
+  def >(*args, &block); end
+  def >=(*args, &block); end
+  def [](key); end
+  def []=(key, value); end
+  def all?(*args, &block); end
+  def any?(*args, &block); end
+  def assoc(*args, &block); end
+  def chain(*args, &block); end
+  def chunk(*args, &block); end
+  def chunk_while(*args, &block); end
+  def clear(*args, &block); end
+  def collect(*args, &block); end
+  def collect_concat(*args, &block); end
+  def compact!(*args, &block); end
+  def compact(*args, &block); end
+  def compare_by_identity(*args, &block); end
+  def compare_by_identity?(*args, &block); end
+  def count(*args, &block); end
+  def cycle(*args, &block); end
+  def default(*args, &block); end
+  def default=(*args, &block); end
+  def default_proc(*args, &block); end
+  def default_proc=(*args, &block); end
+  def delete(*args, &block); end
+  def delete_if(*args, &block); end
+  def detect(*args, &block); end
+  def dig(*args, &block); end
+  def directly_supports_attribute?(name); end
+  def drop(*args, &block); end
+  def drop_while(*args, &block); end
+  def each(*args, &block); end
+  def each_cons(*args, &block); end
+  def each_entry(*args, &block); end
+  def each_key(*args, &block); end
+  def each_pair(*args, &block); end
+  def each_slice(*args, &block); end
+  def each_value(*args, &block); end
+  def each_with_index(*args, &block); end
+  def each_with_object(*args, &block); end
+  def empty?(*args, &block); end
+  def entries(*args, &block); end
+  def extra_hash_attributes; end
+  def fetch(*args, &block); end
+  def fetch_values(*args, &block); end
+  def filter!(*args, &block); end
+  def filter(*args, &block); end
+  def find(*args, &block); end
+  def find_all(*args, &block); end
+  def find_index(*args, &block); end
+  def first(*args, &block); end
+  def flat_map(*args, &block); end
+  def flatten(*args, &block); end
+  def get_value(name); end
+  def grep(*args, &block); end
+  def grep_v(*args, &block); end
+  def group_by(*args, &block); end
+  def has_key?(*args, &block); end
+  def has_value?(*args, &block); end
+  def hash_for_delegation; end
+  def include?(*args, &block); end
+  def index(*args, &block); end
+  def inject(*args, &block); end
+  def invert(*args, &block); end
+  def issue_deprecation(_method_name, *_args); end
+  def keep_if(*args, &block); end
+  def key(*args, &block); end
+  def key?(*args, &block); end
+  def keys(*args, &block); end
+  def lazy(*args, &block); end
+  def length(*args, &block); end
+  def map(*args, &block); end
+  def max(*args, &block); end
+  def max_by(*args, &block); end
+  def member?(*args, &block); end
+  def merge!(*args, &block); end
+  def merge(*args, &block); end
+  def min(*args, &block); end
+  def min_by(*args, &block); end
+  def minmax(*args, &block); end
+  def minmax_by(*args, &block); end
+  def none?(*args, &block); end
+  def one?(*args, &block); end
+  def partition(*args, &block); end
+  def rassoc(*args, &block); end
+  def reduce(*args, &block); end
+  def rehash(*args, &block); end
+  def reject!(*args, &block); end
+  def reject(*args, &block); end
+  def replace(*args, &block); end
+  def reverse_each(*args, &block); end
+  def select!(*args, &block); end
+  def select(*args, &block); end
+  def self.included(klass); end
+  def set_value(name, value); end
+  def shift(*args, &block); end
+  def size(*args, &block); end
+  def slice(*args, &block); end
+  def slice_after(*args, &block); end
+  def slice_before(*args, &block); end
+  def slice_when(*args, &block); end
+  def sort(*args, &block); end
+  def sort_by(*args, &block); end
+  def store(*args, &block); end
+  def sum(*args, &block); end
+  def take(*args, &block); end
+  def take_while(*args, &block); end
+  def to_a(*args, &block); end
+  def to_h; end
+  def to_hash(*args, &block); end
+  def to_proc(*args, &block); end
+  def to_set(*args, &block); end
+  def transform_keys!(*args, &block); end
+  def transform_keys(*args, &block); end
+  def transform_values!(*args, &block); end
+  def transform_values(*args, &block); end
+  def uniq(*args, &block); end
+  def update(*args, &block); end
+  def value?(*args, &block); end
+  def values(*args, &block); end
+  def values_at(*args, &block); end
+  def zip(*args, &block); end
+end
+module RSpec::Core::HashImitatable::ClassMethods
+  def attr_accessor(*names); end
+  def hash_attribute_names; end
+end
+class RSpec::Core::LegacyExampleGroupHash
+  def directly_supports_attribute?(name); end
+  def get_value(name); end
+  def initialize(metadata); end
+  def set_value(name, value); end
+  def to_h; end
+  extend RSpec::Core::HashImitatable::ClassMethods
+  include RSpec::Core::HashImitatable
+end
+module RSpec::Core::MetadataFilter
+  def self.apply?(predicate, filters, metadata); end
+  def self.filter_applies?(key, filter_value, metadata); end
+  def self.filter_applies_to_any_value?(key, value, metadata); end
+  def self.filters_apply?(key, value, metadata); end
+  def self.id_filter_applies?(rerun_paths_to_scoped_ids, metadata); end
+  def self.location_filter_applies?(locations, metadata); end
+  def self.proc_filter_applies?(key, proc, metadata); end
+  def self.silence_metadata_example_group_deprecations; end
+end
+module RSpec::Core::FilterableItemRepository
+end
+class RSpec::Core::FilterableItemRepository::UpdateOptimized
+  def append(item, metadata); end
+  def delete(item, metadata); end
+  def initialize(applies_predicate); end
+  def items_and_filters; end
+  def items_for(request_meta); end
+  def prepend(item, metadata); end
+end
+class RSpec::Core::FilterableItemRepository::QueryOptimized < RSpec::Core::FilterableItemRepository::UpdateOptimized
+  def append(item, metadata); end
+  def applicable_metadata_from(metadata); end
+  def delete(item, metadata); end
+  def find_items_for(request_meta); end
+  def handle_mutation(metadata); end
+  def initialize(applies_predicate); end
+  def items_for(metadata); end
+  def prepend(item, metadata); end
+  def proc_keys_from(metadata); end
+  def reconstruct_caches; end
+end
+module RSpec::Core::Pending
+  def pending(message = nil); end
+  def self.mark_fixed!(example); end
+  def self.mark_pending!(example, message_or_bool); end
+  def self.mark_skipped!(example, message_or_bool); end
+  def skip(message = nil); end
+end
+class RSpec::Core::Pending::SkipDeclaredInExample < StandardError
+  def argument; end
+  def initialize(argument); end
+end
+class RSpec::Core::Pending::PendingExampleFixedError < StandardError
+end
+class RSpec::Core::Formatters::Loader
+  def add(formatter_to_use, *paths); end
+  def built_in_formatter(key); end
+  def custom_formatter(formatter_ref); end
+  def default_formatter; end
+  def default_formatter=(arg0); end
+  def duplicate_formatter_exists?(new_formatter); end
+  def existing_formatter_implements?(notification); end
+  def find_formatter(formatter_to_use); end
+  def formatters; end
+  def initialize(reporter); end
+  def notifications_for(formatter_class); end
+  def open_stream(path_or_wrapper); end
+  def path_for(const_ref); end
+  def prepare_default(output_stream, deprecation_stream); end
+  def register(formatter, notifications); end
+  def reporter; end
+  def self.formatters; end
+  def setup_default(output_stream, deprecation_stream); end
+  def string_const?(str); end
+  def underscore(camel_cased_word); end
+  def underscore_with_fix_for_non_standard_rspec_naming(string); end
+end
+module RSpec::Core::Ordering
+end
+class RSpec::Core::Ordering::Identity
+  def order(items); end
+end
+class RSpec::Core::Ordering::Random
+  def initialize(configuration); end
+  def jenkins_hash_digest(string); end
+  def order(items); end
+  def used?; end
+end
+class RSpec::Core::Ordering::Custom
+  def initialize(callable); end
+  def order(list); end
+end
+class RSpec::Core::Ordering::Registry
+  def fetch(name, &fallback); end
+  def initialize(configuration); end
+  def register(sym, strategy); end
+  def used_random_seed?; end
+end
+class RSpec::Core::Ordering::ConfigurationManager
+  def force(hash); end
+  def initialize; end
+  def order=(type); end
+  def ordering_registry; end
+  def register_ordering(name, strategy = nil); end
+  def seed; end
+  def seed=(seed); end
+  def seed_used?; end
+end
+class RSpec::Core::World
+  def all_example_groups; end
+  def all_examples; end
+  def announce_exclusion_filter(announcements); end
+  def announce_filters; end
+  def announce_inclusion_filter(announcements); end
+  def descending_declaration_line_numbers_by_file; end
+  def everything_filtered_message; end
+  def example_count(groups = nil); end
+  def example_group_counts_by_spec_file; end
+  def example_groups; end
+  def exclusion_filter; end
+  def fail_if_config_and_cli_options_invalid; end
+  def filter_manager; end
+  def filtered_examples; end
+  def inclusion_filter; end
+  def initialize(configuration = nil); end
+  def non_example_failure; end
+  def non_example_failure=(arg0); end
+  def num_example_groups_defined_in(file); end
+  def ordered_example_groups; end
+  def preceding_declaration_line(absolute_file_name, filter_line); end
+  def prepare_example_filtering; end
+  def record(example_group); end
+  def registered_example_group_files; end
+  def report_filter_message(message); end
+  def reporter; end
+  def reset; end
+  def shared_example_group_registry; end
+  def source_from_file(path); end
+  def syntax_highlighter; end
+  def traverse_example_group_trees_until(&block); end
+  def wants_to_quit; end
+  def wants_to_quit=(arg0); end
+end
+module RSpec::Core::World::Null
+  def self.all_example_groups; end
+  def self.example_groups; end
+  def self.non_example_failure; end
+  def self.non_example_failure=(_); end
+  def self.registered_example_group_files; end
+  def self.traverse_example_group_trees_until; end
+end
+class RSpec::Core::BacktraceFormatter
+  def backtrace_line(line); end
+  def exclude?(line); end
+  def exclusion_patterns; end
+  def exclusion_patterns=(arg0); end
+  def filter_gem(gem_name); end
+  def format_backtrace(backtrace, options = nil); end
+  def full_backtrace=(arg0); end
+  def full_backtrace?; end
+  def inclusion_patterns; end
+  def inclusion_patterns=(arg0); end
+  def initialize; end
+  def matches?(patterns, line); end
+end
+module RSpec::Core::RubyProject
+  def add_dir_to_load_path(dir); end
+  def add_to_load_path(*dirs); end
+  def ascend_until; end
+  def determine_root; end
+  def find_first_parent_containing(dir); end
+  def root; end
+  def self.add_dir_to_load_path(dir); end
+  def self.add_to_load_path(*dirs); end
+  def self.ascend_until; end
+  def self.determine_root; end
+  def self.find_first_parent_containing(dir); end
+  def self.root; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter
+  def count; end
+  def deprecation(notification); end
+  def deprecation_message_for(data); end
+  def deprecation_stream; end
+  def deprecation_summary(_notification); end
+  def initialize(deprecation_stream, summary_stream); end
+  def output; end
+  def printer; end
+  def summary_stream; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::SpecifiedDeprecationMessage < Struct
+  def deprecation_type_for(data); end
+  def initialize(data); end
+  def output_formatted(str); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def to_s; end
+  def too_many_warnings_message; end
+  def type; end
+  def type=(_); end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::GeneratedDeprecationMessage < Struct
+  def initialize(data); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+  def to_s; end
+  def too_many_warnings_message; end
+  def type; end
+  def type=(_); end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::ImmediatePrinter
+  def deprecation_formatter; end
+  def deprecation_stream; end
+  def deprecation_summary; end
+  def initialize(deprecation_stream, summary_stream, deprecation_formatter); end
+  def print_deprecation_message(data); end
+  def summary_stream; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::DelayedPrinter
+  def deprecation_formatter; end
+  def deprecation_stream; end
+  def deprecation_summary; end
+  def initialize(deprecation_stream, summary_stream, deprecation_formatter); end
+  def print_deferred_deprecation_warnings; end
+  def print_deprecation_message(data); end
+  def stash_deprecation_message(deprecation_message); end
+  def summary_stream; end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::RaiseErrorStream
+  def puts(message); end
+  def summarize(summary_stream, deprecation_count); end
+end
+class RSpec::Core::Formatters::DeprecationFormatter::FileStream
+  def initialize(file); end
+  def puts(*args); end
+  def summarize(summary_stream, deprecation_count); end
+end
+class RSpec::Core::DeprecationError < StandardError
+end
+class RSpec::Core::OutputWrapper
+  def <<(*args, &block); end
+  def advise(*args, &block); end
+  def autoclose=(*args, &block); end
+  def autoclose?(*args, &block); end
+  def binmode(*args, &block); end
+  def binmode?(*args, &block); end
+  def bytes(*args, &block); end
+  def chars(*args, &block); end
+  def close(*args, &block); end
+  def close_on_exec=(*args, &block); end
+  def close_on_exec?(*args, &block); end
+  def close_read(*args, &block); end
+  def close_write(*args, &block); end
+  def closed?(*args, &block); end
+  def codepoints(*args, &block); end
+  def each(*args, &block); end
+  def each_byte(*args, &block); end
+  def each_char(*args, &block); end
+  def each_codepoint(*args, &block); end
+  def each_line(*args, &block); end
+  def eof(*args, &block); end
+  def eof?(*args, &block); end
+  def external_encoding(*args, &block); end
+  def fcntl(*args, &block); end
+  def fdatasync(*args, &block); end
+  def fileno(*args, &block); end
+  def flush(*args, &block); end
+  def fsync(*args, &block); end
+  def getbyte(*args, &block); end
+  def getc(*args, &block); end
+  def gets(*args, &block); end
+  def initialize(output); end
+  def inspect(*args, &block); end
+  def internal_encoding(*args, &block); end
+  def ioctl(*args, &block); end
+  def isatty(*args, &block); end
+  def lineno(*args, &block); end
+  def lineno=(*args, &block); end
+  def lines(*args, &block); end
+  def method_missing(name, *args, &block); end
+  def nread(*args, &block); end
+  def output; end
+  def output=(arg0); end
+  def pathconf(*args, &block); end
+  def pid(*args, &block); end
+  def pos(*args, &block); end
+  def pos=(*args, &block); end
+  def pread(*args, &block); end
+  def print(*args, &block); end
+  def printf(*args, &block); end
+  def putc(*args, &block); end
+  def puts(*args, &block); end
+  def pwrite(*args, &block); end
+  def read(*args, &block); end
+  def read_nonblock(*args, &block); end
+  def readbyte(*args, &block); end
+  def readchar(*args, &block); end
+  def readline(*args, &block); end
+  def readlines(*args, &block); end
+  def readpartial(*args, &block); end
+  def ready?(*args, &block); end
+  def reopen(*args, &block); end
+  def respond_to?(name, priv = nil); end
+  def rewind(*args, &block); end
+  def seek(*args, &block); end
+  def set_encoding(*args, &block); end
+  def stat(*args, &block); end
+  def sync(*args, &block); end
+  def sync=(*args, &block); end
+  def sysread(*args, &block); end
+  def sysseek(*args, &block); end
+  def syswrite(*args, &block); end
+  def tell(*args, &block); end
+  def to_i(*args, &block); end
+  def to_io(*args, &block); end
+  def tty?(*args, &block); end
+  def ungetbyte(*args, &block); end
+  def ungetc(*args, &block); end
+  def wait(*args, &block); end
+  def wait_readable(*args, &block); end
+  def wait_writable(*args, &block); end
+  def write(*args, &block); end
+  def write_nonblock(*args, &block); end
+end
+class RSpec::Core::Configuration
+  def absolute_pattern?(pattern); end
+  def add_formatter(formatter, output = nil); end
+  def add_hook_to_existing_matching_groups(meta, scope, &block); end
+  def add_setting(name, opts = nil); end
+  def after(scope = nil, *meta, &block); end
+  def alias_example_group_to(new_name, *args); end
+  def alias_example_to(name, *args); end
+  def alias_it_behaves_like_to(new_name, report_label = nil); end
+  def alias_it_should_behave_like_to(new_name, report_label = nil); end
+  def append_after(scope = nil, *meta, &block); end
+  def append_before(scope = nil, *meta, &block); end
+  def apply_derived_metadata_to(metadata); end
+  def around(scope = nil, *meta, &block); end
+  def assert_no_example_groups_defined(config_option); end
+  def backtrace_exclusion_patterns; end
+  def backtrace_exclusion_patterns=(patterns); end
+  def backtrace_formatter; end
+  def backtrace_inclusion_patterns; end
+  def backtrace_inclusion_patterns=(patterns); end
+  def before(scope = nil, *meta, &block); end
+  def bisect_runner; end
+  def bisect_runner=(value); end
+  def bisect_runner_class; end
+  def clear_values_derived_from_example_status_persistence_file_path; end
+  def color; end
+  def color=(arg0); end
+  def color_enabled?(output = nil); end
+  def color_mode; end
+  def color_mode=(arg0); end
+  def command; end
+  def conditionally_disable_expectations_monkey_patching; end
+  def conditionally_disable_mocks_monkey_patching; end
+  def configure_example(example, example_hooks); end
+  def configure_expectation_framework; end
+  def configure_group(group); end
+  def configure_group_with(group, module_list, application_method); end
+  def configure_mock_framework; end
+  def default_color; end
+  def default_color=(arg0); end
+  def default_color?; end
+  def default_formatter; end
+  def default_formatter=(value); end
+  def default_path; end
+  def default_path=(path); end
+  def default_path?; end
+  def define_built_in_hooks; end
+  def define_derived_metadata(*filters, &block); end
+  def define_mixed_in_module(mod, filters, mod_list, config_method, &block); end
+  def deprecation_stream; end
+  def deprecation_stream=(value); end
+  def detail_color; end
+  def detail_color=(arg0); end
+  def detail_color?; end
+  def disable_monkey_patching!; end
+  def disable_monkey_patching; end
+  def disable_monkey_patching=(arg0); end
+  def drb; end
+  def drb=(arg0); end
+  def drb?; end
+  def drb_port; end
+  def drb_port=(arg0); end
+  def drb_port?; end
+  def dry_run; end
+  def dry_run=(arg0); end
+  def dry_run?; end
+  def error_exit_code; end
+  def error_exit_code=(arg0); end
+  def error_exit_code?; end
+  def error_stream; end
+  def error_stream=(arg0); end
+  def error_stream?; end
+  def example_status_persistence_file_path; end
+  def example_status_persistence_file_path=(value); end
+  def exclude_pattern; end
+  def exclude_pattern=(value); end
+  def exclusion_filter; end
+  def exclusion_filter=(filter); end
+  def expect_with(*frameworks); end
+  def expectation_framework=(framework); end
+  def expectation_frameworks; end
+  def expose_current_running_example_as(method_name); end
+  def expose_dsl_globally=(value); end
+  def expose_dsl_globally?; end
+  def extend(mod, *filters); end
+  def extract_location(path); end
+  def fail_fast; end
+  def fail_fast=(value); end
+  def fail_if_no_examples; end
+  def fail_if_no_examples=(arg0); end
+  def fail_if_no_examples?; end
+  def failure_color; end
+  def failure_color=(arg0); end
+  def failure_color?; end
+  def failure_exit_code; end
+  def failure_exit_code=(arg0); end
+  def failure_exit_code?; end
+  def file_glob_from(path, pattern); end
+  def files_or_directories_to_run=(*files); end
+  def files_to_run; end
+  def files_to_run=(arg0); end
+  def filter; end
+  def filter=(filter); end
+  def filter_gems_from_backtrace(*gem_names); end
+  def filter_manager; end
+  def filter_manager=(arg0); end
+  def filter_run(*args); end
+  def filter_run_excluding(*args); end
+  def filter_run_including(*args); end
+  def filter_run_when_matching(*args); end
+  def fixed_color; end
+  def fixed_color=(arg0); end
+  def fixed_color?; end
+  def force(hash); end
+  def format_docstrings(&block); end
+  def format_docstrings_block; end
+  def formatter=(formatter, output = nil); end
+  def formatter_loader; end
+  def formatters; end
+  def full_backtrace=(true_or_false); end
+  def full_backtrace?; end
+  def full_description; end
+  def full_description=(description); end
+  def gather_directories(path); end
+  def get_files_to_run(paths); end
+  def get_matching_files(path, pattern); end
+  def handle_suite_hook(scope, meta); end
+  def hooks; end
+  def in_project_source_dir_regex; end
+  def include(mod, *filters); end
+  def include_context(shared_group_name, *filters); end
+  def inclusion_filter; end
+  def inclusion_filter=(filter); end
+  def initialize; end
+  def last_run_statuses; end
+  def libs; end
+  def libs=(libs); end
+  def load_file_handling_errors(method, file); end
+  def load_spec_files; end
+  def loaded_spec_files; end
+  def max_displayed_failure_line_count; end
+  def max_displayed_failure_line_count=(arg0); end
+  def max_displayed_failure_line_count?; end
+  def metadata_applies_to_group?(meta, group); end
+  def mock_framework; end
+  def mock_framework=(framework); end
+  def mock_with(framework); end
+  def on_example_group_definition(&block); end
+  def on_example_group_definition_callbacks; end
+  def on_existing_matching_groups(meta); end
+  def only_failures; end
+  def only_failures?; end
+  def only_failures_but_not_configured?; end
+  def order=(*args, &block); end
+  def ordering_manager; end
+  def ordering_registry(*args, &block); end
+  def output_stream; end
+  def output_stream=(value); end
+  def output_to_tty?(output = nil); end
+  def output_wrapper; end
+  def paths_to_check(paths); end
+  def pattern; end
+  def pattern=(value); end
+  def pattern_might_load_specs_from_vendored_dirs?; end
+  def pending_color; end
+  def pending_color=(arg0); end
+  def pending_color?; end
+  def prepend(mod, *filters); end
+  def prepend_after(scope = nil, *meta, &block); end
+  def prepend_before(scope = nil, *meta, &block); end
+  def profile_examples; end
+  def profile_examples=(arg0); end
+  def profile_examples?; end
+  def project_source_dirs; end
+  def project_source_dirs=(arg0); end
+  def project_source_dirs?; end
+  def raise_errors_for_deprecations!; end
+  def raise_on_warning=(value); end
+  def register_ordering(*args, &block); end
+  def reporter; end
+  def requires; end
+  def requires=(paths); end
+  def reset; end
+  def reset_filters; end
+  def reset_reporter; end
+  def rspec_expectations_loaded?; end
+  def rspec_mocks_loaded?; end
+  def run_all_when_everything_filtered; end
+  def run_all_when_everything_filtered=(arg0); end
+  def run_all_when_everything_filtered?; end
+  def run_suite_hooks(hook_description, hooks); end
+  def safe_extend(mod, host); end
+  def safe_include(mod, host); end
+  def safe_prepend(mod, host); end
+  def seed(*args, &block); end
+  def seed=(*args, &block); end
+  def seed_used?(*args, &block); end
+  def self.add_read_only_setting(name, opts = nil); end
+  def self.add_setting(name, opts = nil); end
+  def self.define_alias(name, alias_name); end
+  def self.define_predicate(name); end
+  def self.define_reader(name); end
+  def self.delegate_to_ordering_manager(*methods); end
+  def shared_context_metadata_behavior; end
+  def shared_context_metadata_behavior=(value); end
+  def silence_filter_announcements; end
+  def silence_filter_announcements=(arg0); end
+  def silence_filter_announcements?; end
+  def spec_files_with_failures; end
+  def start_time; end
+  def start_time=(arg0); end
+  def start_time?; end
+  def static_config_filter_manager; end
+  def static_config_filter_manager=(arg0); end
+  def success_color; end
+  def success_color=(arg0); end
+  def success_color?; end
+  def threadsafe; end
+  def threadsafe=(arg0); end
+  def threadsafe?; end
+  def treat_symbols_as_metadata_keys_with_true_values=(_value); end
+  def tty; end
+  def tty=(arg0); end
+  def tty?; end
+  def update_pattern_attr(name, value); end
+  def value_for(key); end
+  def warnings=(value); end
+  def warnings?; end
+  def when_first_matching_example_defined(*filters); end
+  def with_suite_hooks; end
+  def world; end
+  def world=(arg0); end
+  include RSpec::Core::Configuration::Readers
+  include RSpec::Core::Hooks
+end
+module RSpec::Core::Configuration::Readers
+  def default_color; end
+  def default_path; end
+  def deprecation_stream; end
+  def detail_color; end
+  def drb; end
+  def drb_port; end
+  def dry_run; end
+  def error_exit_code; end
+  def error_stream; end
+  def example_status_persistence_file_path; end
+  def exclude_pattern; end
+  def fail_fast; end
+  def fail_if_no_examples; end
+  def failure_color; end
+  def failure_exit_code; end
+  def fixed_color; end
+  def libs; end
+  def max_displayed_failure_line_count; end
+  def only_failures; end
+  def output_stream; end
+  def pattern; end
+  def pending_color; end
+  def project_source_dirs; end
+  def requires; end
+  def run_all_when_everything_filtered; end
+  def shared_context_metadata_behavior; end
+  def silence_filter_announcements; end
+  def start_time; end
+  def success_color; end
+  def threadsafe; end
+  def tty; end
+end
+class RSpec::Core::Configuration::MustBeConfiguredBeforeExampleGroupsError < StandardError
+end
+class RSpec::Core::Configuration::DeprecationReporterBuffer
+  def deprecation(*args); end
+  def initialize; end
+  def play_onto(reporter); end
+end
+module RSpec::Core::Configuration::ExposeCurrentExample
+end
+class RSpec::Core::Parser
+  def add_tag_filter(options, filter_type, tag_name, value = nil); end
+  def configure_only_failures(options); end
+  def initialize(original_args); end
+  def original_args; end
+  def parse(source = nil); end
+  def parser(options); end
+  def self.parse(args, source = nil); end
+  def set_fail_fast(options, value); end
+end
+class RSpec::Core::ConfigurationOptions
+  def args; end
+  def args_from_options_file(path); end
+  def command_line_options; end
+  def configure(config); end
+  def configure_filter_manager(filter_manager); end
+  def custom_options; end
+  def custom_options_file; end
+  def env_options; end
+  def file_options; end
+  def force?(key); end
+  def global_options; end
+  def global_options_file; end
+  def home_options_file_path; end
+  def initialize(args); end
+  def load_formatters_into(config); end
+  def local_options; end
+  def local_options_file; end
+  def options; end
+  def options_file_as_erb_string(path); end
+  def options_from(path); end
+  def order(keys); end
+  def organize_options; end
+  def parse_args_ignoring_files_or_dirs_to_run(args, source); end
+  def process_options_into(config); end
+  def project_options; end
+  def project_options_file; end
+  def resolve_xdg_config_home; end
+  def xdg_options_file_if_exists; end
+  def xdg_options_file_path; end
+end
+class RSpec::Core::Runner
+  def configuration; end
+  def configure(err, out); end
+  def exit_code(examples_passed = nil); end
+  def initialize(options, configuration = nil, world = nil); end
+  def options; end
+  def persist_example_statuses; end
+  def run(err, out); end
+  def run_specs(example_groups); end
+  def self.autorun; end
+  def self.autorun_disabled?; end
+  def self.disable_autorun!; end
+  def self.handle_interrupt; end
+  def self.installed_at_exit?; end
+  def self.invoke; end
+  def self.perform_at_exit; end
+  def self.run(args, err = nil, out = nil); end
+  def self.running_in_drb?; end
+  def self.trap_interrupt; end
+  def setup(err, out); end
+  def world; end
+end
+module RSpec::Core::Invocations
+end
+class RSpec::Core::Invocations::InitializeProject
+  def call(*_args); end
+end
+class RSpec::Core::Invocations::DRbWithFallback
+  def call(options, err, out); end
+end
+class RSpec::Core::Invocations::Bisect
+  def bisect_formatter_klass_for(argument); end
+  def call(options, err, out); end
+end
+class RSpec::Core::Invocations::PrintVersion
+  def call(_options, _err, out); end
+end
+class RSpec::Core::Invocations::PrintHelp < Struct
+  def call(_options, _err, out); end
+  def hidden_options; end
+  def hidden_options=(_); end
+  def parser; end
+  def parser=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Example
+  def assign_generated_description; end
+  def clock; end
+  def clock=(arg0); end
+  def description; end
+  def display_exception; end
+  def display_exception=(ex); end
+  def duplicate_with(metadata_overrides = nil); end
+  def example_group; end
+  def example_group_instance; end
+  def exception; end
+  def execution_result; end
+  def fail_with_exception(reporter, exception); end
+  def file_path; end
+  def finish(reporter); end
+  def full_description; end
+  def generate_description; end
+  def hooks; end
+  def id; end
+  def initialize(example_group_class, description, user_metadata, example_block = nil); end
+  def inspect; end
+  def inspect_output; end
+  def instance_exec(*args, &block); end
+  def location; end
+  def location_description; end
+  def location_rerun_argument; end
+  def metadata; end
+  def mocks_need_verification?; end
+  def pending; end
+  def pending?; end
+  def record_finished(status, reporter); end
+  def reporter; end
+  def rerun_argument; end
+  def run(example_group_instance, reporter); end
+  def run_after_example; end
+  def run_before_example; end
+  def self.delegate_to_metadata(key); end
+  def self.parse_id(id); end
+  def set_aggregate_failures_exception(exception); end
+  def set_exception(exception); end
+  def skip; end
+  def skip_with_exception(reporter, exception); end
+  def skipped?; end
+  def start(reporter); end
+  def to_s; end
+  def update_inherited_metadata(updates); end
+  def verify_mocks; end
+  def with_around_and_singleton_context_hooks; end
+  def with_around_example_hooks; end
+end
+class RSpec::Core::Example::Procsy
+  def <<(*a, &b); end
+  def ===(*a, &b); end
+  def >>(*a, &b); end
+  def [](*a, &b); end
+  def arity(*a, &b); end
+  def binding(*a, &b); end
+  def call(*args, &block); end
+  def clock(*a, &b); end
+  def clock=(*a, &b); end
+  def clone(*a, &b); end
+  def curry(*a, &b); end
+  def description(*a, &b); end
+  def dup(*a, &b); end
+  def duplicate_with(*a, &b); end
+  def example; end
+  def example_group(*a, &b); end
+  def example_group_instance(*a, &b); end
+  def exception(*a, &b); end
+  def executed?; end
+  def execution_result(*a, &b); end
+  def file_path(*a, &b); end
+  def full_description(*a, &b); end
+  def hash(*a, &b); end
+  def id(*a, &b); end
+  def initialize(example, &block); end
+  def inspect; end
+  def inspect_output(*a, &b); end
+  def lambda?(*a, &b); end
+  def location(*a, &b); end
+  def location_rerun_argument(*a, &b); end
+  def metadata(*a, &b); end
+  def parameters(*a, &b); end
+  def pending(*a, &b); end
+  def pending?(*a, &b); end
+  def reporter(*a, &b); end
+  def rerun_argument(*a, &b); end
+  def run(*args, &block); end
+  def skip(*a, &b); end
+  def skipped?(*a, &b); end
+  def source_location(*a, &b); end
+  def to_proc; end
+  def update_inherited_metadata(*a, &b); end
+  def wrap(&block); end
+  def yield(*a, &b); end
+end
+class RSpec::Core::Example::ExecutionResult
+  def calculate_run_time(finished_at); end
+  def ensure_timing_set(clock); end
+  def example_skipped?; end
+  def exception; end
+  def exception=(arg0); end
+  def finished_at; end
+  def finished_at=(arg0); end
+  def get_value(name); end
+  def hash_for_delegation; end
+  def issue_deprecation(_method_name, *_args); end
+  def pending_exception; end
+  def pending_exception=(arg0); end
+  def pending_fixed; end
+  def pending_fixed=(arg0); end
+  def pending_fixed?; end
+  def pending_message; end
+  def pending_message=(arg0); end
+  def record_finished(status, finished_at); end
+  def run_time; end
+  def run_time=(arg0); end
+  def set_value(name, value); end
+  def started_at; end
+  def started_at=(arg0); end
+  def status; end
+  def status=(arg0); end
+  extend RSpec::Core::HashImitatable::ClassMethods
+  include RSpec::Core::HashImitatable
+end
+class RSpec::Core::SuiteHookContext < RSpec::Core::Example
+  def initialize(hook_description, reporter); end
+  def set_exception(exception); end
+end
+class RSpec::Core::SharedExampleGroupModule < Module
+  def definition; end
+  def include_in(klass, inclusion_line, args, customization_block); end
+  def included(klass); end
+  def initialize(description, definition, metadata); end
+  def inspect; end
+  def to_s; end
+end
+module RSpec::Core::SharedExampleGroup
+  def shared_context(name, *args, &block); end
+  def shared_examples(name, *args, &block); end
+  def shared_examples_for(name, *args, &block); end
+end
+module RSpec::Core::SharedExampleGroup::TopLevelDSL
+  def self.definitions; end
+  def self.expose_globally!; end
+  def self.exposed_globally?; end
+  def self.remove_globally!; end
+end
+class RSpec::Core::SharedExampleGroup::Registry
+  def add(context, name, *metadata_args, &block); end
+  def ensure_block_has_source_location(_block); end
+  def find(lookup_contexts, name); end
+  def formatted_location(block); end
+  def legacy_add(context, name, *metadata_args, &block); end
+  def shared_example_groups; end
+  def valid_name?(candidate); end
+  def warn_if_key_taken(context, key, new_block); end
+end
+class RSpec::Core::ExampleGroup
+  def described_class; end
+  def initialize(inspect_output = nil); end
+  def inspect; end
+  def method_missing(name, *args); end
+  def self.add_example(example); end
+  def self.before_context_ivars; end
+  def self.children; end
+  def self.context(*args, &example_group_block); end
+  def self.currently_executing_a_context_hook?; end
+  def self.declaration_locations; end
+  def self.define_example_group_method(name, metadata = nil); end
+  def self.define_example_method(name, extra_options = nil); end
+  def self.define_nested_shared_group_method(new_name, report_label = nil); end
+  def self.delegate_to_metadata(*names); end
+  def self.descendant_filtered_examples; end
+  def self.descendants; end
+  def self.describe(*args, &example_group_block); end
+  def self.described_class; end
+  def self.description; end
+  def self.each_instance_variable_for_example(group); end
+  def self.ensure_example_groups_are_configured; end
+  def self.example(*all_args, &block); end
+  def self.example_group(*args, &example_group_block); end
+  def self.examples; end
+  def self.fcontext(*args, &example_group_block); end
+  def self.fdescribe(*args, &example_group_block); end
+  def self.fexample(*all_args, &block); end
+  def self.file_path; end
+  def self.filtered_examples; end
+  def self.find_and_eval_shared(label, name, inclusion_location, *args, &customization_block); end
+  def self.fit(*all_args, &block); end
+  def self.focus(*all_args, &block); end
+  def self.for_filtered_examples(reporter, &block); end
+  def self.fspecify(*all_args, &block); end
+  def self.id; end
+  def self.idempotently_define_singleton_method(name, &definition); end
+  def self.include_context(name, *args, &block); end
+  def self.include_examples(name, *args, &block); end
+  def self.it(*all_args, &block); end
+  def self.it_behaves_like(name, *args, &customization_block); end
+  def self.it_should_behave_like(name, *args, &customization_block); end
+  def self.location; end
+  def self.metadata; end
+  def self.method_missing(name, *args); end
+  def self.next_runnable_index_for(file); end
+  def self.ordering_strategy; end
+  def self.parent_groups; end
+  def self.pending(*all_args, &block); end
+  def self.remove_example(example); end
+  def self.reset_memoized; end
+  def self.run(reporter = nil); end
+  def self.run_after_context_hooks(example_group_instance); end
+  def self.run_before_context_hooks(example_group_instance); end
+  def self.run_examples(reporter); end
+  def self.set_it_up(description, args, registration_collection, &example_group_block); end
+  def self.set_ivars(instance, ivars); end
+  def self.skip(*all_args, &block); end
+  def self.specify(*all_args, &block); end
+  def self.store_before_context_ivars(example_group_instance); end
+  def self.subclass(parent, description, args, registration_collection, &example_group_block); end
+  def self.superclass_before_context_ivars; end
+  def self.superclass_metadata; end
+  def self.top_level?; end
+  def self.top_level_description; end
+  def self.traverse_tree_until(&block); end
+  def self.update_inherited_metadata(updates); end
+  def self.with_replaced_metadata(meta); end
+  def self.xcontext(*args, &example_group_block); end
+  def self.xdescribe(*args, &example_group_block); end
+  def self.xexample(*all_args, &block); end
+  def self.xit(*all_args, &block); end
+  def self.xspecify(*all_args, &block); end
+  extend RSpec::Core::Hooks
+  extend RSpec::Core::MemoizedHelpers::ClassMethods
+  extend RSpec::Core::SharedExampleGroup
+  include RSpec::Core::MemoizedHelpers
+  include RSpec::Core::Pending
+end
+class RSpec::Core::ExampleGroup::WrongScopeError < NoMethodError
+end
+class RSpec::Core::AnonymousExampleGroup < RSpec::Core::ExampleGroup
+  def self.metadata; end
+end
+class RSpec::Core::SharedExampleGroupInclusionStackFrame
+  def description; end
+  def formatted_inclusion_location; end
+  def inclusion_location; end
+  def initialize(shared_group_name, inclusion_location); end
+  def self.current_backtrace; end
+  def self.shared_example_group_inclusions; end
+  def self.with_frame(name, location); end
+  def shared_group_name; end
+end
+module RSpec::ExampleGroups
+  def self.assign_const(group); end
+  def self.base_name_for(group); end
+  def self.constant_scope_for(group); end
+  def self.disambiguate(name, const_scope); end
+  def self.remove_all_constants; end
+  extend RSpec::Support::RecursiveConstMethods
+end
+module RSpec::Support
+  def self.require_rspec_core(f); end
+end
+class RSpec::Core::Time
+  def self.now; end
+end
+class Module
+end
+module RSpec::Core::SharedContext
+  def __shared_context_recordings; end
+  def after(*args, &block); end
+  def append_after(*args, &block); end
+  def append_before(*args, &block); end
+  def around(*args, &block); end
+  def before(*args, &block); end
+  def context(*args, &block); end
+  def describe(*args, &block); end
+  def hooks(*args, &block); end
+  def included(group); end
+  def let!(*args, &block); end
+  def let(*args, &block); end
+  def prepend_after(*args, &block); end
+  def prepend_before(*args, &block); end
+  def self.record(methods); end
+  def subject!(*args, &block); end
+  def subject(*args, &block); end
+end
+class RSpec::Core::SharedContext::Recording < Struct
+  def args; end
+  def args=(_); end
+  def block; end
+  def block=(_); end
+  def method_name; end
+  def method_name=(_); end
+  def playback_onto(group); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::ExampleStatusPersister
+  def dump_statuses(unparsed_previous_runs); end
+  def initialize(examples, file_name); end
+  def persist; end
+  def self.load_from(file_name); end
+  def self.persist(examples, file_name); end
+  def statuses_from_this_run; end
+end
+class RSpec::Core::ExampleStatusMerger
+  def delete_previous_examples_that_no_longer_exist; end
+  def example_must_no_longer_exist?(ex_id); end
+  def hash_from(example_list); end
+  def initialize(this_run, from_previous_runs); end
+  def loaded_spec_files; end
+  def merge; end
+  def self.merge(this_run, from_previous_runs); end
+  def sort_value_from(example); end
+  def spec_file_from(ex_id); end
+end
+class RSpec::Core::ExampleStatusDumper
+  def column_widths; end
+  def dump; end
+  def formatted_header_rows; end
+  def formatted_row_from(row_values); end
+  def formatted_value_rows; end
+  def headers; end
+  def initialize(examples); end
+  def rows; end
+  def self.dump(examples); end
+end
+class RSpec::Core::ExampleStatusParser
+  def headers; end
+  def initialize(string); end
+  def parse; end
+  def parse_row(line); end
+  def self.parse(string); end
+  def split_line(line); end
+end
+class RSpec::Core::Profiler
+  def example_group_finished(notification); end
+  def example_group_started(notification); end
+  def example_groups; end
+  def example_started(notification); end
+  def initialize; end
+end
+class RSpec::Core::DidYouMean
+  def call; end
+  def formats(probables); end
+  def initialize(relative_file_name); end
+  def red_font(mytext); end
+  def relative_file_name; end
+  def top_and_tail(rspec_format); end
+end
+class RSpec::Core::Formatters::BaseFormatter
+  def close(_notification); end
+  def example_group; end
+  def example_group=(arg0); end
+  def example_group_started(notification); end
+  def initialize(output); end
+  def output; end
+  def output_supports_sync; end
+  def restore_sync_output; end
+  def start(notification); end
+  def start_sync_output; end
+end
+class RSpec::Core::Formatters::BaseTextFormatter < RSpec::Core::Formatters::BaseFormatter
+  def close(_notification); end
+  def dump_failures(notification); end
+  def dump_pending(notification); end
+  def dump_summary(summary); end
+  def message(notification); end
+  def seed(notification); end
+end
+class RSpec::Core::Formatters::DocumentationFormatter < RSpec::Core::Formatters::BaseTextFormatter
+  def current_indentation(offset = nil); end
+  def example_failed(failure); end
+  def example_group_finished(_notification); end
+  def example_group_started(notification); end
+  def example_passed(passed); end
+  def example_pending(pending); end
+  def example_started(_notification); end
+  def failure_output(example); end
+  def flush_messages; end
+  def initialize(output); end
+  def message(notification); end
+  def next_failure_index; end
+  def passed_output(example); end
+  def pending_output(example, message); end
+end
+class RSpec::Core::Formatters::HtmlPrinter
+  def flush; end
+  def indentation_style(number_of_parents); end
+  def initialize(output); end
+  def make_example_group_header_red(group_id); end
+  def make_example_group_header_yellow(group_id); end
+  def make_header_red; end
+  def make_header_yellow; end
+  def move_progress(percent_done); end
+  def print_example_failed(pending_fixed, description, run_time, failure_id, exception, extra_content); end
+  def print_example_group_end; end
+  def print_example_group_start(group_id, description, number_of_parents); end
+  def print_example_passed(description, run_time); end
+  def print_example_pending(description, pending_message); end
+  def print_html_start; end
+  def print_summary(duration, example_count, failure_count, pending_count); end
+  include ERB::Util
+end
+class RSpec::Core::Formatters::HtmlFormatter < RSpec::Core::Formatters::BaseFormatter
+  def dump_summary(summary); end
+  def example_failed(failure); end
+  def example_group_number; end
+  def example_group_started(notification); end
+  def example_number; end
+  def example_passed(passed); end
+  def example_pending(pending); end
+  def example_started(_notification); end
+  def extra_failure_content(failure); end
+  def initialize(output); end
+  def percent_done; end
+  def start(notification); end
+  def start_dump(_notification); end
+end
+class RSpec::Core::Formatters::FallbackMessageFormatter
+  def initialize(output); end
+  def message(notification); end
+  def output; end
+end
+class RSpec::Core::Formatters::ProgressFormatter < RSpec::Core::Formatters::BaseTextFormatter
+  def example_failed(_notification); end
+  def example_passed(_notification); end
+  def example_pending(_notification); end
+  def start_dump(_notification); end
+end
+class RSpec::Core::Formatters::ProfileFormatter
+  def bold(text); end
+  def dump_profile(profile); end
+  def dump_profile_slowest_example_groups(profile); end
+  def dump_profile_slowest_examples(profile); end
+  def format_caller(caller_info); end
+  def initialize(output); end
+  def output; end
+end
+class RSpec::Core::Formatters::JsonFormatter < RSpec::Core::Formatters::BaseFormatter
+  def close(_notification); end
+  def dump_profile(profile); end
+  def dump_profile_slowest_example_groups(profile); end
+  def dump_profile_slowest_examples(profile); end
+  def dump_summary(summary); end
+  def format_example(example); end
+  def initialize(output); end
+  def message(notification); end
+  def output_hash; end
+  def seed(notification); end
+  def stop(notification); end
+end
+module RSpec::Core::Bisect
+end
+class RSpec::Core::Bisect::ExampleSetDescriptor < Struct
+  def all_example_ids; end
+  def all_example_ids=(_); end
+  def failed_example_ids; end
+  def failed_example_ids=(_); end
+  def self.[](*arg0); end
+  def self.inspect; end
+  def self.members; end
+  def self.new(*arg0); end
+end
+class RSpec::Core::Bisect::BisectFailedError < StandardError
+  def self.for_failed_spec_run(spec_output); end
+end
+class RSpec::Core::Bisect::Notifier
+  def initialize(formatter); end
+  def publish(event, *args); end
+end
+class RSpec::Core::Bisect::Channel
+  def close; end
+  def initialize; end
+  def receive; end
+  def send(message); end
+end
+class RSpec::Core::Formatters::BaseBisectFormatter
+  def example_failed(notification); end
+  def example_finished(notification); end
+  def initialize(expected_failures); end
+  def self.inherited(formatter); end
+  def start_dump(_notification); end
+end
+class RSpec::Core::Formatters::BisectDRbFormatter < RSpec::Core::Formatters::BaseBisectFormatter
+  def initialize(_output); end
+  def notify_results(results); end
+end
+class RSpec::Core::Formatters::FailureListFormatter < RSpec::Core::Formatters::BaseFormatter
+  def dump_profile(_profile); end
+  def example_failed(failure); end
+  def message(_message); end
+end
+module RSpec::Core::MockingAdapters
+end
+module RSpec::Core::MockingAdapters::RSpec
+  def self.configuration; end
+  def self.framework_name; end
+  def setup_mocks_for_rspec; end
+  def teardown_mocks_for_rspec; end
+  def verify_mocks_for_rspec; end
+  include RSpec::Mocks::ExampleMethods
+  include RSpec::Mocks::ExampleMethods::ExpectHost
+end
+class RSpec::Core::RakeTask < ::Rake::TaskLib
+  include ::Rake::DSL
+  include RSpec::Core::ShellEscape
+  def initialize(*args, &task_block); end
+end
diff --git a/sorbet/rbi/todo.rbi b/sorbet/rbi/todo.rbi
new file mode 100644
index 0000000..eb9682a
--- /dev/null
+++ b/sorbet/rbi/todo.rbi
@@ -0,0 +1,9 @@
+# This file is autogenerated. Do not edit it by hand. Regenerate it with:
+#   srb rbi todo
+
+# typed: strong
+module ::Ascii85Native; end
+module ::Memprof; end
+module ::PerfTools::CpuProfiler; end
+module T::Private::Methods::MethodHooks; end
+module T::Private::Methods::SingletonMethodHooks; end
diff --git a/spec/buffer_spec.rb b/spec/buffer_spec.rb
index 46b2f5c..9e730ef 100644
--- a/spec/buffer_spec.rb
+++ b/spec/buffer_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::Buffer, "token method" do
@@ -211,6 +212,15 @@ describe PDF::Reader::Buffer, "token method" do
     end
   end
 
+  context "string with an escaped, unbalanced right param correctly" do
+    it "tokenises correctly" do
+      buf = parse_string("(James Code Monkey\\))")
+      expect(buf.token).to eql("(")
+      expect(buf.token).to eql("James Code Monkey\\)")
+      expect(buf.token).to eql(")")
+    end
+  end
+
   context "indirect reference" do
     it "tokenises correctly" do
       buf = parse_string("aaa 1 0 R bbb")
@@ -478,6 +488,19 @@ describe PDF::Reader::Buffer, "token method" do
     end
   end
 
+  context "inline image without a trailing 'EI'" do
+    context "inside a content stream" do
+      it "tokenises correctly" do
+        io = StringIO.new(binary_string("BI ID aaa bbb ccc \xF0\xF0\xF0"))
+        buf = PDF::Reader::Buffer.new(io, :content_stream => true)
+        expect(buf.pos).to eql(0)
+        expect {
+          buf.token
+        }.to raise_error(PDF::Reader::MalformedPDFError, "EI terminator not found")
+      end
+    end
+  end
+
   context "dict that has ID as a key" do
     it "tokenises correctly" do
       io = StringIO.new("<</ID /S1 >> BDC")
@@ -662,7 +685,12 @@ describe PDF::Reader::Buffer, "read method" do
 
   context "with a multi-line buffer (three \\n)" do
     context "without :skip_eol" do
-      it "returns raw data from the underlying IO"
+      it "returns raw data from the underlying IO" do
+        buf = parse_string("stream\n\n\nbbb")
+
+        expect(buf.token).to eql("stream")
+        expect(buf.read(5)).to eql("\n\nbbb")
+      end
     end
     context "with :skip_eol" do
       it "returns raw data from the underlying IO" do
@@ -676,7 +704,12 @@ describe PDF::Reader::Buffer, "read method" do
 
   context "with a multi-line buffer (\\r\\n)" do
     context "without :skip_eol" do
-      it "returns raw data from the underlying IO"
+      it "returns raw data from the underlying IO" do
+        buf = parse_string("stream\r\nbbb")
+
+        expect(buf.token).to eql("stream")
+        expect(buf.read(4)).to eql("\nbbb")
+      end
     end
     context "with :skip_eol" do
       it "returns raw data from the underlying IO" do
diff --git a/spec/callback_spec.rb b/spec/callback_spec.rb
index f5ed43f..7358edb 100644
--- a/spec/callback_spec.rb
+++ b/spec/callback_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 # These specs are an integration safety net to ensure all of our callbacks provide a consistant
diff --git a/spec/cid_widths_spec.rb b/spec/cid_widths_spec.rb
index 6c5fef9..d06a6be 100644
--- a/spec/cid_widths_spec.rb
+++ b/spec/cid_widths_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::CidWidths, "#initilize" do
diff --git a/spec/cmap_spec.rb b/spec/cmap_spec.rb
index 6e02612..d43aa6c 100644
--- a/spec/cmap_spec.rb
+++ b/spec/cmap_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::CMap do
diff --git a/spec/column_spec.rb b/spec/column_spec.rb
index e4253c4..c67f559 100644
--- a/spec/column_spec.rb
+++ b/spec/column_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader, "column specs" do
@@ -18,8 +19,8 @@ describe PDF::Reader, "column specs" do
         page = reader.page(1)
         ft = page.text
         expect(ft).to match(/ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu/)
-        expect(ft).to match(/Lorem ipsum dolor sit amet, consectetur adipisic -\s+adipisicing elit, sed do eiusmod tempor incididunt/)
-        expect(ft).to match(/ing elit, sed do eiusmod tempor incididunt ut labore\s+ut labore et dolore magna aliqua. Ut enim ad minim/)
+        expect(ft).to match(/Lorem ipsum dolor sit amet, consectetur adipisic-\s+adipisicing elit, sed do eiusmod tempor incididunt/)
+        expect(ft).to match(/ingelit,seddoeiusmodtemporincididuntutlabore\s+utlaboreetdoloremagnaaliqua.Utenimadminim/)
         expect(ft).to match(/et dolore magna aliqua. Ut enim ad minim veniam,\s+veniam, quis nostrud exercitation ullamco laboris/)
         expect(ft).to match(/quis nostrud exercitation ullamco laboris nisi ut\s+nisi ut aliquip ex ea commodo consequat. Duis aute/)
         expect(ft).to match(/aliquip ex ea commodo consequat. Duis aute irure\s+irure dolor in reprehenderit in voluptate velit esse/)
@@ -35,7 +36,7 @@ describe PDF::Reader, "column specs" do
         # The following lines are in the second column, and their position with in the
         # string (from the left) should all be at the same spot
         match_pos_1 = find_position_of_match(ft, /adipisicing elit, sed do eiusmod tempor incididunt$/)
-        match_pos_2 = find_position_of_match(ft, /ut labore et dolore magna aliqua. Ut enim ad minim$/)
+        match_pos_2 = find_position_of_match(ft, /utlaboreetdoloremagnaaliqua.Utenimadminim$/)
         match_pos_3 = find_position_of_match(ft, /veniam, quis nostrud exercitation ullamco laboris$/)
         match_pos_4 = find_position_of_match(ft, /nisi ut aliquip ex ea commodo consequat. Duis aute$/)
         match_pos_5 = find_position_of_match(ft, /irure dolor in reprehenderit in voluptate velit esse$/)
@@ -59,7 +60,7 @@ describe PDF::Reader, "column specs" do
         # The following lines are in the first column of the page prior to the interruption
         col1_1   = find_position_of_match(ft, /^tate velit esse cillum dolore eu/)
         col1_2   = find_position_of_match(ft, /^fugiat nulla pariatur. Excepteur/)
-        col1_3   = find_position_of_match(ft, /^sint occaecat cupidatat non proi -/)
+        col1_3   = find_position_of_match(ft, /^sint occaecat cupidatat non proi-/)
         col1_4   = find_position_of_match(ft, /^dent, sunt in culpa qui officia de-/)
 
         expect(col1_1).not_to be_nil
@@ -77,8 +78,8 @@ describe PDF::Reader, "column specs" do
         # The following lines are in the second column of the page prior to the interruption
         col2_1   = find_position_of_match(ft, /occaecat cupidatat non proident,\s*anim/)
         col2_2   = find_position_of_match(ft, /sunt in culpa qui officia deserunt\s*sum/)
-        col2_3   = find_position_of_match(ft, /mollit anim id est laborum. Lo -\s*adipisicing/)
-        col2_4   = find_position_of_match(ft, /rem ipsum dolor sit amet, con -\s*tempor/)
+        col2_3   = find_position_of_match(ft, /mollit anim id est laborum. Lo-\s*adipisicing/)
+        col2_4   = find_position_of_match(ft, /rem ipsum dolor sit amet, con-\s*tempor/)
 
         expect(col2_1).not_to be_nil
         expect(col2_1).to eql(col2_2)
@@ -94,7 +95,7 @@ describe PDF::Reader, "column specs" do
         ft = reader.page(2).text
 
         # The following lines are in the third column of the page prior to the interruption
-        col3_a_1 = find_position_of_match(ft, /anim id est laborum. Lorem ip -$/)
+        col3_a_1 = find_position_of_match(ft, /anim id est laborum. Lorem ip-$/)
         col3_a_2 = find_position_of_match(ft, /sum dolor sit amet, consectetur$/)
         col3_a_3 = find_position_of_match(ft, /adipisicing elit, sed do eiusmod$/)
         col3_a_4 = find_position_of_match(ft, /tempor incididunt ut labore et$/)
diff --git a/spec/data/TJ_and_char_spacing.pdf b/spec/data/TJ_and_char_spacing.pdf
new file mode 100644
index 0000000..7abcbd3
--- /dev/null
+++ b/spec/data/TJ_and_char_spacing.pdf
@@ -0,0 +1,73 @@
+%PDF-1.7
+%����
+
+1 0 obj
+  <<
+  /Type /Catalog
+  /Pages 2 0 R
+  >>
+endobj
+
+2 0 obj
+  <<
+  /Type /Pages
+  /Kids [3 0 R]
+  /Count 1
+  /MediaBox [0 0 595 842]
+  >>
+endobj
+
+3 0 obj
+  <<
+  /Type /Page
+  /Parent 2 0 R
+  /Resources 
+    <<
+    /Font 
+      <<
+      /F1 
+        <<
+        /Type /Font
+        /Subtype /Type1
+        /BaseFont /Helvetica
+        >>
+      >>
+    >>
+  /Contents 4 0 R
+  >>
+endobj
+
+4 0 obj
+  <<
+  /Length 279
+  >>
+stream
+  BT
+    /F1 18 Tf
+    1 0 0 1 50 800 Tm
+    18 TL
+    -2 Tc -1 Tw
+    (The big brown fox) Tj
+    T*
+    [(T)-108(h)-108(e)-162( )-108(b)-108(i)-108(g)-162( )-108(b)-108(r)-108(o)-108(w)-108(n)-162( )-108(f)-108(o)-108(x)] TJ
+    T*
+    0 Tc 0 Tw
+    (The big brown fox) Tj
+  ET
+endstream
+endobj
+xref
+0 5
+0000000000 65535 f
+0000000016 00000 n
+0000000074 00000 n
+0000000168 00000 n
+0000000405 00000 n
+trailer
+  <<
+  /Root 1 0 R
+  /Size 5
+  >>
+startxref
+740
+%%EOF
\ No newline at end of file
diff --git a/spec/data/content_stream_cr_only.pdf b/spec/data/content_stream_cr_only.pdf
new file mode 100644
index 0000000..f229aad
--- /dev/null
+++ b/spec/data/content_stream_cr_only.pdf
@@ -0,0 +1,63 @@
+%PDF-1.7
+%����
+
+1 0 obj
+  <<
+  /Type /Catalog
+  /Pages 2 0 R
+  >>
+endobj
+
+2 0 obj
+  <<
+  /Type /Pages
+  /Kids [3 0 R]
+  /Count 1
+  /MediaBox [0 0 595 842]
+  >>
+endobj
+
+3 0 obj
+  <<
+  /Type /Page
+  /Parent 2 0 R
+  /Resources 
+    <<
+    /Font 
+      <<
+      /F1 
+        <<
+        /Type /Font
+        /Subtype /Type1
+        /BaseFont /Helvetica
+        >>
+      >>
+    >>
+  /Contents 4 0 R
+  >>
+endobj
+
+4 0 obj
+  <<
+  /Length 77
+  >>
+stream
BT
+    /F1 18 Tf
+    1 0 0 1 55 600 Tm
+    (This is a weird PDF file) Tj
+  ETendstream
endobj
+xref
+0 5
+0000000000 65535 f
+0000000016 00000 n
+0000000074 00000 n
+0000000168 00000 n
+0000000405 00000 n
+trailer
+  <<
+  /Root 1 0 R
+  /Size 5
+  >>
+startxref
+537
+%%EOF
\ No newline at end of file
diff --git a/spec/data/encrypted_and_xref_stream.pdf b/spec/data/encrypted_and_xref_stream.pdf
new file mode 100644
index 0000000..3b02f3b
Binary files /dev/null and b/spec/data/encrypted_and_xref_stream.pdf differ
diff --git a/spec/data/inline_data_followed_by_ei.pdf b/spec/data/inline_data_followed_by_ei.pdf
new file mode 100644
index 0000000..0aa7ce4
--- /dev/null
+++ b/spec/data/inline_data_followed_by_ei.pdf
@@ -0,0 +1,82 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 210
+>>
+stream
+q
+
+BT
+36.0 747.384 Td
+/F1.0 12 Tf
+[<49442066> 30 <6f6c6c6f> 15 <77> 10 <65642062> 20 <79204549206f6e2073616d65206c696e65>] TJ
+ET
+
+ID
+aaaaEIbbbEIcccEI
+
+BT
+36.0 733.512 Td
+/F1.0 12 Tf
+[<5f5f454e445f5f>] TJ
+ET
+
+Q
+
+endstream
+endobj
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612 792]
+/CropBox [0 0 612 792]
+/BleedBox [0 0 612 792]
+/TrimBox [0 0 612 792]
+/ArtBox [0 0 612 792]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+xref
+0 7
+0000000000 65535 f 
+0000000015 00000 n 
+0000000109 00000 n 
+0000000158 00000 n 
+0000000215 00000 n 
+0000000476 00000 n 
+0000000742 00000 n 
+trailer
+<< /Size 7
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+839
+%%EOF
diff --git a/spec/data/broken_string.pdf b/spec/data/invalid/broken_string.pdf
similarity index 100%
rename from spec/data/broken_string.pdf
rename to spec/data/invalid/broken_string.pdf
diff --git a/spec/data/content_stream_refers_to_invalid_font.pdf b/spec/data/invalid/content_stream_refers_to_invalid_font.pdf
similarity index 100%
rename from spec/data/content_stream_refers_to_invalid_font.pdf
rename to spec/data/invalid/content_stream_refers_to_invalid_font.pdf
diff --git a/spec/data/invalid/content_stream_wrong_args.pdf b/spec/data/invalid/content_stream_wrong_args.pdf
new file mode 100644
index 0000000..3186761
Binary files /dev/null and b/spec/data/invalid/content_stream_wrong_args.pdf differ
diff --git a/spec/data/invalid/gh-217.pdf b/spec/data/invalid/gh-217.pdf
new file mode 100644
index 0000000..24bc1de
Binary files /dev/null and b/spec/data/invalid/gh-217.pdf differ
diff --git a/spec/data/invalid/gh-222.pdf b/spec/data/invalid/gh-222.pdf
new file mode 100644
index 0000000..e48f4a3
Binary files /dev/null and b/spec/data/invalid/gh-222.pdf differ
diff --git a/spec/data/invalid/gh-223.pdf b/spec/data/invalid/gh-223.pdf
new file mode 100644
index 0000000..d2f6167
Binary files /dev/null and b/spec/data/invalid/gh-223.pdf differ
diff --git a/spec/data/invalid/gh-224.pdf b/spec/data/invalid/gh-224.pdf
new file mode 100644
index 0000000..318ae4d
Binary files /dev/null and b/spec/data/invalid/gh-224.pdf differ
diff --git a/spec/data/invalid/gh-227.pdf b/spec/data/invalid/gh-227.pdf
new file mode 100644
index 0000000..de02c9a
Binary files /dev/null and b/spec/data/invalid/gh-227.pdf differ
diff --git a/spec/data/invalid/gh-228.pdf b/spec/data/invalid/gh-228.pdf
new file mode 100644
index 0000000..6cf822f
Binary files /dev/null and b/spec/data/invalid/gh-228.pdf differ
diff --git a/spec/data/invalid/gh-229.pdf b/spec/data/invalid/gh-229.pdf
new file mode 100644
index 0000000..a24a576
Binary files /dev/null and b/spec/data/invalid/gh-229.pdf differ
diff --git a/spec/data/invalid/gh-230.pdf b/spec/data/invalid/gh-230.pdf
new file mode 100644
index 0000000..3fdac5a
Binary files /dev/null and b/spec/data/invalid/gh-230.pdf differ
diff --git a/spec/data/invalid/gh-231.pdf b/spec/data/invalid/gh-231.pdf
new file mode 100644
index 0000000..f44ab5c
Binary files /dev/null and b/spec/data/invalid/gh-231.pdf differ
diff --git a/spec/data/invalid/gh-232.pdf b/spec/data/invalid/gh-232.pdf
new file mode 100644
index 0000000..edd8218
Binary files /dev/null and b/spec/data/invalid/gh-232.pdf differ
diff --git a/spec/data/invalid/gh-234.pdf b/spec/data/invalid/gh-234.pdf
new file mode 100644
index 0000000..962c621
Binary files /dev/null and b/spec/data/invalid/gh-234.pdf differ
diff --git a/spec/data/invalid/gh-235.pdf b/spec/data/invalid/gh-235.pdf
new file mode 100644
index 0000000..2365806
Binary files /dev/null and b/spec/data/invalid/gh-235.pdf differ
diff --git a/spec/data/invalid/gh-236.pdf b/spec/data/invalid/gh-236.pdf
new file mode 100644
index 0000000..f52fa3a
Binary files /dev/null and b/spec/data/invalid/gh-236.pdf differ
diff --git a/spec/data/invalid/gh-237.pdf b/spec/data/invalid/gh-237.pdf
new file mode 100644
index 0000000..db1460f
Binary files /dev/null and b/spec/data/invalid/gh-237.pdf differ
diff --git a/spec/data/invalid/gh-238.pdf b/spec/data/invalid/gh-238.pdf
new file mode 100644
index 0000000..5ace8e7
Binary files /dev/null and b/spec/data/invalid/gh-238.pdf differ
diff --git a/spec/data/invalid/gh-239.pdf b/spec/data/invalid/gh-239.pdf
new file mode 100644
index 0000000..7ed4c96
Binary files /dev/null and b/spec/data/invalid/gh-239.pdf differ
diff --git a/spec/data/invalid/gh-240.pdf b/spec/data/invalid/gh-240.pdf
new file mode 100644
index 0000000..244efd2
Binary files /dev/null and b/spec/data/invalid/gh-240.pdf differ
diff --git a/spec/data/invalid/gh-241.pdf b/spec/data/invalid/gh-241.pdf
new file mode 100644
index 0000000..8e04b16
Binary files /dev/null and b/spec/data/invalid/gh-241.pdf differ
diff --git a/spec/data/invalid/gh-242.pdf b/spec/data/invalid/gh-242.pdf
new file mode 100644
index 0000000..d7e1c1f
Binary files /dev/null and b/spec/data/invalid/gh-242.pdf differ
diff --git a/spec/data/invalid/gh-243.pdf b/spec/data/invalid/gh-243.pdf
new file mode 100644
index 0000000..3de1c4f
--- /dev/null
+++ b/spec/data/invalid/gh-243.pdf
@@ -0,0 +1,88 @@
+%PDF-1.3
+%âãÏÓ
+
+1 0 obj
+<< /Type /Catalog
+/Outlines 2 0 R
+/Pages 3 0 R>>
+endobj
+2 0 obj
+<< /Type /Outlines >>
+endobj
+3 0 obj
+<< /Type /Pages
+/Kids [6 0 R
+]
+/Count 1
+/Resources <<
+/ProcSet 4 0 R
+/Font << 
+/F1 9 0 R >>
+>>
+/MediaBox [0 0 595.28 841.89]
+ >>endobj
+4 0 obj
+[/PDF /Text ]
+endobj
+5 0 obj
+<<
+/CreationDate (D:200805060928)
+/Creator (brazil.rb)
+/Producer (PDF::Writer for Ruby)
+>>
+endobj
+6 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/Contents 7 0 R
+>>
+endobj
+7 0 obj
+<<
+/Length 94 >>
+stream
+
+0.000 0�000 0.000 rg
+0.000 0.000 0.000 RG
+BT 36.000 794.730 Td /F1 �0.0 Tf 0 Tr (Goi�s) Tj ET
+endstream
+endobj
+
+8 0 obj
+<< /Type /Encoding
+/BaseEncoding /WinAnsiEncoding
+/Differences 
+[
+240  /aacute
+]
+>>
+endobj
+9 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F1
+/BaseFont /Times-Roman
+/Encoding 8 0 R
+>>
+endobj
+xref
+0 10
+0000000000 65535 f 
+0000000019 00000 n 
+0000000083 00000 n 
+0000000120 00000 n 
+0000000264 00000 n 
+0000000293 00000 n 
+0000000399 00000 n 
+0000000462 00000 n 
+0000000607 00000 n 
+0000000706 00000 n 
+
+trailer
+  << /Size 10
+     /Root 1 0 R
+ /Info 5 0 R
+  >>
+startxref
+804
+%%EOF
diff --git a/spec/data/invalid/gh-244.pdf b/spec/data/invalid/gh-244.pdf
new file mode 100644
index 0000000..196483d
--- /dev/null
+++ b/spec/data/invalid/gh-244.pdf
@@ -0,0 +1,89 @@
+%PDF-1.3
+%âãÏÓ
+
+1 0 obj
+<< /Type /Catalog
+/Outlines 2 0 R
+/Pages 3 0 R>>
+endobj
+2 0 obj
+<< /Type /Outlines >>
+endobj
+3 0 obj
+<< /Type /Pages
+/Kids [6 0 R
+]
+/Count 1
+/Resources <<
+/ProcSet 4 0 R
+/Font << 
+/F1 9 0 R >>
+>>
+/MediaBox [0 0 595.28 841.89]
+ >>
+endobj
+4 0 obj
+[/PDF /Text ]
+endobj
+5 0 obj
+<<
+/CreationDate (D:200805060928)
+/Creator (brazil.rb)
+/Producer (PDF::Writer for Ruby)
+>>
+endobj
+6 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/Contents 7 0 R
+>>
+endobj
+7 0 obj
+<<
+/Length 94 >>
+stream
+
+0.000 0.000 0.000 rg
+0.000 0.000 0.0�0 RG
+BT 36.000 794.730 Td /F1 10.0 Tf 0 Tr (Goi�s) Tj ET
+endstream
+endobj
+
+8 0 obj
+<< /Type /Encoding
+/BaseEncoding /WinAnsiEncoding
+/Differvnces 
+[
+240  /aacute
+]
+>>
+endobj
+9 0 obj
+<< /Type /Font
+/Subtype /Type1
+/NamD /F1
+/B$seFont /Times-Roman
+/Encoding 8 0 R
+>>
+endobj
+xref
+0 10
+0000000000 65535 f 
+0000000019 00000 n 
+0�00000083 00000 n 
+0000000120 00000 n 
+0000000264 00000 n 
+0000000293 00000 n 
+0000000399 00000 n 
+0000000462 00000 n 
+0000000607 00000 n 
+0000000706 00000 n 
+
+trailer
+  << /Size 10
+     /Root 1 0 R
+ /Info 5 0 R
+  >>
+startxref
+804
+%%EOF
diff --git a/spec/data/invalid/gh-245.pdf b/spec/data/invalid/gh-245.pdf
new file mode 100644
index 0000000..d2f378a
Binary files /dev/null and b/spec/data/invalid/gh-245.pdf differ
diff --git a/spec/data/invalid/negative-xref-offset.pdf b/spec/data/invalid/negative-xref-offset.pdf
new file mode 100644
index 0000000..28ba1f7
Binary files /dev/null and b/spec/data/invalid/negative-xref-offset.pdf differ
diff --git a/spec/data/invalid/stream_missing_endobj.pdf b/spec/data/invalid/stream_missing_endobj.pdf
new file mode 100644
index 0000000..28a964d
--- /dev/null
+++ b/spec/data/invalid/stream_missing_endobj.pdf
@@ -0,0 +1,73 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 160
+>>
+stream
+q
+
+BT
+36.0 747.384 Td
+/F1.0 12 Tf
+[<4f626a65637420342028636f6e74656e742073747265616d29206973206d697373696e672074686520656e646f626a20746f6b> 20 <656e>] TJ
+ET
+
+Q
+
+endstream
+
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612 792]
+/CropBox [0 0 612 792]
+/BleedBox [0 0 612 792]
+/TrimBox [0 0 612 792]
+/ArtBox [0 0 612 792]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+xref
+0 7
+0000000000 65535 f 
+0000000015 00000 n 
+0000000109 00000 n 
+0000000158 00000 n 
+0000000215 00000 n 
+0000000420 00000 n 
+0000000686 00000 n 
+trailer
+<< /Size 7
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+783
+%%EOF
diff --git a/spec/data/invalid/xref_offset_too_low.pdf b/spec/data/invalid/xref_offset_too_low.pdf
new file mode 100644
index 0000000..930313d
--- /dev/null
+++ b/spec/data/invalid/xref_offset_too_low.pdf
@@ -0,0 +1,73 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 210
+>>
+stream
+q
+
+BT
+36.0 747.384 Td
+/F1.0 12 Tf
+[<5468652078726566206f66667365742066> 30 <6f722074686520726f6f74206f626a65637420286f626a20322920697320612066> 30 <65> 20 <772062> 20 <7974657320746f6f206c6f> 15 <77>] TJ
+ET
+
+Q
+
+endstream
+endobj
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612 792]
+/CropBox [0 0 612 792]
+/BleedBox [0 0 612 792]
+/TrimBox [0 0 612 792]
+/ArtBox [0 0 612 792]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+xref
+0 7
+0000000000 65535 f 
+0000000015 00000 n 
+0000000106 00000 n 
+0000000158 00000 n 
+0000000215 00000 n 
+0000000476 00000 n 
+0000000742 00000 n 
+trailer
+<< /Size 7
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+839
+%%EOF
diff --git a/spec/data/minimal-xref-1.pdf b/spec/data/minimal-xref-1.pdf
new file mode 100644
index 0000000..4e8ba49
--- /dev/null
+++ b/spec/data/minimal-xref-1.pdf
@@ -0,0 +1,58 @@
+%PDF-1.1
+%¥±ë
+
+1 0 obj
+  << /Type /Catalog
+     /Pages 2 0 R
+  >>
+endobj
+
+2 0 obj
+  << /Type /Pages
+     /Kids [3 0 R]
+     /Count 1
+     /MediaBox [0 0 300 144]
+  >>
+endobj
+
+3 0 obj
+  <<  /Type /Page
+      /Parent 2 0 R
+      /Resources
+       << /Font
+           << /F1
+               << /Type /Font
+                  /Subtype /Type1
+                  /BaseFont /Times-Roman
+               >>
+           >>
+       >>
+      /Contents 4 0 R
+  >>
+endobj
+
+4 0 obj
+  << /Length 55 >>
+stream
+  BT
+    /F1 18 Tf
+    0 0 Td
+    (Hello World) Tj
+  ET
+endstream
+endobj
+
+xref
+1 5
+0000000000 65535 f 
+0000000018 00000 n 
+0000000077 00000 n 
+0000000178 00000 n 
+0000000457 00000 n 
+trailer
+  <<  /Root 1 0 R
+      /Size 5
+  >>
+startxref
+565
+%%EOF
diff --git a/spec/data/octal101.pdf b/spec/data/octal101.pdf
new file mode 100644
index 0000000..c321780
--- /dev/null
+++ b/spec/data/octal101.pdf
@@ -0,0 +1,58 @@
+%PDF-1.1
+%¥±ë
+
+1 0 obj
+  << /Type /Catalog
+     /Pages 2 0 R
+  >>
+endobj
+
+2 0 obj
+  << /Type /Pages
+     /Kids [3 0 R]
+     /Count 1
+     /MediaBox [0 0 300 144]
+  >>
+endobj
+
+3 0 obj
+  <<  /Type /Page
+      /Parent 2 0 R
+      /Resources
+       << /Font
+           << /F1
+               << /Type /Font
+                  /Subtype /Type1
+                  /BaseFont /Times-Roman
+               >>
+           >>
+       >>
+      /Contents 4 0 R
+  >>
+endobj
+
+4 0 obj
+  << /Length 55 >>
+stream
+  BT
+    /F1 18 Tf
+    0 0 Td
+    (\101 ]\501[) Tj
+  ET
+endstream
+endobj
+
+xref
+0 5
+0000000000 65535 f 
+0000000018 00000 n 
+0000000077 00000 n 
+0000000178 00000 n 
+0000000457 00000 n 
+trailer
+  <<  /Root 1 0 R
+      /Size 5
+  >>
+startxref
+565
+%%EOF
diff --git a/spec/data/octal74.pdf b/spec/data/octal74.pdf
new file mode 100644
index 0000000..39b1fbe
--- /dev/null
+++ b/spec/data/octal74.pdf
@@ -0,0 +1,58 @@
+%PDF-1.1
+%¥±ë
+
+1 0 obj
+  << /Type /Catalog
+     /Pages 2 0 R
+  >>
+endobj
+
+2 0 obj
+  << /Type /Pages
+     /Kids [3 0 R]
+     /Count 1
+     /MediaBox [0 0 300 144]
+  >>
+endobj
+
+3 0 obj
+  <<  /Type /Page
+      /Parent 2 0 R
+      /Resources
+       << /Font
+           << /F1
+               << /Type /Font
+                  /Subtype /Type1
+                  /BaseFont /Times-Roman
+               >>
+           >>
+       >>
+      /Contents 4 0 R
+  >>
+endobj
+
+4 0 obj
+  << /Length 55 >>
+stream
+  BT
+    /F1 18 Tf
+    0 0 Td
+    (\74  ]\748[) Tj
+  ET
+endstream
+endobj
+
+xref
+0 5
+0000000000 65535 f 
+0000000018 00000 n 
+0000000077 00000 n 
+0000000178 00000 n 
+0000000457 00000 n 
+trailer
+  <<  /Root 1 0 R
+      /Size 5
+  >>
+startxref
+565
+%%EOF
diff --git a/spec/data/prev0.pdf b/spec/data/prev0.pdf
new file mode 100644
index 0000000..3cc7575
--- /dev/null
+++ b/spec/data/prev0.pdf
@@ -0,0 +1,60 @@
+%PDF-1.1
+%¥±ë
+
+1 0 obj
+  << /Type /Catalog
+     /Pages 2 0 R
+  >>
+endobj
+
+2 0 obj
+  << /Type /Pages
+     /Kids [3 0 R]
+     /Count 1
+     /MediaBox [0 0 300 144]
+  >>
+endobj
+
+3 0 obj
+  <<  /Type /Page
+      /Parent 2 0 R
+      /Resources
+       << /Font
+           << /F1
+               << /Type /Font
+                  /Subtype /Type1
+                  /BaseFont /Times-Roman
+               >>
+           >>
+       >>
+      /Contents 4 0 R
+  >>
+endobj
+
+4 0 obj
+  << /Length 55 >>
+stream
+  BT
+    /F1 18 Tf
+    0 0 Td
+    (aaaa\
+ bbbb) Tj
+  ET
+endstream
+endobj
+
+xref
+0 5
+0000000000 65535 f 
+0000000018 00000 n 
+0000000077 00000 n 
+0000000178 00000 n 
+0000000457 00000 n 
+trailer
+  <<  /Root 1 0 R
+      /Size 5
+      /Prev 0
+  >>
+startxref
+565
+%%EOF
diff --git a/spec/data/rotate-270-then-undo-inside-bt.pdf b/spec/data/rotate-270-then-undo-inside-bt.pdf
new file mode 100644
index 0000000..5e4a769
--- /dev/null
+++ b/spec/data/rotate-270-then-undo-inside-bt.pdf
@@ -0,0 +1,84 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 205
+>>
+stream
+q
+BT
+2 Tr
+0 0 0 rg
+0 -1 1 0 534.5 320.2 Tm
+/F1.0 12 Tf
+[<>] TJ
+ET
+
+
+BT
+2 Tr
+0 0 0 rg
+0 -1 1 0 534.5 320.2 Tm
+/F1.0 12 Tf
+[<54686973207061676520697320726f74617465642032373020646567> 10 <72656573>] TJ
+ET
+
+Q
+
+endstream
+endobj
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/Rotate 270
+/MediaBox [0 0 841.89 595.28]
+/CropBox [0 0 841.89 595.28]
+/BleedBox [0 0 841.89 595.28]
+/TrimBox [0 0 841.89 595.28]
+/ArtBox [0 0 841.89 595.28]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+xref
+0 7
+0000000000 65535 f 
+0000000015 00000 n 
+0000000109 00000 n 
+0000000158 00000 n 
+0000000215 00000 n 
+0000000471 00000 n 
+0000000779 00000 n 
+trailer
+<< /Size 7
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+876
+%%EOF
diff --git a/spec/data/rotate-90-then-undo-with-br-text.pdf b/spec/data/rotate-90-then-undo-with-br-text.pdf
new file mode 100644
index 0000000..8e82505
--- /dev/null
+++ b/spec/data/rotate-90-then-undo-with-br-text.pdf
@@ -0,0 +1,96 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 347
+>>
+stream
+0 1 -1 0 595 0 cm
+q
+BT
+36 559 Td
+ET
+Q
+2 J
+1 0 0 1 0 0 cm
+BT
+1 0 0 1 50.99 71.59 Tm
+/F1.0 12 Tf
+0 0 0 rg
+(This PDF has Rotate:90 in the page)Tj
+0 g
+1 0 0 1 350.99 71.59 Tm
+0 0 0 rg
+(metadata to get a landscape layout)Tj
+0 g
+1 0 0 1 650.99 71.59 Tm
+0 0 0 rg
+(and text in bottom right quadrant)Tj
+0 g
+ET
+
+BT
+36.0 797.384 Td
+/F1.0 12 Tf
+[<>] TJ
+ET
+
+Q
+
+endstream
+endobj
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 595 842]
+/Rotate 90
+/CropBox [0 0 595 842]
+/BleedBox [0 0 595 842]
+/TrimBox [0 0 595 842]
+/ArtBox [0 0 595 842]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+xref
+0 7
+0000000000 65535 f 
+0000000015 00000 n 
+0000000109 00000 n 
+0000000158 00000 n 
+0000000215 00000 n 
+0000000613 00000 n 
+0000000890 00000 n 
+trailer
+<< /Size 7
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+987
+%%EOF
diff --git a/spec/data/rotate-90-then-undo.pdf b/spec/data/rotate-90-then-undo.pdf
new file mode 100644
index 0000000..a6f5d5e
--- /dev/null
+++ b/spec/data/rotate-90-then-undo.pdf
@@ -0,0 +1,96 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 397
+>>
+stream
+0 1 -1 0 595 0 cm
+q
+BT
+36 559 Td
+ET
+Q
+2 J
+1 0 0 1 0 0 cm
+BT
+1 0 0 1 273.99 549.51 Tm
+/F1.0 12 Tf
+0 0 0 rg
+(1: This PDF has Rotate:90 in the page metadata)Tj
+0 g
+1 0 0 1 273.99 535.55 Tm
+0 0 0 rg
+(2: to get a landscape layout, and then uses matrix)Tj
+0 g
+1 0 0 1 273.99 521.59 Tm
+0 0 0 rg
+(3: transformation to rotate the text back to normal)Tj
+0 g
+ET
+
+BT
+36.0 797.384 Td
+/F1.0 12 Tf
+[<>] TJ
+ET
+
+Q
+
+endstream
+endobj
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 595 842]
+/Rotate 90
+/CropBox [0 0 595 842]
+/BleedBox [0 0 595 842]
+/TrimBox [0 0 595 842]
+/ArtBox [0 0 595 842]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+xref
+0 7
+0000000000 65535 f 
+0000000015 00000 n 
+0000000109 00000 n 
+0000000158 00000 n 
+0000000215 00000 n 
+0000000663 00000 n 
+0000000940 00000 n 
+trailer
+<< /Size 7
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+1037
+%%EOF
diff --git a/spec/data/stream-with-extra-byte.z b/spec/data/stream-with-extra-byte.z
new file mode 100644
index 0000000..be42489
Binary files /dev/null and b/spec/data/stream-with-extra-byte.z differ
diff --git a/spec/data/stream-with-indirect-filters.pdf b/spec/data/stream-with-indirect-filters.pdf
new file mode 100644
index 0000000..38c3447
--- /dev/null
+++ b/spec/data/stream-with-indirect-filters.pdf
@@ -0,0 +1,73 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 7 0 R
+/Filter 8 0 R
+>>
+stream
+x�5���0Dw���$vrn��lH�����/�T,���w�!:7RL��ؤs������۠�ZfTIPt+�1%�:"�e��bcM�b���b�*�o������?X����\w	��S�C����c۞�ntiDw�|�*�
+endstream
+endobj
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612 792]
+/CropBox [0 0 612 792]
+/BleedBox [0 0 612 792]
+/TrimBox [0 0 612 792]
+/ArtBox [0 0 612 792]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+7 0 obj
+140
+endobj
+8 0 obj
+[/FlateDecode]
+endobj
+xref
+0 9
+0000000000 65535 f 
+0000000015 00000 n 
+0000000109 00000 n 
+0000000158 00000 n 
+0000000215 00000 n 
+0000000422 00000 n 
+0000000688 00000 n 
+0000000785 00000 n 
+0000000804 00000 n 
+trailer
+<< /Size 9
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+834
+%%EOF
diff --git a/spec/data/text_outside_cropbox_and_mediabox.pdf b/spec/data/text_outside_cropbox_and_mediabox.pdf
new file mode 100644
index 0000000..e91c9bf
--- /dev/null
+++ b/spec/data/text_outside_cropbox_and_mediabox.pdf
@@ -0,0 +1,101 @@
+%PDF-1.3
+%����
+1 0 obj
+<< /Creator <feff0050007200610077006e>
+/Producer <feff0050007200610077006e>
+>>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 3 0 R
+>>
+endobj
+3 0 obj
+<< /Type /Pages
+/Count 1
+/Kids [5 0 R]
+>>
+endobj
+4 0 obj
+<< /Length 539
+>>
+stream
+q
+
+BT
+136.0 527.384 Td
+/F1.0 12 Tf
+[<54686973207465> 30 <787420697320696e73696465207468652043726f70426f> 30 <78>] TJ
+ET
+
+
+BT
+136.0 497.384 Td
+/F1.0 12 Tf
+[<5468657265206973206164646974696f6e616c207465> 30 <7874206f757473696465>] TJ
+ET
+
+
+BT
+136.0 467.384 Td
+/F1.0 12 Tf
+[<7468652043726f70426f> 30 <7820616e64204d65646961426f> 30 <78>] TJ
+ET
+
+
+BT
+41.0 41.0 Td
+/F1.0 12 Tf
+[<42657477> 10 <65656e2043726f70426f> 30 <7820616e64204d65646961426f> 30 <78>] TJ
+ET
+
+
+BT
+736.0 836.0 Td
+/F1.0 12 Tf
+[<4f757473696465204d65646961426f> 30 <78>] TJ
+ET
+
+Q
+
+endstream
+endobj
+5 0 obj
+<< /Type /Page
+/Parent 3 0 R
+/MediaBox [0 0 612 792]
+/CropBox [100 100 412 592]
+/BleedBox [0 0 612 792]
+/TrimBox [0 0 612 792]
+/ArtBox [0 0 612 792]
+/Contents 4 0 R
+/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
+/Font << /F1.0 6 0 R
+>>
+>>
+>>
+endobj
+6 0 obj
+<< /Type /Font
+/Subtype /Type1
+/BaseFont /Helvetica
+/Encoding /WinAnsiEncoding
+>>
+endobj
+xref
+0 7
+0000000000 65535 f 
+0000000015 00000 n 
+0000000109 00000 n 
+0000000158 00000 n 
+0000000215 00000 n 
+0000000805 00000 n 
+0000001075 00000 n 
+trailer
+<< /Size 7
+/Root 2 0 R
+/Info 1 0 R
+>>
+startxref
+1172
+%%EOF
diff --git a/spec/data/textwrapcr.pdf b/spec/data/textwrapcr.pdf
new file mode 100644
index 0000000..a6d2db1
--- /dev/null
+++ b/spec/data/textwrapcr.pdf
@@ -0,0 +1 @@
+%PDF-1.1
%¥±ë

1 0 obj
  << /Type /Catalog
     /Pages 2 0 R
  >>
endobj

2 0 obj
  << /Type /Pages
     /Kids [3 0 R]
     /Count 1
     /MediaBox [0 0 300 144]
  >>
endobj

3 0 obj
  <<  /Type /Page
      /Parent 2 0 R
      /Resources
       << /Font
           << /F1
               << /Type /Font
                  /Subtype /Type1
                  /BaseFont /Times-Roman
               >>
           >>
       >>
      /Contents 4 0 R
  >>
endobj

4 0 obj
  << /Length 55 >>
stream
  BT
    /F1 18 Tf
    0 0 Td
    (aaaa\
 bbbb) Tj
  ET
endstream
endobj

xref
0 5
0000000000 65535 f 
0000000018 00000 n 
0000000077 00000 n 
0000000178 00000 n 
0000000457 00000 n 
trailer
  <<  /Root 1 0 R
      /Size 5
  >>
startxref
565
%%EOF
\ No newline at end of file
diff --git a/spec/data/textwrapcrlf.pdf b/spec/data/textwrapcrlf.pdf
new file mode 100644
index 0000000..e406697
--- /dev/null
+++ b/spec/data/textwrapcrlf.pdf
@@ -0,0 +1,2 @@
+%PDF-1.1
%¥±ë

1 0 obj
  << /Type /Catalog
     /Pages 2 0 R
  >>
endobj

2 0 obj
  << /Type /Pages
     /Kids [3 0 R]
     /Count 1
     /MediaBox [0 0 300 144]
  >>
endobj

3 0 obj
  <<  /Type /Page
      /Parent 2 0 R
      /Resources
       << /Font
           << /F1
               << /Type /Font
                  /Subtype /Type1
                  /BaseFont /Times-Roman
               >>
           >>
       >>
      /Contents 4 0 R
  >>
endobj

4 0 obj
  << /Length 55 >>
stream
  BT
    /F1 18 Tf
    0 0 Td
    (aaaa\
+bbbb) Tj
  ET
endstream
endobj

xref
0 5
0000000000 65535 f 
0000000018 00000 n 
0000000077 00000 n 
0000000178 00000 n 
0000000457 00000 n 
trailer
  <<  /Root 1 0 R
      /Size 5
  >>
startxref
565
%%EOF
\ No newline at end of file
diff --git a/spec/data/textwraplf.pdf b/spec/data/textwraplf.pdf
new file mode 100644
index 0000000..0b7aa51
--- /dev/null
+++ b/spec/data/textwraplf.pdf
@@ -0,0 +1,59 @@
+%PDF-1.1
+%¥±ë
+
+1 0 obj
+  << /Type /Catalog
+     /Pages 2 0 R
+  >>
+endobj
+
+2 0 obj
+  << /Type /Pages
+     /Kids [3 0 R]
+     /Count 1
+     /MediaBox [0 0 300 144]
+  >>
+endobj
+
+3 0 obj
+  <<  /Type /Page
+      /Parent 2 0 R
+      /Resources
+       << /Font
+           << /F1
+               << /Type /Font
+                  /Subtype /Type1
+                  /BaseFont /Times-Roman
+               >>
+           >>
+       >>
+      /Contents 4 0 R
+  >>
+endobj
+
+4 0 obj
+  << /Length 55 >>
+stream
+  BT
+    /F1 18 Tf
+    0 0 Td
+    (aaaa\
+ bbbb) Tj
+  ET
+endstream
+endobj
+
+xref
+0 5
+0000000000 65535 f 
+0000000018 00000 n 
+0000000077 00000 n 
+0000000178 00000 n 
+0000000457 00000 n 
+trailer
+  <<  /Root 1 0 R
+      /Size 5
+  >>
+startxref
+565
+%%EOF
diff --git a/spec/data/textwraplfcr.pdf b/spec/data/textwraplfcr.pdf
new file mode 100644
index 0000000..24eece0
--- /dev/null
+++ b/spec/data/textwraplfcr.pdf
@@ -0,0 +1,2 @@
+%PDF-1.1
%¥±ë

1 0 obj
  << /Type /Catalog
     /Pages 2 0 R
  >>
endobj

2 0 obj
  << /Type /Pages
     /Kids [3 0 R]
     /Count 1
     /MediaBox [0 0 300 144]
  >>
endobj

3 0 obj
  <<  /Type /Page
      /Parent 2 0 R
      /Resources
       << /Font
           << /F1
               << /Type /Font
                  /Subtype /Type1
                  /BaseFont /Times-Roman
               >>
           >>
       >>
      /Contents 4 0 R
  >>
endobj

4 0 obj
  << /Length 55 >>
stream
  BT
    /F1 18 Tf
    0 0 Td
    (aaaa\
+
bbbb) Tj
  ET
endstream
endobj

xref
0 5
0000000000 65535 f 
0000000018 00000 n 
0000000077 00000 n 
0000000178 00000 n 
0000000457 00000 n 
trailer
  <<  /Root 1 0 R
      /Size 5
  >>
startxref
565
%%EOF
\ No newline at end of file
diff --git a/spec/encoding_spec.rb b/spec/encoding_spec.rb
index ccba66f..aa8594c 100644
--- a/spec/encoding_spec.rb
+++ b/spec/encoding_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::Encoding do
diff --git a/spec/filter_spec.rb b/spec/filter_spec.rb
index cfaa916..5cdbe3c 100644
--- a/spec/filter_spec.rb
+++ b/spec/filter_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::Filter do
diff --git a/spec/font_descriptor_spec.rb b/spec/font_descriptor_spec.rb
index 2e7f394..d5be0ab 100644
--- a/spec/font_descriptor_spec.rb
+++ b/spec/font_descriptor_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::FontDescriptor do
@@ -19,7 +20,7 @@ describe PDF::Reader::FontDescriptor do
         :XHeight      => 0,
         :FontStretch  => :Condensed,
         :FontWeight   => 500,
-        :FontFamily   => :BoldItalic
+        :FontFamily   => "BoldItalic"
       }
     end
     let!(:objects) { PDF::Reader::ObjectHash.allocate }
@@ -41,7 +42,7 @@ describe PDF::Reader::FontDescriptor do
       expect(subject.x_height).to          eq(0)
       expect(subject.font_stretch).to      eq(:Condensed)
       expect(subject.font_weight).to       eq(500)
-      expect(subject.font_family).to       eq(:BoldItalic)
+      expect(subject.font_family).to       eq("BoldItalic")
     end
 
   end
diff --git a/spec/font_spec.rb b/spec/font_spec.rb
index a7a8c05..1295f2c 100644
--- a/spec/font_spec.rb
+++ b/spec/font_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::Font do
diff --git a/spec/glyph_hash_spec.rb b/spec/glyph_hash_spec.rb
index 565ba38..93026d0 100644
--- a/spec/glyph_hash_spec.rb
+++ b/spec/glyph_hash_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::GlyphHash do
@@ -60,11 +61,16 @@ describe PDF::Reader::GlyphHash do
       expect(map.name_to_unicode(:GG20000)).to eql(20000)
     end
 
+    it "correctly maps a zaph dingbats name to unicode" do
+      map = PDF::Reader::GlyphHash.new
+      expect(map.name_to_unicode(:a3)).to     eql(0x2704)
+    end
+
   end
 
   describe "#unicode_to_name" do
 
-    it "correctly maps a standard glyph name to unicode" do
+    it "correctly maps a standard unicode codepoint to a glyph name" do
       map = PDF::Reader::GlyphHash.new
       expect(map.unicode_to_name(0x0061)).to eql([:a])
       expect(map.unicode_to_name(0x0065)).to eql([:e])
@@ -78,5 +84,10 @@ describe PDF::Reader::GlyphHash do
       expect(map.unicode_to_name(0x30BA)).to eql([:zukatakana])
       expect(map.unicode_to_name(157)).to eql([])
     end
+
+    it "correctly maps a zapf dingbats unicode codepoint to a glyph name" do
+      map = PDF::Reader::GlyphHash.new
+      expect(map.unicode_to_name(0x2704)).to eql([:a3])
+    end
   end
 end
diff --git a/spec/integration_invalid_spec.rb b/spec/integration_invalid_spec.rb
new file mode 100644
index 0000000..86fa077
--- /dev/null
+++ b/spec/integration_invalid_spec.rb
@@ -0,0 +1,365 @@
+# typed: false
+# coding: utf-8
+
+# A set of integration specs that assert we raise expected errors when trying to parse PDFs that
+# are invalid. Usually they have some form of corruption that we're unable to compensate for
+
+describe PDF::Reader, "integration specs with invalid PDF files" do
+
+  context "Empty file" do
+    it "raises an exception" do
+      expect {
+        PDF::Reader.new(StringIO.new(""))
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "PDF has a content stream refers to a non-existant font" do
+    let(:filename) { pdf_spec_file("content_stream_refers_to_invalid_font") }
+
+    it "raises an exception" do
+      expect {
+        reader = PDF::Reader.new(filename)
+        reader.page(1).text
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "Malformed PDF" do
+    let(:filename) { pdf_spec_file("trailer_root_is_not_a_dict") }
+
+    it "raises an exception if trailer Root is not a dict" do
+      PDF::Reader.open(filename) do |reader|
+        expect { reader.page(1) }.to raise_error(PDF::Reader::MalformedPDFError)
+      end
+    end
+  end
+
+  context "PDF with missing page data" do
+    let(:filename) { pdf_spec_file("invalid_pages") }
+
+    it "raises a MalformedPDFError when an InvalidPageError is raised internally" do
+      PDF::Reader.open(filename) do |reader|
+        expect { reader.pages }.to raise_error(PDF::Reader::MalformedPDFError)
+      end
+    end
+  end
+
+  context "PDF that has a content stream with a broken string" do
+    let(:filename) { pdf_spec_file("broken_string") }
+
+    # this file used to get us into a hard, endless loop. Make sure that doesn't still happen
+    it "doesn't hang when extracting doc info" do
+      Timeout::timeout(3) do
+        expect {
+          reader = PDF::Reader.new(filename)
+          reader.info
+        }.to raise_error(PDF::Reader::MalformedPDFError)
+      end
+    end
+  end
+
+  context "gh-217" do
+    let(:filename) { pdf_spec_file("gh-217") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-222" do
+    let(:filename) { pdf_spec_file("gh-222") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  # The top level Pages object is corrupted and has no Count or Type key
+  context "gh-223" do
+    let(:filename) { pdf_spec_file("gh-223") }
+
+    it "parses without error" do
+      expect {
+        parse_pdf(filename)
+      }.to_not raise_error
+    end
+
+    it "has zero pages" do
+      PDF::Reader.open(filename) do |reader|
+        expect(reader.page_count).to eq 0
+        expect(reader.pages).to eq []
+      end
+    end
+  end
+
+  context "gh-224" do
+    let(:filename) { pdf_spec_file("gh-224") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-227" do
+    let(:filename) { pdf_spec_file("gh-227") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-228" do
+    let(:filename) { pdf_spec_file("gh-228") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-229" do
+    let(:filename) { pdf_spec_file("gh-229") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-230" do
+    let(:filename) { pdf_spec_file("gh-230") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-231" do
+    let(:filename) { pdf_spec_file("gh-231") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-232" do
+    let(:filename) { pdf_spec_file("gh-232") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-234" do
+    let(:filename) { pdf_spec_file("gh-234") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-235" do
+    let(:filename) { pdf_spec_file("gh-235") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-236" do
+    let(:filename) { pdf_spec_file("gh-236") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-237" do
+    let(:filename) { pdf_spec_file("gh-237") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-238" do
+    let(:filename) { pdf_spec_file("gh-238") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-239" do
+    let(:filename) { pdf_spec_file("gh-239") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-240" do
+    let(:filename) { pdf_spec_file("gh-240") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-241" do
+    let(:filename) { pdf_spec_file("gh-241") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "gh-242" do
+    let(:filename) { pdf_spec_file("gh-242") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  # This one raised an unexpected exception in v2.0.0, but since v2.6.0 (and PR #372) it works
+  # without error
+  context "gh-243" do
+    let(:filename) { pdf_spec_file("gh-243") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to_not raise_error
+    end
+  end
+
+  # This one raised an unexpected exception in v2.0.0, but since v2.4.0 (and PR #309) it works
+  # without error
+  context "gh-244" do
+    let(:filename) { pdf_spec_file("gh-244") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to_not raise_error
+    end
+  end
+
+  # This encrypted PDF declares an invalid key length. It's not really that we don't support a
+  # feature - we'll never support an invalid key length. We raise an unsupported fature error
+  # anyway.
+  context "gh-245" do
+    let(:filename) { pdf_spec_file("gh-245") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::UnsupportedFeatureError)
+    end
+  end
+
+  context "negative-xref-offset.pdf" do
+    let(:filename) { pdf_spec_file("negative-xref-offset") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "content_stream_wrong_args.pdf" do
+    let(:filename) { pdf_spec_file("content_stream_wrong_args") }
+
+    it "raises MalformedPDFError when parsed" do
+      expect {
+        parse_pdf(filename)
+      }.to raise_error(PDF::Reader::MalformedPDFError)
+    end
+  end
+
+  context "xref_offset_too_low.pdf" do
+    let(:filename) { pdf_spec_file("xref_offset_too_low") }
+
+    it "compensates for the error and can extract the paage text" do
+      expect {
+        parse_pdf(filename)
+      }.to_not raise_error
+
+      PDF::Reader.open(filename) do |pdf|
+        expect(pdf.page(1).text).to eql(
+          "The xref offset for the root object (obj 2) is a few bytes too low"
+        )
+      end
+    end
+  end
+
+  context "stream_missing_endobj.pdf" do
+    let(:filename) { pdf_spec_file("stream_missing_endobj") }
+
+    it "compensates for the error and can extract the paage text" do
+      expect {
+        parse_pdf(filename)
+      }.to_not raise_error
+
+      PDF::Reader.open(filename) do |pdf|
+        expect(pdf.page(1).text).to eql(
+          "Object 4 (content stream) is missing the endobj token"
+        )
+      end
+    end
+  end
+
+  # a very basic sanity check that we can open this file and extract interesting data
+  def parse_pdf(filename)
+    PDF::Reader.open(filename) do |reader|
+      reader.pdf_version
+      reader.info
+      reader.metadata
+      reader.objects
+      reader.page_count
+
+      reader.pages.each do |page|
+        page.fonts.to_s
+        page.text.to_s
+        page.raw_content.to_s
+      end
+    end
+  end
+end
diff --git a/spec/integration_spec.rb b/spec/integration_spec.rb
index 446373e..7859073 100644
--- a/spec/integration_spec.rb
+++ b/spec/integration_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 # These specs are a kind of integration spec. They're not unit testing small pieces
@@ -13,12 +14,79 @@ describe PDF::Reader, "integration specs" do
   context "cairo-unicode-short" do
     let(:filename) { pdf_spec_file("cairo-unicode-short") }
 
-    it "interprets unicode strings correctly" do
+    it "extracts unicode strings correctly" do
       PDF::Reader.open(filename) do |reader|
         page = reader.page(1)
         expect(page.text).to eql("Chunky Bacon")
       end
     end
+
+    it "extracts unicode strings correctly from part of the page" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(
+          page.text(rect: PDF::Reader::Rectangle.new(29, 779, 100, 800))
+        ).to eql("Chunky")
+      end
+    end
+
+    # This spec assumes high precision in our glyph positioning calcualtions. It's likely
+    # that the specific x,y co-ords tested here might change a bit over time as small bugs
+    # in glyph positioning are ironed out (kerning, etc). I still think this test is worthwhile,
+    # to confirm the positions don't change unintentionally.
+    #
+    # pitstop co-ords
+    # C 32.0176, 779.5879
+    # h 48.8279, 779.89
+    # u 60.2067, 779.5879
+    # n 73.8355, 779.89
+    # k 87.3393, 779.89
+    # y 97.3745, 775.4526
+    it "extracts individual chars with correct positions" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        some_runs = page.runs(
+          merge: false,
+          rect: PDF::Reader::Rectangle.new(29, 779, 100, 800)
+        )
+        expect(some_runs.size).to eql(6)
+        expect(some_runs[0].text).to eql("C")
+        expect(some_runs[0].origin).to be_close_to(PDF::Reader::Point.new(30,779.89))
+        expect(some_runs[1].text).to eql("h")
+        expect(some_runs[1].origin).to be_close_to(PDF::Reader::Point.new(44.89,779.89))
+        expect(some_runs[2].text).to eql("u")
+        expect(some_runs[2].origin).to be_close_to(PDF::Reader::Point.new(58.39, 779.89))
+        expect(some_runs[3].text).to eql("n")
+        expect(some_runs[3].origin).to be_close_to(PDF::Reader::Point.new(71.89, 779.89))
+        expect(some_runs[4].text).to eql("k")
+        expect(some_runs[4].origin).to be_close_to(PDF::Reader::Point.new(85.40, 779.89))
+        expect(some_runs[5].text).to eql("y")
+        expect(some_runs[5].origin).to be_close_to(PDF::Reader::Point.new(96.73, 779.89))
+      end
+    end
+
+    it "is portrait orientation" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.orientation).to eql("portrait")
+      end
+    end
+
+    it "returns correct page dimensions" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        # A4 portrait
+        expect(page.width).to be_within(0.1).of(595.28)
+        expect(page.height).to be_within(0.1).of(841.89)
+      end
+    end
+
+    it "returns correct origin" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.origin).to eq PDF::Reader::Point.new(0,0)
+      end
+    end
   end
 
   context "vertical-text-in-identity-v" do
@@ -52,7 +120,9 @@ describe PDF::Reader, "integration specs" do
         expect(reader.pages.size).to eql(3)
 
         page = reader.page(1)
-        expect(page.text).to include("Dit\302\240is\302\240een\302\240pdf\302\240test\302\240van\302\240drie\302\240pagina")
+        expect(page.text).to include(
+          "Dit\302\240is\302\240een\302\240pdf\302\240test\302\240van\302\240drie\302\240pagina"
+        )
         expect(page.text).to include("’s")
         expect(page.text).to include("Pagina\302\2401")
       end
@@ -92,6 +162,17 @@ describe PDF::Reader, "integration specs" do
     end
   end
 
+  context "PDF with a content stream that is enclosed with CR characters only" do
+    let(:filename) { pdf_spec_file("content_stream_cr_only") }
+
+    it "extracts text correctly" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.text).to eq("This is a weird PDF file")
+      end
+    end
+  end
+
   context "PDF with a content stream that is missing an operator (has hanging params)" do
     let(:filename) { pdf_spec_file("content_stream_missing_final_operator") }
 
@@ -115,20 +196,6 @@ describe PDF::Reader, "integration specs" do
     end
   end
 
-  context "PDF that has a content stream with a broken string" do
-    let(:filename) { pdf_spec_file("broken_string") }
-
-    # this file used to get us into a hard, endless loop. Make sure that doesn't still happen
-    it "doesn't hang when extracting doc info" do
-      Timeout::timeout(3) do
-        expect {
-          reader = PDF::Reader.new(filename)
-          reader.info
-        }.to raise_error(PDF::Reader::MalformedPDFError)
-      end
-    end
-  end
-
   context "PDF with a stream that has its length specified as an indirect reference" do
     let(:filename) { pdf_spec_file("content_stream_with_length_as_ref") }
 
@@ -142,7 +209,7 @@ describe PDF::Reader, "integration specs" do
   # PDF::Reader::XRef#object was saving an incorrect position when seeking. We
   # were saving the current pos of the underlying IO stream, then seeking back
   # to it. This was fine, except when there was still content in the buffer.
-  context "PDF with a stream that has its length specified as an indirect reference and uses windows line breaks" do
+  context "PDF with a stream length specified via indirect object and uses windows line breaks" do
     let(:filename) { pdf_spec_file("content_stream_with_length_as_ref_and_windows_breaks") }
 
     it "extracts text correctly" do
@@ -152,31 +219,19 @@ describe PDF::Reader, "integration specs" do
     end
   end
 
-  context "PDF has a content stream refers to a non-existant font" do
-    let(:filename) { pdf_spec_file("content_stream_refers_to_invalid_font") }
-
-    it "raises an exception" do
-      expect {
-        reader = PDF::Reader.new(filename)
-        reader.page(1).text
-      }.to raise_error(PDF::Reader::MalformedPDFError)
-    end
-  end
-
-  context "Empty file" do
-    it "raises an exception" do
-      expect {
-        PDF::Reader.new(StringIO.new(""))
-      }.to raise_error(PDF::Reader::MalformedPDFError)
-    end
-  end
-
   context "PDF that uses an ASCII85Decode filter" do
     let(:filename) { pdf_spec_file("ascii85_filter") }
 
+    # The text on this page is rotated 45 degrees, so mapping it to plain text isn't straight
+    # forward. Still, it'd be nice to see if this can be improved somehow
+    #
+    # If not, maybe it'd be good to drop this spec, and replace it with one that confirms the text
+    # position if a few key characters
     it "extracts text correctly" do
       PDF::Reader.open(filename) do |reader|
-        expect(reader.page(1).text).to match(/Et Iunia se/)
+        lines = reader.page(1).text.split("\n")
+        expect(lines[0].strip).to eq("E")
+        expect(lines[1].strip).to eq("t Iu")
       end
     end
   end
@@ -191,6 +246,16 @@ describe PDF::Reader, "integration specs" do
     end
   end
 
+  context "PDF that has dummy inline data no white-space before EI" do
+    let(:filename) { pdf_spec_file("inline_data_followed_by_ei") }
+
+    it "extracts text correctly" do
+      PDF::Reader.open(filename) do |reader|
+        expect(reader.page(1).text).to eql("ID followed by EI on same line\n__END__")
+      end
+    end
+  end
+
   context "PDF that uses Form XObjects to repeat content" do
     let(:filename) { pdf_spec_file("form_xobject") }
 
@@ -249,9 +314,11 @@ describe PDF::Reader, "integration specs" do
   context "PDF that has a single space after the EOF marker" do
     let(:filename) { pdf_spec_file("space_after_eof") }
 
+    # This text is rotated at 45 degrees, which isn't particularly easy to map to plain text
+    # It would be nice if all the "Hello World" characters were at least visible though
     it "extracts text correctly" do
       PDF::Reader.open(filename) do |reader|
-        expect(reader.page(1).text).to eql("Hello World")
+        expect(reader.page(1).text).to eql("    r\n loo\nHe")
       end
     end
   end
@@ -727,22 +794,45 @@ describe PDF::Reader, "integration specs" do
     context "with the user pass" do
       let(:pass) { "apples" }
 
-      # TODO: remove this spec
-      it "raises UnsupportedFeatureError" do
-        expect {
-          PDF::Reader.open(filename, :password => pass) do |reader|
-            reader.page(1).text
-          end
-        }.to raise_error(PDF::Reader::EncryptedPDFError)
+      it "correctly extracts text" do
+        PDF::Reader.open(filename, :password => pass) do |reader|
+          expect(reader.page(1).text).to start_with(
+            "This sample file is encrypted with a user password"
+          )
+        end
+      end
+      it "correctly extracts info" do
+        PDF::Reader.open(filename, :password => pass) do |reader|
+          expect(reader.info).to eq(
+            :Creator=>"Writer",
+            :Producer=>"LibreOffice 3.3",
+            :CreationDate=>"D:20110814231057+10'00'",
+            :ModDate=>"D:20170115224358+11'00'"
+          )
+        end
       end
-
-      it "correctly extracts text"
-      it "correctly extracts info"
     end
 
     context "with the owner pass" do
-      it "correctly extracts text"
-      it "correctly extracts info"
+      let(:pass) { "password" }
+
+      it "correctly extracts text" do
+        PDF::Reader.open(filename, :password => pass) do |reader|
+          expect(reader.page(1).text).to start_with(
+            "This sample file is encrypted with a user password"
+          )
+        end
+      end
+      it "correctly extracts info" do
+        PDF::Reader.open(filename, :password => pass) do |reader|
+          expect(reader.info).to eq(
+            :Creator=>"Writer",
+            :Producer=>"LibreOffice 3.3",
+            :CreationDate=>"D:20110814231057+10'00'",
+            :ModDate=>"D:20170115224358+11'00'"
+          )
+        end
+      end
     end
   end
 
@@ -754,22 +844,64 @@ describe PDF::Reader, "integration specs" do
     context "with the user pass" do
       let(:pass) { "apples" }
 
-      # TODO: remove this spec
-      it "raises UnsupportedFeatureError" do
-        expect {
-          PDF::Reader.open(filename, :password => pass) do |reader|
-            reader.page(1).text
-          end
-        }.to raise_error(PDF::Reader::EncryptedPDFError)
+      it "correctly extracts text" do
+        PDF::Reader.open(filename, :password => pass) do |reader|
+          expect(reader.page(1).text).to start_with(
+            "This sample file is encrypted with a user password"
+          )
+        end
       end
 
-      it "correctly extracts text"
-      it "correctly extracts info"
+      it "correctly extracts info" do
+        PDF::Reader.open(filename, :password => pass) do |reader|
+          expect(reader.info).to eq(
+            :Creator=>"Writer",
+            :Producer=>"LibreOffice 3.3",
+            :CreationDate=>"D:20110814231057+10'00'",
+            :ModDate=>"D:20170115224526+11'00'"
+          )
+        end
+      end
     end
 
     context "with the owner pass" do
-      it "correctly extracts text"
-      it "correctly extracts info"
+      let(:pass) { "password" }
+
+      it "correctly extracts text" do
+        PDF::Reader.open(filename, :password => pass) do |reader|
+          expect(reader.page(1).text).to start_with(
+            "This sample file is encrypted with a user password"
+          )
+        end
+      end
+      it "correctly extracts info" do
+        PDF::Reader.open(filename, :password => pass) do |reader|
+          expect(reader.info).to eq(
+            :Creator=>"Writer",
+            :Producer=>"LibreOffice 3.3",
+            :CreationDate=>"D:20110814231057+10'00'",
+            :ModDate=>"D:20170115224526+11'00'"
+          )
+        end
+      end
+    end
+  end
+
+  context "Encrypted PDF with an xref stream" do
+    let(:filename) {
+      pdf_spec_file("encrypted_and_xref_stream")
+    }
+
+    it "correctly extracts text" do
+      PDF::Reader.open(filename) do |reader|
+        expect(reader.page(1).text).to eq("This text is encrypted")
+      end
+    end
+
+    it "correctly parses indirect objects" do
+      PDF::Reader.open(filename) do |reader|
+        expect { reader.objects.values }.not_to raise_error
+      end
     end
   end
 
@@ -789,7 +921,10 @@ describe PDF::Reader, "integration specs" do
       expect(callbacks[0]).to eql(:name => :begin_inline_image, :args => [])
 
       # the second with the image header (colorspace, etc)
-      expect(callbacks[1]).to eql(:name => :begin_inline_image_data, :args => [:CS, :RGB, :I, true, :W, 234, :H, 70, :BPC, 8])
+      expect(callbacks[1]).to eql(
+        :name => :begin_inline_image_data,
+        :args => [:CS, :RGB, :I, true, :W, 234, :H, 70, :BPC, 8]
+      )
 
       # the last with the image data
       expect(callbacks[2][:name]).to eql :end_inline_image
@@ -923,22 +1058,10 @@ describe PDF::Reader, "integration specs" do
   context "PDF that uses a type3 bitmap font with a rare FontMatrix" do
     let(:filename) { pdf_spec_file("type3_font_with_rare_font_matrix") }
 
-    # TODO most type3 fonts have a FontMatrix entry of [ 0.001 0 0 0.001 0 0 ],
-    # which matches the glyph scale factor of 1000 that non-type3 fonts use.
-    # It's permitted for type3 fonts to use other FontMatrix values though,
-    # and we should do a better job of extracting the text.
-    # The Page is 200pts wide and 50pts high. The first letters for each word
-    # *should* be positioned like so:
-    #
-    #   P - X: 10.3 Y: 20   Width: 7.35 Height: 8.55
-    #   G - X: 56.5 Y: 19.7 Width: 8.25 Height: 9.15
-    #   A - X: 101.5 Y: 20  Width: 8.25 Height: 9
-    #
     it "extracts text correctly" do
-      pending
       PDF::Reader.open(filename) do |reader|
         page = reader.page(1)
-        expect(page.text).to include("Parallel Genetic Algorithms")
+        expect(page.text).to include("ParallelGenetic Algorithms")
       end
     end
   end
@@ -966,7 +1089,7 @@ describe PDF::Reader, "integration specs" do
     it "extracts text without raising an exception" do
       PDF::Reader.open(filename) do |reader|
         page = reader.page(1)
-        expect(page.text.split("\n").map(&:strip).slice(0,2)).to eq(["°","9"])
+        expect(page.text.split("\n").map(&:strip).slice(0,2)).to eq(["0","9"])
       end
     end
   end
@@ -982,6 +1105,17 @@ describe PDF::Reader, "integration specs" do
     end
   end
 
+  context "PDF with a TJ operator that aims to correct for character spacing" do
+    let(:filename) { pdf_spec_file("TJ_and_char_spacing") }
+
+    it "extracts text correctly" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.text[15,17]).to eq("The big brown fox")
+      end
+    end
+  end
+
   context "PDF with a page that's missing the MediaBox attribute" do
     let(:filename) { pdf_spec_file("mediabox_missing") }
 
@@ -991,6 +1125,21 @@ describe PDF::Reader, "integration specs" do
         expect(page.text[0,54]).to eq("This page is missing the compulsory MediaBox attribute")
       end
     end
+
+    it "is portrait orientation" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.orientation).to eql("portrait")
+      end
+    end
+
+    it "returns correct page dimensions (defaults to portrait US letter)" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.width).to be_within(0.1).of(612)
+        expect(page.height).to be_within(0.1).of(792)
+      end
+    end
   end
 
   context "PDF using a standard fint and no difference table" do
@@ -1081,22 +1230,79 @@ describe PDF::Reader, "integration specs" do
     end
   end
 
-  context "Malformed PDF" do
-    let(:filename) { pdf_spec_file("trailer_root_is_not_a_dict") }
+  context "PDF with bad xref: using 1 not 0" do
+    let(:filename) { pdf_spec_file("minimal-xref-1") }
+
+    it "extracts text correctly" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.text).to eq("Hello World")
+      end
+    end
+  end
+
+  context "PDF with octal data" do
+    let(:filename) { pdf_spec_file("octal101") }
+
+    it "extracts text correctly" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.text).to eq("A ]A[")
+      end
+    end
+  end
+
+  context "PDF with octal data" do
+    let(:filename) { pdf_spec_file("octal74") }
+
+    it "extracts text correctly" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.text).to eq("< ]<8[")
+      end
+    end
+  end
+
+  context "PDF with CR line-wrapped text" do
+    let(:filename) { pdf_spec_file("textwrapcr") }
+
+    it "extracts text correctly" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.text).to eq("aaaa bbbb")
+      end
+    end
+  end
+
+  context "PDF with LF line-wrapped text" do
+    let(:filename) { pdf_spec_file("textwraplf") }
+
+    it "extracts text correctly" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.text).to eq("aaaa bbbb")
+      end
+    end
+  end
+
+  context "PDF with CRLF line-wrapped text" do
+    let(:filename) { pdf_spec_file("textwrapcrlf") }
 
-    it "raises an exception if trailer Root is not a dict" do
+    it "extracts text correctly" do
       PDF::Reader.open(filename) do |reader|
-        expect { reader.page(1) }.to raise_error(PDF::Reader::MalformedPDFError)
+        page = reader.page(1)
+        expect(page.text).to eq("aaaabbbb")
       end
     end
   end
 
-  context "PDF with missing page data" do
-    let(:filename) { pdf_spec_file("invalid_pages") }
+  context "PDF with LFCR line-wrapped text" do
+    let(:filename) { pdf_spec_file("textwraplfcr") }
 
-    it "raises a MalformedPDFError when an InvalidPageError is raised internally" do
+    it "extracts text correctly" do
       PDF::Reader.open(filename) do |reader|
-        expect { reader.pages }.to raise_error(PDF::Reader::MalformedPDFError)
+        page = reader.page(1)
+        expect(page.text).to eq("aaaabbbb")
       end
     end
   end
@@ -1152,12 +1358,72 @@ describe PDF::Reader, "integration specs" do
         expect(page.text).to eq(text)
       end
     end
+
+    # This spec assumes high precision in our glyph positioning calcualtions. It's likely
+    # that the specific x,y co-ords tested here might change a bit over time as small bugs
+    # in glyph positioning are ironed out (kerning, etc). I still think this test is worthwhile,
+    # to confirm the positions don't change unintentionally.
+    #
+    # Pitstop numbers
+    #
+    # u -437.08, -68.018
+    # p -431.054, -70.4555
+    # s -424.851, -68.018
+    # i -420.4, -67.9
+    # d -416.918, -68.018
+    # e -410.978, -68.018
+    it "extracts individual chars with correct positions" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        some_runs = page.runs(
+          merge: false,
+          rect: PDF::Reader::Rectangle.new(-438, -68, -405, -62)
+        )
+        expect(some_runs.size).to eql(6)
+        expect(some_runs[0].text).to eql("u")
+        expect(some_runs[0].origin).to be_close_to(PDF::Reader::Point.new(-437.24, -67.9))
+        expect(some_runs[1].text).to eql("p")
+        expect(some_runs[1].origin).to be_close_to(PDF::Reader::Point.new(-431.24, -67.9))
+        expect(some_runs[2].text).to eql("s")
+        expect(some_runs[2].origin).to be_close_to(PDF::Reader::Point.new(-425.34, -67.9))
+        expect(some_runs[3].text).to eql("i")
+        expect(some_runs[3].origin).to be_close_to(PDF::Reader::Point.new(-420.65, -67.9))
+        expect(some_runs[4].text).to eql("d")
+        expect(some_runs[4].origin).to be_close_to(PDF::Reader::Point.new(-417.35, -67.9))
+        expect(some_runs[5].text).to eql("e")
+        expect(some_runs[5].origin).to be_close_to(PDF::Reader::Point.new(-411.26, -67.9))
+      end
+    end
+
+    it "is portrait orientation" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.orientation).to eql("portrait")
+      end
+    end
+
+    it "returns correct page dimensions" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        # A4 portrait
+        expect(page.width).to be_within(0.1).of(595.30)
+        expect(page.height).to be_within(0.1).of(841.88)
+      end
+    end
+
+    it "returns correct origin" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.origin.x).to be_within(0.1).of(-595.30)
+        expect(page.origin.y).to be_within(0.1).of(-841.88)
+      end
+    end
   end
 
-  context "PDF with page rotation followed by matrix transformations to undo it" do
+  context "PDF with page rotation of 270 degrees followed by matrix transformations to undo it" do
     let(:filename) { pdf_spec_file("rotate-then-undo") }
     let(:text) {
-      "This page uses matrix transformations to print text sideways, " +
+      "This page uses matrix transformations to print text   sideways, " +
       "then has a Rotate key to fix it"
     }
 
@@ -1167,5 +1433,352 @@ describe PDF::Reader, "integration specs" do
         expect(page.text).to eq(text)
       end
     end
+
+    # This spec assumes high precision in our glyph positioning calcualtions. It's likely
+    # that the specific x,y co-ords tested here might change a bit over time as small bugs
+    # in glyph positioning are ironed out (kerning, etc). I still think this test is worthwhile,
+    # to confirm the positions don't change unintentionally.
+    #
+    # Pitstop Numbers
+    #
+    # T -570.28, 750.95
+    # h -560.86, 750.95
+    # i -553.38, 750.95
+    # s -550.68, 750.76
+    #
+    it "extracts individual chars with correct positions" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        some_runs = page.runs(
+          merge: false,
+          rect: PDF::Reader::Rectangle.new(-572, 749, -545, 760)
+        )
+        expect(some_runs.size).to eql(4)
+        expect(some_runs[0].text).to eql("T")
+        expect(some_runs[0].origin).to be_close_to(PDF::Reader::Point.new(-570.24, 750.95))
+        expect(some_runs[1].text).to eql("h")
+        expect(some_runs[1].origin).to be_close_to(PDF::Reader::Point.new(-561.95, 750.95))
+        expect(some_runs[2].text).to eql("i")
+        expect(some_runs[2].origin).to be_close_to(PDF::Reader::Point.new(-554.40, 750.95))
+        expect(some_runs[3].text).to eql("s")
+        expect(some_runs[3].origin).to be_close_to(PDF::Reader::Point.new(-551.39, 750.95))
+      end
+    end
+
+    it "is portrait orientation" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.orientation).to eql("portrait")
+      end
+    end
+
+    it "returns correct page dimensions" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        # A4 portrait
+        expect(page.width).to be_within(0.1).of(595.30)
+        expect(page.height).to be_within(0.1).of(841.88)
+      end
+    end
+
+    it "returns correct origin" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.origin.x).to be_within(0.1).of(-595.30)
+        expect(page.origin.y).to be_within(0.1).of(0)
+      end
+    end
+  end
+
+  context "PDF with 270° page rotation and matrix transformations within BT block to undo" do
+    let(:filename) { pdf_spec_file("rotate-270-then-undo-inside-bt") }
+    let(:text) { "This page is rotated 270 degrees" }
+
+    it "extracts text correctly" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.text).to eq(text)
+      end
+    end
+
+    # This spec assumes high precision in our glyph positioning calcualtions. It's likely
+    # that the specific x,y co-ords tested here might change a bit over time as small bugs
+    # in glyph positioning are ironed out (kerning, etc). I still think this test is worthwhile,
+    # to confirm the positions don't change unintentionally.
+    #
+    # Pitstop numbers
+    #
+    # T -320.736, 534
+    # h -312.408, 534
+    # i -305.796, 534
+    # s -303.408, 533.832
+    #
+    it "extracts individual chars with correct positions" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        some_runs = page.runs(
+          merge: false,
+          rect: PDF::Reader::Rectangle.new(-322, 534, -300, 550)
+        )
+        expect(some_runs.size).to eql(4)
+        expect(some_runs[0].text).to eql("T")
+        expect(some_runs[0].origin).to be_close_to(PDF::Reader::Point.new(-320.2, 534.5))
+        expect(some_runs[1].text).to eql("h")
+        expect(some_runs[1].origin).to be_close_to(PDF::Reader::Point.new(-312.86, 534.5))
+        expect(some_runs[2].text).to eql("i")
+        expect(some_runs[2].origin).to be_close_to(PDF::Reader::Point.new(-306.19, 534.5))
+        expect(some_runs[3].text).to eql("s")
+        expect(some_runs[3].origin).to be_close_to(PDF::Reader::Point.new(-303.532, 534.5))
+      end
+    end
+
+    it "is portrait orientation" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.orientation).to eql("portrait")
+      end
+    end
+
+    it "returns correct page dimensions" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        # A4 portrait
+        expect(page.width).to be_within(0.1).of(595.30)
+        expect(page.height).to be_within(0.1).of(841.88)
+      end
+    end
+
+    it "returns correct origin" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.origin.x).to be_within(0.1).of(-595.30)
+        expect(page.origin.y).to be_within(0.1).of(0)
+      end
+    end
+  end
+
+  context "PDF with page rotation of 90 degrees followed by matrix transformations to undo it" do
+    let(:filename) { pdf_spec_file("rotate-90-then-undo") }
+    let(:text) {
+      "1: This PDF has Rotate:90 in the page metadata\n" +
+      "2: to get a landscape layout, and then uses matrix\n" +
+      "3: transformation to rotate the text back to normal"
+    }
+
+    it "extracts text correctly" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.text).to eq(text)
+      end
+    end
+
+    # This spec assumes high precision in our glyph positioning calcualtions. It's likely
+    # that the specific x,y co-ords tested here might change a bit over time as small bugs
+    # in glyph positioning are ironed out (kerning, etc). I still think this test is worthwhile,
+    # to confirm the positions don't change unintentionally.
+    #
+    # Pitstop numbers
+    #
+    # T 287.298, -45.49
+    # h 295.626, -45.49
+    # i 302.238, -45.49
+    # s 304.626, -45.658
+    #
+    it "extracts individual chars with correct positions" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        some_runs = page.runs(
+          merge: false,
+          rect: PDF::Reader::Rectangle.new(285, -47, 310, -35)
+        )
+        expect(some_runs.size).to eql(4)
+        expect(some_runs[0].text).to eql("T")
+        expect(some_runs[0].origin).to be_close_to(PDF::Reader::Point.new(287.33, -45.49))
+        expect(some_runs[1].text).to eql("h")
+        expect(some_runs[1].origin).to be_close_to(PDF::Reader::Point.new(294.66, -45.49))
+        expect(some_runs[2].text).to eql("i")
+        expect(some_runs[2].origin).to be_close_to(PDF::Reader::Point.new(301.33, -45.49))
+        expect(some_runs[3].text).to eql("s")
+        expect(some_runs[3].origin).to be_close_to(PDF::Reader::Point.new(304, -45.49))
+      end
+    end
+
+    it "is portrait landscape" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.orientation).to eql("landscape")
+      end
+    end
+
+    it "returns correct page dimensions" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        # A4 landscape
+        expect(page.width).to be_within(0.1).of(842)
+        expect(page.height).to be_within(0.1).of(595)
+      end
+    end
+
+    it "returns correct origin" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.origin.x).to be_within(0.1).of(0)
+        expect(page.origin.y).to be_within(0.1).of(-595)
+      end
+    end
+  end
+
+  context "PDF with page rotation of 90 degrees followed by matrix transformations to undo it" do
+    let(:filename) { pdf_spec_file("rotate-90-then-undo-with-br-text") }
+
+    it "extracts text correctly" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.text).to include("This PDF ha  sRotate:90 in the page")
+        expect(page.text).to include("metadata to get a landscape layout")
+        expect(page.text).to include("and text in bottom right quadrant")
+      end
+    end
+
+    # This spec assumes high precision in our glyph positioning calcualtions. It's likely
+    # that the specific x,y co-ords tested here might change a bit over time as small bugs
+    # in glyph positioning are ironed out (kerning, etc). I still think this test is worthwhile,
+    # to confirm the positions don't change unintentionally.
+    #
+    # Pitstop Numbers
+    #
+    # p 216.026, -525.906
+    # a 222.398, -523.578
+    # g 228.986, -525.906
+    # e 235.682, -523.578
+    #
+    it "extracts individual chars with correct positions" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        some_runs = page.runs(
+          merge: false,
+          rect: PDF::Reader::Rectangle.new(212, -524, 239, -520)
+        )
+        expect(some_runs.size).to eql(4)
+        expect(some_runs[0].text).to eql("p")
+        expect(some_runs[0].origin).to be_close_to(PDF::Reader::Point.new(215.06, -523.41))
+        expect(some_runs[1].text).to eql("a")
+        expect(some_runs[1].origin).to be_close_to(PDF::Reader::Point.new(221.73, -523.41))
+        expect(some_runs[2].text).to eql("g")
+        expect(some_runs[2].origin).to be_close_to(PDF::Reader::Point.new(228.41, -523.41))
+        expect(some_runs[3].text).to eql("e")
+        expect(some_runs[3].origin).to be_close_to(PDF::Reader::Point.new(235.08, -523.41))
+      end
+    end
+
+    it "is landscape orientation" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.orientation).to eql("landscape")
+      end
+    end
+
+    it "returns correct page dimensions" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        # A4 landscape
+        expect(page.width).to be_within(0.1).of(842)
+        expect(page.height).to be_within(0.1).of(595)
+      end
+    end
+
+    it "returns correct origin" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.origin.x).to be_within(0.1).of(0)
+        expect(page.origin.y).to be_within(0.1).of(-595)
+      end
+    end
+  end
+
+  context "PDF with /Prev 0 trailer entry" do
+    let(:filename) { pdf_spec_file("prev0") }
+
+    it "extracts text correctly" do
+      PDF::Reader.open(filename) do |reader|
+        expect(reader.page(1).text).to eql("aaaa bbbb")
+      end
+    end
+  end
+
+  context "Content stream with indirect object for filters array" do
+    let(:filename) { pdf_spec_file("stream-with-indirect-filters") }
+
+    it "extracts text correctly" do
+      PDF::Reader.open(filename) do |reader|
+        expect(reader.page(1).text).to eql(
+          "The content stream for this page stores the filter in an indirect object"
+        )
+      end
+    end
+  end
+
+  context "PDF with text outside the CropBox and MediaBox" do
+    let(:filename) { pdf_spec_file("text_outside_cropbox_and_mediabox") }
+
+    it "returns the correct rectangles for the page 1" do
+      PDF::Reader.open(filename) do |reader|
+        page = reader.page(1)
+        expect(page.rectangles[:MediaBox]).to eq(PDF::Reader::Rectangle.new(0, 0, 612, 792))
+        expect(page.rectangles[:CropBox]).to eq(PDF::Reader::Rectangle.new(100, 100, 412, 592))
+      end
+    end
+
+    it "by default only extracts text inside the CropBox" do
+      PDF::Reader.open(filename) do |reader|
+        text = reader.page(1).text
+        expect(text).to include("This text is inside the CropBox")
+        expect(text).to_not include("Between CropBox and MediaBox")
+        expect(text).to_not include("Outside MediaBox")
+      end
+    end
+
+    it "by default only extracts runs inside the CropBox" do
+      PDF::Reader.open(filename) do |reader|
+        text_from_runs = reader.page(1).runs.map(&:text).join(" ")
+        expect(text_from_runs).to include("This text is inside the CropBox")
+        expect(text_from_runs).to_not include("Between CropBox and MediaBox")
+        expect(text_from_runs).to_not include("Outside MediaBox")
+      end
+    end
+
+    it "can extract text between CropBox and MediaBox with a custom option" do
+      PDF::Reader.open(filename) do |reader|
+        text = reader.page(1).text(rect: PDF::Reader::Rectangle.new(0, 0, 612, 792))
+        expect(text).to include("This text is inside the CropBox")
+        expect(text).to include("Between CropBox and MediaBox")
+        expect(text).to_not include("Outside MediaBox")
+      end
+    end
+
+    it "can extract runs between CropBox and MediaBox with a custom option" do
+      mediabox = PDF::Reader::Rectangle.new(0, 0, 612, 792)
+      PDF::Reader.open(filename) do |reader|
+        text_from_runs = reader.page(1).runs(rect: mediabox).map(&:text).join(" ")
+        expect(text_from_runs).to include("This text is inside the CropBox")
+        expect(text_from_runs).to include("Between CropBox and MediaBox")
+        expect(text_from_runs).to_not include("Outside MediaBox")
+      end
+    end
+
+    # This currently doesn't work - PDF::Reader::PageLayout skips text that's outside the MediaBox
+    # I'm not sure we want it to work either, but I'm adding it as a pending spec for completeness
+    # while I consider the best options
+    it "can extract text outside the MediaBox with a custom option"
+
+    it "can extract runs outside the MediaBox with a custom option" do
+      larger_than_mediabox = PDF::Reader::Rectangle.new(0, 0, 900, 900)
+      PDF::Reader.open(filename) do |reader|
+        text_from_runs = reader.page(1).runs(rect: larger_than_mediabox).map(&:text).join(" ")
+        expect(text_from_runs).to include("This text is inside the CropBox")
+        expect(text_from_runs).to include("Between CropBox and MediaBox")
+        expect(text_from_runs).to include("Outside MediaBox")
+      end
+    end
   end
 end
diff --git a/spec/integrity.yml b/spec/integrity.yml
index 04def0c..58704d7 100644
--- a/spec/integrity.yml
+++ b/spec/integrity.yml
@@ -2,6 +2,9 @@
 data/20070313 - 2nd Laptop Battery.pdf:
   :bytes: 27832
   :md5: be3427795b673615e42f89b9043d44d9
+data/TJ_and_char_spacing.pdf:
+  :bytes: 905
+  :md5: 8d2a7d485f95f3bc45187c1cf38330c2
 data/TJ_starts_with_a_number.pdf:
   :bytes: 13119
   :md5: 83501b5c507cdddbd9283ad2003c885b
@@ -14,9 +17,6 @@ data/all_page_boxes_exist.pdf:
 data/ascii85_filter.pdf:
   :bytes: 21288
   :md5: 49502f60a3f058e20d0564312c9dda2b
-data/broken_string.pdf:
-  :bytes: 929
-  :md5: f717634f2e419e496e1e93a0cb5b7d18
 data/cairo-basic.pdf:
   :bytes: 9659
   :md5: 88be82e60534bfa5f85b9ec0697ec6d6
@@ -71,12 +71,12 @@ data/content_stream_as_array.pdf:
 data/content_stream_begins_with_newline.pdf:
   :bytes: 910
   :md5: 6c447a7c6c99eb2b984ab2fd4c8d9c61
+data/content_stream_cr_only.pdf:
+  :bytes: 702
+  :md5: 3253e3654b2375bdd732d0dd1c096db9
 data/content_stream_missing_final_operator.pdf:
   :bytes: 46799
   :md5: 8b3d2706526dcf684dad80b53bf6dc94
-data/content_stream_refers_to_invalid_font.pdf:
-  :bytes: 598
-  :md5: e4a711b9d2fbc3ebe0e16c7498563521
 data/content_stream_trailing_whitespace.pdf:
   :bytes: 55688
   :md5: 5dad57e5cae55c8b305a0853c8e3d067
@@ -110,6 +110,9 @@ data/distiller_unicode.pdf:
 data/dutch.pdf:
   :bytes: 14163
   :md5: cbe0d3075d4474a221cd0b3800c5a0e4
+data/encrypted_and_xref_stream.pdf:
+  :bytes: 1197
+  :md5: 6bba66a160f820798385a3d1e8e156d2
 data/encrypted_version1_revision2_128bit_rc4_blank_user_password.pdf:
   :bytes: 15674
   :md5: 88a9b78341fa55879fa94930bd4d33af
@@ -191,15 +194,93 @@ data/inherited_page_attributes.pdf:
 data/inherited_trimbox.pdf:
   :bytes: 1139
   :md5: b3eab8b6fb964b0c8e63d1b75069a6c8
+data/inline_data_followed_by_ei.pdf:
+  :bytes: 1054
+  :md5: 1189782791340a1910d80eae751728bc
 data/inline_image.pdf:
   :bytes: 30684
   :md5: b02bfbb6b0ee7c7d7df1b5f0c1f198c1
 data/inline_image_single_line_content_stream.pdf:
   :bytes: 130786
   :md5: '096fb28baf29a716066768cb31182b73'
+data/invalid/broken_string.pdf:
+  :bytes: 929
+  :md5: f717634f2e419e496e1e93a0cb5b7d18
+data/invalid/content_stream_refers_to_invalid_font.pdf:
+  :bytes: 598
+  :md5: e4a711b9d2fbc3ebe0e16c7498563521
+data/invalid/content_stream_wrong_args.pdf:
+  :bytes: 378345
+  :md5: 8da6f39e6f1c557c8514f1e124ea137d
 data/invalid/data.csv:
   :bytes: 26
   :md5: 7168179491824d651a304cbb83c16964
+data/invalid/gh-217.pdf:
+  :bytes: 108807
+  :md5: 3739eb2731370bd7923c3f418c0bd73e
+data/invalid/gh-222.pdf:
+  :bytes: 108807
+  :md5: dbe939f42fdfc4aeda52fc7c5809052e
+data/invalid/gh-223.pdf:
+  :bytes: 108807
+  :md5: 227b93c7734118d3147e9ec6e4950653
+data/invalid/gh-224.pdf:
+  :bytes: 108807
+  :md5: 3e5a57f61754826fbbbbd653e73167dc
+data/invalid/gh-227.pdf:
+  :bytes: 108807
+  :md5: 73a3be1957f118f36fb92d677f962a2d
+data/invalid/gh-228.pdf:
+  :bytes: 108807
+  :md5: 0a58afacb9d6f43cbf9e1afaac934b87
+data/invalid/gh-229.pdf:
+  :bytes: 89283
+  :md5: e70783e6b59764932e745f55e2647ff9
+data/invalid/gh-230.pdf:
+  :bytes: 89283
+  :md5: ddc6c8bb189c23a24937dcc7a1154bd1
+data/invalid/gh-231.pdf:
+  :bytes: 89283
+  :md5: '024844d3602ad508e57b9ca5602a913c'
+data/invalid/gh-232.pdf:
+  :bytes: 89283
+  :md5: e5c8f6e8e2a98edf78a0a4a2c87aa6b3
+data/invalid/gh-234.pdf:
+  :bytes: 108807
+  :md5: bfa0291807642919d6bf62de68044fef
+data/invalid/gh-235.pdf:
+  :bytes: 108807
+  :md5: e594ba3eb27a8aca07f023cd161faa50
+data/invalid/gh-236.pdf:
+  :bytes: 108807
+  :md5: a300e41135e95dbd4608109ba9703328
+data/invalid/gh-237.pdf:
+  :bytes: 89283
+  :md5: 561700c4ae0936f4822531466762d875
+data/invalid/gh-238.pdf:
+  :bytes: 108807
+  :md5: 5c885f481556eb84f1ee858d105401a1
+data/invalid/gh-239.pdf:
+  :bytes: 89283
+  :md5: 1088d8fbb4adada3ed14fb8bf36434f0
+data/invalid/gh-240.pdf:
+  :bytes: 89283
+  :md5: 2b63985a234cacf82de883c0d0495eef
+data/invalid/gh-241.pdf:
+  :bytes: 6332178
+  :md5: 6286a6ad6ceb676f9a1ae955432e7279
+data/invalid/gh-242.pdf:
+  :bytes: 6332178
+  :md5: f37d3261253f2c3a129baad8407397a8
+data/invalid/gh-243.pdf:
+  :bytes: 1093
+  :md5: b05f1de30a2b356c9fe807cf59452ee8
+data/invalid/gh-244.pdf:
+  :bytes: 1093
+  :md5: dfd286c1cd402c4eb77a869aaf370c62
+data/invalid/gh-245.pdf:
+  :bytes: 19262
+  :md5: de39ddcfe81cedb111304ad6988a2484
 data/invalid/invalid_pages.pdf:
   :bytes: 108807
   :md5: 345670e7d5533a831184603d31dfc2bb
@@ -209,6 +290,9 @@ data/invalid/linearized_bad_xref_offset.pdf:
 data/invalid/missing_pages_dict.pdf:
   :bytes: 280
   :md5: d2153a115692da4fd5937b1eec842379
+data/invalid/negative-xref-offset.pdf:
+  :bytes: 6147
+  :md5: f6be07ae5b4d7e9157914dd9d6b29c7f
 data/invalid/no_eof.pdf:
   :bytes: 9652
   :md5: a641e07a03b3cce7d6f43f5fe7f8695b
@@ -218,12 +302,18 @@ data/invalid/no_trailer.pdf:
 data/invalid/page_reference_is_not_a_dict.pdf:
   :bytes: 108807
   :md5: 7a6da0a240b4c3dea52308502b051cb5
+data/invalid/stream_missing_endobj.pdf:
+  :bytes: 998
+  :md5: 624687838f3445a4bd8a1f8dafe65810
 data/invalid/trailer_is_not_a_dict.pdf:
   :bytes: 9651
   :md5: 2cf861306cb9d19e926a079f54ad4e19
 data/invalid/trailer_root_is_not_a_dict.pdf:
   :bytes: 108807
   :md5: e00b7fc6999ca722aa31d2bb90f1e5d0
+data/invalid/xref_offset_too_low.pdf:
+  :bytes: 1054
+  :md5: d3c06fd6d670b0bed3b6347b5c4561a2
 data/invisible.pdf:
   :bytes: 14364
   :md5: 563f7ec8eb2c4d54f00fd85d807580c0
@@ -260,6 +350,9 @@ data/mediabox_and_cropbox_are_references.pdf:
 data/mediabox_missing.pdf:
   :bytes: 14875
   :md5: 51560e94565ee1cd9583c388b5aa545a
+data/minimal-xref-1.pdf:
+  :bytes: 739
+  :md5: c9ef70bcf0d39ce90e993b6aec606b42
 data/minimal.pdf:
   :bytes: 739
   :md5: b5808604069f9f61d94e0660409616ba
@@ -272,6 +365,12 @@ data/nested_form_xobject_another.pdf:
 data/no_text_spaces.pdf:
   :bytes: 2058403
   :md5: f1167a44c687e6dc4fcffb451598c502
+data/octal101.pdf:
+  :bytes: 739
+  :md5: eb8d6048feb4512bef783eea6de27244
+data/octal74.pdf:
+  :bytes: 739
+  :md5: d30dfbc3a9d7799e0311cd59dfa2a6a5
 data/one-byte-identity.pdf:
   :bytes: 13941
   :md5: a5e0693ee17aa8e53e9a140e9b9ccf97
@@ -311,6 +410,9 @@ data/pdfwriter-manual.pdf:
 data/portrait.pdf:
   :bytes: 288466
   :md5: dc2413fb949ee78fc1e2319ca4ffcd93
+data/prev0.pdf:
+  :bytes: 753
+  :md5: 5c729e47a5bd097d312df70f913c6349
 data/prince1.pdf:
   :bytes: 679595
   :md5: a6dff45e93532535321b76758676a23f
@@ -320,6 +422,15 @@ data/prince2.pdf:
 data/rotate-180.pdf:
   :bytes: 17738
   :md5: 5ab145b4527aabb75532d9b990f6df0c
+data/rotate-270-then-undo-inside-bt.pdf:
+  :bytes: 1091
+  :md5: 1a27af6fc501499dc89f728db0526240
+data/rotate-90-then-undo-with-br-text.pdf:
+  :bytes: 1202
+  :md5: d86bb1a0cb9b2fdde5bb43d3f7cd1e9a
+data/rotate-90-then-undo.pdf:
+  :bytes: 1253
+  :md5: 198b5e4197643180a6d4e1659e7baf89
 data/rotate-then-undo.pdf:
   :bytes: 1191
   :md5: c14ac0c2669d63988c07c71f75c28b39
@@ -341,12 +452,33 @@ data/standard_font_with_a_difference.pdf:
 data/standard_font_with_no_difference.pdf:
   :bytes: 856
   :md5: 1d59995aefe22d8a8859c1c217dddcc9
+data/stream-with-extra-byte.z:
+  :bytes: 516
+  :md5: cb7b8af4921811eb51d1d22a4194a6fe
+data/stream-with-indirect-filters.pdf:
+  :bytes: 1089
+  :md5: 1c3a3b5454d39a5ee6886ef3e81cc266
 data/surrogate_pair_integration_sample.pdf:
   :bytes: 1210387
   :md5: abc393e941d2aeb7a64f5e2ab1b58a92
 data/symbol.pdf:
   :bytes: 1055
   :md5: 57941286e6442f5c0b295611a99e0f56
+data/text_outside_cropbox_and_mediabox.pdf:
+  :bytes: 1388
+  :md5: 853edffb3c14d2e223e6f895e503097c
+data/textwrapcr.pdf:
+  :bytes: 739
+  :md5: 9700990dd8adb5d2bb83fc5f4af5c2ae
+data/textwrapcrlf.pdf:
+  :bytes: 739
+  :md5: aa1a41bcd5aaaeaa6d247e51dd853093
+data/textwraplf.pdf:
+  :bytes: 739
+  :md5: faefe55f50f9e3d32886da39e4cfdca9
+data/textwraplfcr.pdf:
+  :bytes: 739
+  :md5: a3d37d948a81cf019f757aba808e6aa0
 data/times-with-control-character.pdf:
   :bytes: 904
   :md5: 4bd7309a3f190ede68a88bb2be8bf237
diff --git a/spec/integrity_spec.rb b/spec/integrity_spec.rb
index b93a833..3052494 100644
--- a/spec/integrity_spec.rb
+++ b/spec/integrity_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 require 'yaml'
diff --git a/spec/lzw_spec.rb b/spec/lzw_spec.rb
index 558c3e8..136a41b 100644
--- a/spec/lzw_spec.rb
+++ b/spec/lzw_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::LZW do
diff --git a/spec/object_hash_spec.rb b/spec/object_hash_spec.rb
index 829f63c..c74be5c 100644
--- a/spec/object_hash_spec.rb
+++ b/spec/object_hash_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::ObjectHash do
@@ -374,28 +375,6 @@ describe PDF::Reader::ObjectHash do
 
   describe "#page_references" do
 
-    context "with cairo-unicode.pdf" do
-      it "returns an ordered array of references to page objects" do
-        filename = pdf_spec_file("cairo-unicode")
-        h = PDF::Reader::ObjectHash.new(filename)
-
-        arr = h.page_references
-        expect(arr.size).to eql(4)
-        expect(arr.map { |ref| ref.id }).to eql([4, 7, 10, 13])
-      end
-    end
-
-    context "with indirect_kids_array.pdf" do
-      it "returns an ordered array of references to page objects" do
-        filename = pdf_spec_file("indirect_kids_array")
-        h = PDF::Reader::ObjectHash.new(filename)
-
-        arr = h.page_references
-        expect(arr.size).to eql(1)
-        expect(arr.map { |ref| ref.id }).to eql([6])
-      end
-    end
-
     it "raises a MalformedPDFError if dereferenced value is not a dict" do
       filename = pdf_spec_file("page_reference_is_not_a_dict")
       h = PDF::Reader::ObjectHash.new(filename)
diff --git a/spec/object_stream_spec.rb b/spec/object_stream_spec.rb
index 3f99793..72f17a3 100644
--- a/spec/object_stream_spec.rb
+++ b/spec/object_stream_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::ObjectStream do
diff --git a/spec/overlapping_runs_filter_spec.rb b/spec/overlapping_runs_filter_spec.rb
index f84e0f4..e2ea2e3 100644
--- a/spec/overlapping_runs_filter_spec.rb
+++ b/spec/overlapping_runs_filter_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::OverlappingRunsFilter, "#exclude_redundant_runs" do
@@ -44,6 +45,19 @@ describe PDF::Reader::OverlappingRunsFilter, "#exclude_redundant_runs" do
     end
   end
 
+  context "when there's two identically positioned runs with different text" do
+    let(:runs) do
+      [
+        PDF::Reader::TextRun.new(30, 700, 50, 12, "Hello"),
+        PDF::Reader::TextRun.new(30, 700, 50, 12, "Bacon"),
+      ]
+    end
+
+    it "returns both of the runs" do
+      expect(result).to match_array(runs)
+    end
+  end
+
   context "when the second run overlaps the right edge of the first" do
     context "by 50%" do
       let(:runs) do
diff --git a/spec/page_layout_spec.rb b/spec/page_layout_spec.rb
index 44e583a..70d5d2c 100644
--- a/spec/page_layout_spec.rb
+++ b/spec/page_layout_spec.rb
@@ -1,9 +1,10 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::PageLayout do
   describe "#to_s" do
     context "with an A4 page" do
-      let(:mediabox) { [0, 0, 595.28, 841.89 ]}
+      let(:mediabox) { PDF::Reader::Rectangle.new(0, 0, 595.28, 841.89)}
 
       context "with no words" do
         subject { PDF::Reader::PageLayout.new([], mediabox)}
@@ -200,6 +201,29 @@ describe PDF::Reader::PageLayout do
           expect(subject.to_s).to eq("bold")
         end
       end
+      context "with one word and the mediabox is provided as a 4-element array" do
+        let!(:runs) do
+          [
+            PDF::Reader::TextRun.new(30, 700, 50, 12, "Hello")
+          ]
+        end
+        subject { PDF::Reader::PageLayout.new(runs, mediabox.to_a)}
+
+        it "returns a correct string and prints a deprecation warning" do
+          expect(subject.to_s).to eq("Hello")
+        end
+      end
     end
+    context "with a page that's too small to fit any of the text" do
+      let(:mediabox) { PDF::Reader::Rectangle.new(0, 0, 46.560, 32.640)}
+      let(:font_size) { 72 }
+
+      it "returns an empty string" do
+        run = PDF::Reader::TextRun.new(0, 0, 50, font_size, "a")
+        layout = PDF::Reader::PageLayout.new([run], mediabox)
+        expect(layout.to_s).to eq("")
+      end
+    end
+
   end
 end
diff --git a/spec/page_spec.rb b/spec/page_spec.rb
index 2ed7003..1119ddf 100644
--- a/spec/page_spec.rb
+++ b/spec/page_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::Page do
@@ -70,6 +71,45 @@ describe PDF::Reader::Page do
     end
   end
 
+  describe "#rectangles" do
+    let!(:page)    { browser.page(1) }
+    let!(:browser) { PDF::Reader.new(pdf_spec_file("all_page_boxes_exist")) }
+
+    it "returns a hash of all the different boxes" do
+      expect(page.attributes[:ArtBox]).to_not be_empty
+      expect(page.attributes[:BleedBox]).to_not be_empty
+      expect(page.attributes[:CropBox]).to_not be_empty
+      expect(page.attributes[:MediaBox]).to_not be_empty
+      expect(page.attributes[:TrimBox]).to_not be_empty
+
+      expect(page.rectangles).to eq(
+        {
+          ArtBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+          BleedBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+          CropBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+          MediaBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+          TrimBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+        }
+      )
+    end
+
+    context "mediabox and cropbox are references" do
+      let!(:browser) { PDF::Reader.new(pdf_spec_file("mediabox_and_cropbox_are_references")) }
+
+      it "returns a non-reference for the dimensions of the boxes" do
+        expect(page.rectangles).to eq(
+          {
+            ArtBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+            BleedBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+            CropBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+            MediaBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+            TrimBox: PDF::Reader::Rectangle.new(0, 0, 612, 792),
+          }
+        )
+      end
+    end
+  end
+
   describe "#walk" do
 
     context "with page 1 of cairo-basic.pdf" do
@@ -111,6 +151,26 @@ describe PDF::Reader::Page do
         expect(callbacks.size).to eql(16)
         expect(callbacks.first).to eql(:page=)
       end
+
+      context "with a receiver that implements a method not type checked by ValidatingReceiver" do
+
+        before do
+          # This test is speecifically for confirming a receiver method is called, even if that
+          # method isn't one that ValidatingReceiver is type checking. If the following assertion
+          # ever fails, then we should update this spec to a different method not mentioned in
+          # ValidatingReceiver
+          expect(PDF::Reader::ValidatingReceiver.methods).to_not include(
+            :set_rgb_color_for_nonstroking
+          )
+        end
+
+        it "calls the receiver method as expected" do
+          receiver = double(set_rgb_color_for_nonstroking: true)
+          page.walk(receiver)
+          expect(receiver).to have_received(:set_rgb_color_for_nonstroking).twice
+        end
+      end
+
     end
   end
 
diff --git a/spec/page_state_spec.rb b/spec/page_state_spec.rb
index c3529ba..22ff602 100644
--- a/spec/page_state_spec.rb
+++ b/spec/page_state_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::PageState do
@@ -468,10 +469,10 @@ describe PDF::Reader::PageState do
                 it "alters the text matrix" do
                   state.process_glyph_displacement(2, 2, true)
 
-                  expect(state.trm_transform(0,0)).to eq([64.976, 700])
-                  expect(state.trm_transform(0,1)).to eq([64.976, 712])
-                  expect(state.trm_transform(1,0)).to eq([76.976, 700])
-                  expect(state.trm_transform(1,1)).to eq([76.976, 712])
+                  expect(state.trm_transform(0,0)).to eq([63.976, 700])
+                  expect(state.trm_transform(0,1)).to eq([63.976, 712])
+                  expect(state.trm_transform(1,0)).to eq([75.976, 700])
+                  expect(state.trm_transform(1,1)).to eq([75.976, 712])
                 end
               end
             end
@@ -512,10 +513,10 @@ describe PDF::Reader::PageState do
                 it "alters the text matrix" do
                   state.process_glyph_displacement(2, 2, false)
 
-                  expect(state.trm_transform(0,0)).to eq([64.976, 700])
-                  expect(state.trm_transform(0,1)).to eq([64.976, 712])
-                  expect(state.trm_transform(1,0)).to eq([76.976, 700])
-                  expect(state.trm_transform(1,1)).to eq([76.976, 712])
+                  expect(state.trm_transform(0,0)).to eq([63.976, 700])
+                  expect(state.trm_transform(0,1)).to eq([63.976, 712])
+                  expect(state.trm_transform(1,0)).to eq([75.976, 700])
+                  expect(state.trm_transform(1,1)).to eq([75.976, 712])
                 end
               end
               context "a word boundary" do
@@ -523,10 +524,10 @@ describe PDF::Reader::PageState do
                 it "alters the text matrix" do
                   state.process_glyph_displacement(2, 2, true)
 
-                  expect(state.trm_transform(0,0)).to eq([64.976, 700])
-                  expect(state.trm_transform(0,1)).to eq([64.976, 712])
-                  expect(state.trm_transform(1,0)).to eq([76.976, 700])
-                  expect(state.trm_transform(1,1)).to eq([76.976, 712])
+                  expect(state.trm_transform(0,0)).to eq([63.976, 700])
+                  expect(state.trm_transform(0,1)).to eq([63.976, 712])
+                  expect(state.trm_transform(1,0)).to eq([75.976, 700])
+                  expect(state.trm_transform(1,1)).to eq([75.976, 712])
                 end
               end
             end
@@ -565,10 +566,10 @@ describe PDF::Reader::PageState do
                 it "alters the text matrix" do
                   state.process_glyph_displacement(2, 2, false)
 
-                  expect(state.trm_transform(0,0)).to eq([64.976, 700])
-                  expect(state.trm_transform(0,1)).to eq([64.976, 712])
-                  expect(state.trm_transform(1,0)).to eq([76.976, 700])
-                  expect(state.trm_transform(1,1)).to eq([76.976, 712])
+                  expect(state.trm_transform(0,0)).to eq([63.976, 700])
+                  expect(state.trm_transform(0,1)).to eq([63.976, 712])
+                  expect(state.trm_transform(1,0)).to eq([75.976, 700])
+                  expect(state.trm_transform(1,1)).to eq([75.976, 712])
                 end
               end
               context "a word boundary" do
@@ -576,10 +577,10 @@ describe PDF::Reader::PageState do
                 it "alters the text matrix" do
                   state.process_glyph_displacement(2, 2, true)
 
-                  expect(state.trm_transform(0,0)).to eq([65.976, 700])
-                  expect(state.trm_transform(0,1)).to eq([65.976, 712])
-                  expect(state.trm_transform(1,0)).to eq([77.976, 700])
-                  expect(state.trm_transform(1,1)).to eq([77.976, 712])
+                  expect(state.trm_transform(0,0)).to eq([63.976, 700])
+                  expect(state.trm_transform(0,1)).to eq([63.976, 712])
+                  expect(state.trm_transform(1,0)).to eq([75.976, 700])
+                  expect(state.trm_transform(1,1)).to eq([75.976, 712])
                 end
               end
             end
diff --git a/spec/page_text_receiver_spec.rb b/spec/page_text_receiver_spec.rb
index f3b29ae..9908bf9 100644
--- a/spec/page_text_receiver_spec.rb
+++ b/spec/page_text_receiver_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::PageTextReceiver do
diff --git a/spec/parser_spec.rb b/spec/parser_spec.rb
index 2e2600c..99c42f9 100644
--- a/spec/parser_spec.rb
+++ b/spec/parser_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::Parser do
@@ -57,14 +58,35 @@ describe PDF::Reader::Parser do
     expect(parse_string("(x\rx)").parse_token).to eql("x\nx")
     expect(parse_string("(x\r\nx)").parse_token).to eql("x\nx")
     expect(parse_string("(x\\rx)").parse_token).to eql("x\rx")
+    expect(parse_string("(x\\r\\nx)").parse_token).to eql("x\r\nx")
     expect(parse_string("(\\rx)").parse_token).to eql("\rx")
     expect(parse_string("(\\r)").parse_token).to eql("\r")
-    expect(parse_string("(x\n\rx)").parse_token).to eql("x\nx")
+    expect(parse_string("(x\n\rx)").parse_token).to eql("x\n\nx")
     expect(parse_string("(x \\\nx)").parse_token).to eql("x x")
     expect(parse_string("(\\\\f)").parse_token).to eql("\\f")
     expect(parse_string("([test])").parse_token).to eql("[test]")
   end
 
+  it "parses invalid octals correctly" do
+    expect(parse_string("(x \\1019 x)").parse_token).to eql("x A9 x")
+    expect(parse_string("(x \\618 x)").parse_token).to eql("x 18 x")
+    expect(parse_string("(x \\18 x)").parse_token).to eql("x \x018 x")
+    expect(parse_string("(x \\5019 x)").parse_token).to eql("x A9 x")
+  end
+
+  it "parses single EOLs (NL, CRNL, CR) correctly" do
+    expect(parse_string("(x\ry)").parse_token).to eql("x\ny")
+    expect(parse_string("(x\ny)").parse_token).to eql("x\ny")
+    expect(parse_string("(x\r\ny)").parse_token).to eql("x\ny")
+  end
+
+  it "parses multiple EOLs (NL, CRNL, CR) correctly" do
+    expect(parse_string("(x\r\r\ny)").parse_token).to eql("x\n\ny")
+  end
+
+  it "parses reverse solidus (backslash) line wrap escapes correctly" do
+    expect(parse_string("(a\\\nb\\\rc\\\r\nd").parse_token).to eql("abcd")
+  end
   it "parses a Unicode string correctly" do
     seq = {
       # key                 source                  expected               confusing to
@@ -109,6 +131,40 @@ describe PDF::Reader::Parser do
     expect(parser.parse_token).to eql(:James)
   end
 
+  # PDF Spec 7.3.4.2 Table 3
+  it "parses reverse solidus (backslash) escapes correctly" do
+    expect(parse_string("(\\n)").parse_token).to eql("\x0A")
+    expect(parse_string("(\\r)").parse_token).to eql("\x0D")
+    expect(parse_string("(\\t)").parse_token).to eql("\x09")
+    expect(parse_string("(\\b)").parse_token).to eql("\x08")
+    expect(parse_string("(\\f)").parse_token).to eql("\x0C")
+    expect(parse_string("(\\())").parse_token).to eql("(")
+    expect(parse_string("(\\))").parse_token).to eql(")")
+    expect(parse_string("(\\\\)").parse_token).to eql("\x5C")
+  end
+
+  it "parses unescaped EOL chars correctly" do
+    expect(parse_string("(A\nB\rC\r\nD").parse_token).to eql("A\x0aB\x0aC\x0aD")
+  end
+
+  it "parses reverse solidus (backslash) invalid escapes correctly" do
+    expect(parse_string("(\\a)").parse_token).to eql("a")
+    expect(parse_string("(\\c)").parse_token).to eql("c")
+    expect(parse_string("(\\d)").parse_token).to eql("d")
+    expect(parse_string("(\\e)").parse_token).to eql("e")
+    expect(parse_string("(\\z)").parse_token).to eql("z")
+    expect(parse_string("(\\])").parse_token).to eql("]")
+    expect(parse_string("(\\[)").parse_token).to eql("[")
+  end
+
+  it "parses reverse solidus (backslash) combination escapes correctly" do
+    expect(parse_string("(\\a)").parse_token).to eql("a")
+  end
+
+  it "parses reverse solidus (backslash) combination escapes correctly" do
+    expect(parse_string("(\\a)").parse_token).to eql("a")
+  end
+
   it "parses a hex string correctly" do
     expect(parse_string("<48656C6C6F>").parse_token).to eql("Hello")
   end
diff --git a/spec/reader/filter/ascii85_spec.rb b/spec/reader/filter/ascii85_spec.rb
index 8d58990..ce40535 100644
--- a/spec/reader/filter/ascii85_spec.rb
+++ b/spec/reader/filter/ascii85_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::Filter::Ascii85 do
diff --git a/spec/reader/filter/ascii_hex_spec.rb b/spec/reader/filter/ascii_hex_spec.rb
index 092a831..ac233d5 100644
--- a/spec/reader/filter/ascii_hex_spec.rb
+++ b/spec/reader/filter/ascii_hex_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::Filter::AsciiHex do
diff --git a/spec/reader/filter/flate_spec.rb b/spec/reader/filter/flate_spec.rb
index 85fee3a..09a7387 100644
--- a/spec/reader/filter/flate_spec.rb
+++ b/spec/reader/filter/flate_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::Filter::Flate do
@@ -13,6 +14,19 @@ describe PDF::Reader::Filter::Flate do
       end
     end
 
+    context "an RFC1950 (zlib) deflated stream with an extra byte on the end" do
+      let(:deflated_path) {
+        File.dirname(__FILE__) + "/../../data/stream-with-extra-byte.z"
+      }
+      let(:deflated_data) { binread(deflated_path) }
+      it "inflates correctly" do
+        filter = PDF::Reader::Filter::Flate.new
+        result = filter.filter(deflated_data)
+        expect(result).to start_with("q")
+        expect(result).to end_with("ET\n")
+      end
+    end
+
     context "a raw RFC1951 deflated stream" do
       let(:deflated_path) {
         File.dirname(__FILE__) + "/../../data/hello-world.deflate"
diff --git a/spec/reader/filter/lzw_spec.rb b/spec/reader/filter/lzw_spec.rb
index e223324..845b259 100644
--- a/spec/reader/filter/lzw_spec.rb
+++ b/spec/reader/filter/lzw_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::Filter::Lzw do
diff --git a/spec/reader/filter/null_spec.rb b/spec/reader/filter/null_spec.rb
index 3529b67..34fae73 100644
--- a/spec/reader/filter/null_spec.rb
+++ b/spec/reader/filter/null_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::Filter::Null do
diff --git a/spec/reader/filter/run_length_spec.rb b/spec/reader/filter/run_length_spec.rb
index f5fb890..0c3e126 100644
--- a/spec/reader/filter/run_length_spec.rb
+++ b/spec/reader/filter/run_length_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::Filter::RunLength do
diff --git a/spec/reader/orientation_detector_spec.rb b/spec/reader/orientation_detector_spec.rb
deleted file mode 100644
index 10adb21..0000000
--- a/spec/reader/orientation_detector_spec.rb
+++ /dev/null
@@ -1,69 +0,0 @@
-# coding: utf-8
-
-describe PDF::Reader::OrientationDetector do
-  describe "#orientation" do
-
-    context "with a portrait page and no rotation" do
-      let!(:detector) {
-        PDF::Reader::OrientationDetector.new(:MediaBox => [0, 0, 612, 792])
-      }
-      it "returns portrait" do
-        expect(detector.orientation).to eq('portrait')
-      end
-    end
-
-    context "with a portrait page and -90° rotation" do
-      let!(:detector) {
-        PDF::Reader::OrientationDetector.new(:MediaBox => [0, 0, 612, 792], :Rotate => 270)
-      }
-      it "returns landscape" do
-        expect(detector.orientation).to eq('landscape')
-      end
-    end
-
-    context "with a portrait page and 360° rotation" do
-      let!(:detector) {
-        PDF::Reader::OrientationDetector.new(:MediaBox => [0, 0, 612, 792], :Rotate => 360)
-      }
-      it "returns portrait" do
-        expect(detector.orientation).to eq('portrait')
-      end
-    end
-
-    context "with a landscape page and no rotation" do
-      let!(:detector) {
-        PDF::Reader::OrientationDetector.new(:MediaBox => [0, 0, 792, 612])
-      }
-      it "returns landscape" do
-        expect(detector.orientation).to eq('landscape')
-      end
-    end
-
-    context "with a landscape page and 90° rotation" do
-      let!(:detector) {
-        PDF::Reader::OrientationDetector.new(:MediaBox => [0, 0, 792, 612], :Rotate => 90)
-      }
-      it "returns portrait" do
-        expect(detector.orientation).to eq('portrait')
-      end
-    end
-
-    context "with a landscape page and 360° rotation" do
-      let!(:detector) {
-        PDF::Reader::OrientationDetector.new(:MediaBox => [0, 0, 792, 612], :Rotate => 360)
-      }
-      it "returns landscape" do
-        expect(detector.orientation).to eq('landscape')
-      end
-    end
-
-    context "with a portrait page that uses negative Y co-ordinates" do
-      let!(:detector) {
-        PDF::Reader::OrientationDetector.new(:MediaBox => [0,792,612,0])
-      }
-      it "returns portrait" do
-        expect(detector.orientation).to eq('portrait')
-      end
-    end
-  end
-end
diff --git a/spec/reader/register_receiver_spec.rb b/spec/reader/register_receiver_spec.rb
index f3bf19b..ee16608 100644
--- a/spec/reader/register_receiver_spec.rb
+++ b/spec/reader/register_receiver_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # encoding: utf-8
 
 describe PDF::Reader::RegisterReceiver do
diff --git a/spec/reader_spec.rb b/spec/reader_spec.rb
index aa9b78b..0258df8 100644
--- a/spec/reader_spec.rb
+++ b/spec/reader_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader do
diff --git a/spec/reference_spec.rb b/spec/reference_spec.rb
index ad46084..d33f1f1 100644
--- a/spec/reference_spec.rb
+++ b/spec/reference_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::Reference do
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 6311a17..d694e7f 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,3 +1,4 @@
+# typed: strict
 # coding: utf-8
 
 require "rubygems"
diff --git a/spec/stream_spec.rb b/spec/stream_spec.rb
index a44a789..9f255f2 100644
--- a/spec/stream_spec.rb
+++ b/spec/stream_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::Stream do
@@ -83,27 +84,16 @@ end
 EOF
     }
 
-    it "raises a MalformedPDFError" do
-      File.open(pdf_spec_file("zlib_stream_issue"), "rb") do |io|
-        ohash = PDF::Reader::ObjectHash.new(io)
-        ref   = PDF::Reader::Reference.new(30,0)
-        obj   = ohash.object(ref)
-        expect { obj.unfiltered_data }.to raise_error(PDF::Reader::MalformedPDFError)
-      end
-    end
-
-    # Acrobat manages to decode this one, so maybe we can too
-    it "raises makes an effor to decode the stream anyway" do
-      # TODO: if I can find a way to convince the ruby zlib bindings to ignore a checksum failure,
-      #       delete the previous spec and use this one instead
-      pending
-      File.open(pdf_spec_file("zlib_stream_issue"), "rb") do |io|
-        ohash = PDF::Reader::ObjectHash.new(io)
-        ref   = PDF::Reader::Reference.new(30,0)
-        obj   = ohash.object(ref)
+    context "with a zlib stream that has a single trailing garbage byte" do
+      it "makes an effort to decode the stream anyway" do
+        File.open(pdf_spec_file("zlib_stream_issue"), "rb") do |io|
+          ohash = PDF::Reader::ObjectHash.new(io)
+          ref   = PDF::Reader::Reference.new(30,0)
+          obj   = ohash.object(ref)
 
-        expect(obj).to be_a_kind_of(PDF::Reader::Stream)
-        expect(obj.unfiltered_data).to eql(decoded_stream.strip)
+          expect(obj).to be_a_kind_of(PDF::Reader::Stream)
+          expect(obj.unfiltered_data).to eql(decoded_stream.strip)
+        end
       end
     end
   end
diff --git a/spec/support/buffer_helper.rb b/spec/support/buffer_helper.rb
index adc5868..3f685db 100644
--- a/spec/support/buffer_helper.rb
+++ b/spec/support/buffer_helper.rb
@@ -1,3 +1,4 @@
+# typed: true
 # coding: utf-8
 
 module BufferHelper
diff --git a/spec/support/callback_helper.rb b/spec/support/callback_helper.rb
index f636e8b..7b7442e 100644
--- a/spec/support/callback_helper.rb
+++ b/spec/support/callback_helper.rb
@@ -1,3 +1,4 @@
+# typed: true
 # coding: utf-8
 
 class CallbackHelper
diff --git a/spec/support/duck_types/width_calculator.rb b/spec/support/duck_types/width_calculator.rb
index d9b8ede..7836a74 100644
--- a/spec/support/duck_types/width_calculator.rb
+++ b/spec/support/duck_types/width_calculator.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 # All objects that implement the WidthCalculator duck type must conform to
diff --git a/spec/support/encoding_helper.rb b/spec/support/encoding_helper.rb
index ced98a2..a4a275a 100644
--- a/spec/support/encoding_helper.rb
+++ b/spec/support/encoding_helper.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 module EncodingHelper
diff --git a/spec/support/matchers.rb b/spec/support/matchers.rb
new file mode 100644
index 0000000..cf966c3
--- /dev/null
+++ b/spec/support/matchers.rb
@@ -0,0 +1,17 @@
+# typed: false
+# coding: utf-8
+
+# A custom matcher for confirming a Point is close to another point. This is helpful
+# because the x and y co-ordinates of a point are floats so we can't match on them exactly
+RSpec::Matchers.define :be_close_to do |close_to_point|
+  match do |actual_point|
+    (actual_point.x >= close_to_point.x - 0.01) &&
+      (actual_point.x <= close_to_point.x + 0.01) &&
+      (actual_point.y >= close_to_point.y - 0.01) &&
+      (actual_point.y <= close_to_point.y + 0.01)
+  end
+  failure_message do |actual_point|
+    "expected that (#{actual_point.x},#{actual_point.y}) would be within" +
+      " 0.01 of (#{close_to_point.x},#{close_to_point.y})"
+  end
+end
diff --git a/spec/support/parser_helper.rb b/spec/support/parser_helper.rb
index 79681e1..812708c 100644
--- a/spec/support/parser_helper.rb
+++ b/spec/support/parser_helper.rb
@@ -1,3 +1,4 @@
+# typed: true
 # coding: utf-8
 
 module ParserHelper
diff --git a/spec/support/reader_spec_helper.rb b/spec/support/reader_spec_helper.rb
index 8394782..8917126 100644
--- a/spec/support/reader_spec_helper.rb
+++ b/spec/support/reader_spec_helper.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 # some helper methods available to all specs
diff --git a/spec/syncronized_cache_spec.rb b/spec/syncronized_cache_spec.rb
index 1e40e89..09730b4 100644
--- a/spec/syncronized_cache_spec.rb
+++ b/spec/syncronized_cache_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 require 'pdf/reader/synchronized_cache'
diff --git a/spec/text_run_spec.rb b/spec/text_run_spec.rb
index 8814575..8b2102e 100644
--- a/spec/text_run_spec.rb
+++ b/spec/text_run_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::TextRun do
diff --git a/spec/transformation_matrix_spec.rb b/spec/transformation_matrix_spec.rb
index 6436bfa..186a746 100644
--- a/spec/transformation_matrix_spec.rb
+++ b/spec/transformation_matrix_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 # The results in these specs were generated at
@@ -5,14 +6,18 @@
 
 describe PDF::Reader::TransformationMatrix do
   describe "#multiply!" do
-    class PDF::Reader::TransformationMatrix
-      # a helper method for tests
-      def multiply_with_an_object!(m2)
-        multiply!(
-          m2.a, m2.b,
-          m2.c, m2.d,
-          m2.e, m2.f
-        )
+    module PDF
+      class Reader
+        class TransformationMatrix
+          # a helper method for tests
+          def multiply_with_an_object!(m2)
+            multiply!(
+              m2.a, m2.b,
+              m2.c, m2.d,
+              m2.e, m2.f
+            )
+          end
+        end
       end
     end
     context "with [2,3,0   4,5,0   6 7 1]" do
diff --git a/spec/width_calculator/built_in_spec.rb b/spec/width_calculator/built_in_spec.rb
index 7e31d08..9c7ac10 100644
--- a/spec/width_calculator/built_in_spec.rb
+++ b/spec/width_calculator/built_in_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::WidthCalculator::BuiltIn do
@@ -27,6 +28,23 @@ describe PDF::Reader::WidthCalculator::BuiltIn do
       end
     end
 
+    context "With Helvetica and a custom encoding that overwrites standard codepoints" do
+      # Codepoint 196 (tilde) is mapped to German umlaut Ä
+      let(:encoding)     { PDF::Reader::Encoding.new({:Differences => [196, :Adieresis]}) }
+      let(:font)         { double(:basefont => :Helvetica,
+                                  :subtype => :Type1,
+                                  :encoding => encoding) }
+
+      let(:width_calculator) {
+        PDF::Reader::WidthCalculator::BuiltIn.new(font)
+      }
+
+      it "returns the correct width for the overwritten codepoint" do
+        # tilde = 333, Ä = 667
+        expect(width_calculator.glyph_width(196)).to eq(667)
+      end
+    end
+
     context "With Foo, a font that isn't part of the built-in 14" do
       let!(:encoding)     { PDF::Reader::Encoding.new(:WinAnsiEncoding) }
       let!(:font)         { double(:basefont => :Foo,
diff --git a/spec/width_calculator/composite_spec.rb b/spec/width_calculator/composite_spec.rb
index cb4dc38..2f63519 100644
--- a/spec/width_calculator/composite_spec.rb
+++ b/spec/width_calculator/composite_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::WidthCalculator::Composite do
diff --git a/spec/width_calculator/true_type_spec.rb b/spec/width_calculator/true_type_spec.rb
index d68394f..7aef69c 100644
--- a/spec/width_calculator/true_type_spec.rb
+++ b/spec/width_calculator/true_type_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::WidthCalculator::TrueType do
diff --git a/spec/width_calculator/type_one_or_three_spec.rb b/spec/width_calculator/type_one_or_three_spec.rb
index 38f4266..c2d6356 100644
--- a/spec/width_calculator/type_one_or_three_spec.rb
+++ b/spec/width_calculator/type_one_or_three_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::WidthCalculator::TypeOneOrThree do
diff --git a/spec/width_calculator/type_zero_spec.rb b/spec/width_calculator/type_zero_spec.rb
index 33251a7..fc01d63 100644
--- a/spec/width_calculator/type_zero_spec.rb
+++ b/spec/width_calculator/type_zero_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 describe PDF::Reader::WidthCalculator::TypeZero do
diff --git a/spec/xref_spec.rb b/spec/xref_spec.rb
index 16020d6..92f5705 100644
--- a/spec/xref_spec.rb
+++ b/spec/xref_spec.rb
@@ -1,3 +1,4 @@
+# typed: false
 # coding: utf-8
 
 # expose the xrefs hash inside the XRef class so we can ensure it's built correctly
diff --git a/tools/fuzz.rb b/tools/fuzz.rb
new file mode 100755
index 0000000..cd28d69
--- /dev/null
+++ b/tools/fuzz.rb
@@ -0,0 +1,300 @@
+#!/usr/bin/env ruby
+###################################################
+# ----------------------------------------------- #
+# Fuzz pdf-reader Ruby gem with mutated PDF files #
+# ----------------------------------------------- #
+#                                                 #
+# Each test case is written to 'fuzz.pdf' in the  #
+# current working directory.                      #
+#                                                 #
+# Crashes and the associated backtrace are saved  #
+# in the 'crashes' directory in the current       #
+# working directory.                              #
+#                                                 #
+###################################################
+# ~ bcoles
+
+require 'date'
+require 'pdf-reader'
+require 'colorize'
+require 'fileutils'
+require 'timeout'
+require 'securerandom'
+
+VERBOSE = false
+OUTPUT_DIR = "#{Dir.pwd}/crashes".freeze
+
+#
+# Show usage
+#
+def usage
+  puts 'Usage: ./fuzz.rb <FILE1> [FILE2] [FILE3] [...]'
+  puts 'Example: ./tools/fuzz.rb spec/data/**.pdf'
+  exit 1
+end
+
+#
+# Print status message
+#
+# @param [String] msg message to print
+#
+def print_status(msg = '')
+  puts '[*] '.blue + msg if VERBOSE
+end
+
+#
+# Print progress messages
+#
+# @param [String] msg message to print
+#
+def print_good(msg = '')
+  puts '[+] '.green + msg if VERBOSE
+end
+
+#
+# Print error message
+#
+# @param [String] msg message to print
+#
+def print_error(msg = '')
+  puts '[-] '.red + msg
+end
+
+#
+# Setup environment
+#
+def setup
+  FileUtils.mkdir_p OUTPUT_DIR unless File.directory? OUTPUT_DIR
+rescue => e
+  print_error "Could not create output directory '#{OUTPUT_DIR}': #{e}"
+  exit 1
+end
+
+#
+# Generate a mutated PDF file with a single mitated byte
+#
+# @param [Path] f path to PDF file
+#
+def mutate_byte(f)
+  data = IO.binread f
+  position = SecureRandom.random_number data.size
+  new_byte = SecureRandom.random_number 256
+  new_data = data.dup.tap { |s| s.setbyte(position, new_byte) }
+
+  File.open(@fuzz_outfile, 'w') do |file|
+    file.write new_data
+  end
+end
+
+#
+# Generate a mutated PDF file with multiple mutated bytes
+#
+# @param [Path] f path to PDF file
+#
+def mutate_bytes(f)
+  data = IO.binread f
+  fuzz_factor = 200
+  num_writes = rand((data.size / fuzz_factor.to_f).ceil) + 1
+
+  new_data = data.dup
+  num_writes.times do
+    position = SecureRandom.random_number data.size
+    new_byte = SecureRandom.random_number 256
+    new_data.tap { |stream| stream.setbyte position, new_byte }
+  end
+
+  File.open(@fuzz_outfile, 'w') do |file|
+    file.write new_data
+  end
+end
+
+#
+# Generate a mutated PDF file with all integers replaced by '-1'
+#
+# @param [Path] f path to PDF file
+#
+def clobber_integers(f)
+  data = IO.binread f
+  new_data = data.dup.gsub(/\d/, '-1')
+
+  File.open(@fuzz_outfile, 'w') do |file|
+    file.write new_data
+  end
+end
+
+#
+# Generate a mutated PDF file with all strings 3 characters or longer
+# replaced with 2000 'A' characters
+#
+# @param [Path] f path to PDF file
+#
+def clobber_strings(f)
+  data = IO.binread f
+  new_data = data.dup.gsub(/[a-zA-Z]{3,}/, 'A' * 2000)
+
+  File.open(@fuzz_outfile, 'w') do |file|
+    file.write new_data
+  end
+end
+
+#
+# Read a PDF file
+#
+# @param [String] f path to PDF file
+#
+def read(f)
+  print_status "Processing '#{f}'"
+  begin
+    reader = PDF::Reader.new f
+  rescue PDF::Reader::MalformedPDFError
+    print_status "Could not parse PDF '#{f}': PDF is malformed"
+    return
+  rescue PDF::Reader::UnsupportedFeatureError
+    print_status "Could not parse PDF '#{f}': PDF::Reader::UnsupportedFeatureError"
+    return
+  end
+  print_good 'Processing complete'
+
+  print_status "Parsing '#{f}'"
+  begin
+    parse reader
+  rescue PDF::Reader::UnsupportedFeatureError
+    print_status "Could not parse PDF '#{f}': PDF::Reader::UnsupportedFeatureError"
+    return
+  rescue PDF::Reader::MalformedPDFError
+    print_status "Could not parse PDF '#{f}': PDF is malformed"
+    return
+  end
+  print_good 'Parsing complete'
+end
+
+#
+# Parse PDF
+#
+def parse(reader)
+  print_status "Version: #{reader.pdf_version}"
+  print_status "Info: #{reader.info}"
+  print_status "Metadata: #{reader.metadata}"
+  print_status "Objects: #{reader.objects}"
+  print_status "Pages: #{reader.page_count}"
+
+  print_status 'Parsing PDF contents...'
+  contents = ''
+  reader.pages.each do |page|
+    contents << page.fonts.to_s
+    contents << page.text #.force_encoding('utf-8')
+    contents << page.raw_content.force_encoding('utf-8')
+  end
+  # puts contents if VERBOSE
+end
+
+#
+# Show summary of crashes
+#
+def summary
+  puts
+  puts "Complete! Crashes saved to '#{OUTPUT_DIR}'"
+  puts
+  puts `/usr/bin/head -n1 #{OUTPUT_DIR}/*.trace` if File.exist? '/usr/bin/head'
+end
+
+#
+# Report error message to STDOUT
+# and save fuzz test case and backtrace to OUTPUT_DIR
+#
+def report_crash(e)
+  puts " - #{e.message}"
+  puts e.backtrace.first
+  fname = "#{DateTime.now.strftime('%Y%m%d%H%M%S%N')}_crash_#{rand(1000)}"
+  FileUtils.mv @fuzz_outfile, "#{OUTPUT_DIR}/#{fname}.pdf"
+  File.open("#{OUTPUT_DIR}/#{fname}.pdf.trace", 'w') do |file|
+    file.write "#{e.message}\n#{e.backtrace.join "\n"}"
+  end
+end
+
+#
+# Test pdf-reader with the mutated file
+#
+def test
+  Timeout.timeout(@timeout) do
+    read @fuzz_outfile
+  end
+rescue SystemStackError => e
+  report_crash e
+rescue Timeout::Error => e
+  report_crash e
+rescue SyntaxError => e
+  report_crash e
+rescue => e
+  raise e unless e.backtrace.join("\n") =~ %r{pdf-reader}
+  report_crash e
+end
+
+#
+# Generate random byte mutations and run test
+#
+# @param [String] f path to PDF file
+#
+def fuzz_bytes(f)
+  iterations = 1000
+  1.upto(iterations) do |i|
+    print "\r#{(i * 100) / iterations} % (#{i} / #{iterations})"
+    mutate_bytes f
+    test
+  end
+end
+
+#
+# Generate integer mutations and run tests
+#
+# @param [String] f path to PDF file
+#
+def fuzz_integers(f)
+  clobber_integers f
+  test
+end
+
+#
+# Generate string mutations and run tests
+#
+# @param [String] f path to PDF file
+#
+def fuzz_strings(f)
+  clobber_strings f
+  test
+end
+
+puts '-' * 60
+puts '% Fuzzer for pdf-reader Ruby gem'
+puts '-' * 60
+puts
+
+usage if ARGV[0].nil?
+
+setup
+
+@timeout = 15
+@fuzz_outfile = 'fuzz.pdf'
+
+trap 'SIGINT' do
+  puts
+  puts 'Caught interrupt. Exiting...'
+  summary
+  exit 130
+end
+
+ARGV.each do |f|
+  unless File.exist? f
+    print_error "Could not find file '#{f}'"
+    next
+  end
+
+  fuzz_integers f
+  fuzz_strings f
+  fuzz_bytes f
+
+  puts '-' * 60
+end
+
+summary
+
diff --git a/tools/read-pdf.rb b/tools/read-pdf.rb
index 3566221..ecd6d86 100644
--- a/tools/read-pdf.rb
+++ b/tools/read-pdf.rb
@@ -6,7 +6,7 @@
 require 'pdf-reader'
 require 'colorize'
 
-$QUIET = false
+$QUIET = ARGV.delete('--quiet')
 
 #
 # Print status message
@@ -40,7 +40,7 @@ end
 #
 # @param [File] file PDF file
 #
-def read doc
+def read(doc)
   print_status "Processing '#{doc}'"
   begin
     @fname = doc
@@ -60,7 +60,7 @@ def read doc
   rescue PDF::Reader::UnsupportedFeatureError
     print_error "Could not parse PDF '#{doc}': PDF::Reader::UnsupportedFeatureError"
     exit 1
-  rescue PDF::Reader::MalformedPDFError => e
+  rescue PDF::Reader::MalformedPDFError
     print_error "Could not parse PDF '#{doc}': PDF is malformed"
     exit 1
   end
@@ -78,18 +78,27 @@ def parse(reader)
   print_status "Pages: #{reader.page_count}"
 
   print_status 'Parsing PDF contents...'
-  contents = ''
   reader.pages.each do |page|
-    contents << page.text.to_s
-    contents << page.fonts.to_s
-    contents << page.text.to_s
-    contents << page.raw_content.to_s
+    text = page.text.to_s
+    unless $QUIET
+      print_status 'Page text'
+      puts text
+    end
+    text = page.fonts.to_s
+    unless $QUIET
+      print_status 'Page fonts'
+      puts text
+    end
+    text = page.raw_content.to_s
+    unless $QUIET
+      print_status 'Page raw_content'
+      puts text
+    end
   end
-  #puts contents unless $QUIET
 end
 
 def usage
-  print_status "./read-pdf.rb <FILE>"
+  print_status "./read-pdf.rb <FILE> [--quiet]"
   exit 1
 end
 
@@ -103,4 +112,3 @@ else
   print_error "Could not find #{doc}"
   exit 1
 end
-