selenium-webdriver 4.0.0.rc1 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/CHANGES +60 -0
 - data/README.md +1 -1
 - data/lib/selenium/server.rb +62 -48
 - data/lib/selenium/webdriver/atoms/findElements.js +2 -2
 - data/lib/selenium/webdriver/atoms/getAttribute.js +25 -25
 - data/lib/selenium/webdriver/chrome/driver.rb +3 -0
 - data/lib/selenium/webdriver/chrome/features.rb +44 -4
 - data/lib/selenium/webdriver/chrome/options.rb +24 -1
 - data/lib/selenium/webdriver/common/driver.rb +2 -0
 - data/lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb +51 -0
 - data/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +77 -0
 - data/lib/selenium/webdriver/common/driver_extensions/has_context.rb +45 -0
 - data/lib/selenium/webdriver/common/driver_extensions/has_launching.rb +38 -0
 - data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +17 -0
 - data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +87 -18
 - data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +11 -11
 - data/lib/selenium/webdriver/common/driver_extensions/prints_page.rb +1 -1
 - data/lib/selenium/webdriver/common/log_entry.rb +2 -2
 - data/lib/selenium/webdriver/common/manager.rb +3 -13
 - data/lib/selenium/webdriver/common/options.rb +13 -5
 - data/lib/selenium/webdriver/common/profile_helper.rb +1 -7
 - data/lib/selenium/webdriver/common/socket_poller.rb +30 -19
 - data/lib/selenium/webdriver/common/target_locator.rb +28 -0
 - data/lib/selenium/webdriver/common/timeouts.rb +31 -4
 - data/lib/selenium/webdriver/common/window.rb +0 -4
 - data/lib/selenium/webdriver/common/zipper.rb +1 -9
 - data/lib/selenium/webdriver/common.rb +4 -0
 - data/lib/selenium/webdriver/devtools/request.rb +27 -17
 - data/lib/selenium/webdriver/devtools/response.rb +66 -0
 - data/lib/selenium/webdriver/devtools.rb +49 -12
 - data/lib/selenium/webdriver/edge/features.rb +5 -0
 - data/lib/selenium/webdriver/firefox/driver.rb +5 -0
 - data/lib/selenium/webdriver/firefox/features.rb +14 -0
 - data/lib/selenium/webdriver/firefox/options.rb +28 -1
 - data/lib/selenium/webdriver/firefox.rb +0 -1
 - data/lib/selenium/webdriver/remote/bridge.rb +9 -10
 - data/lib/selenium/webdriver/remote/capabilities.rb +1 -0
 - data/lib/selenium/webdriver/remote/commands.rb +1 -0
 - data/lib/selenium/webdriver/remote/driver.rb +2 -1
 - data/lib/selenium/webdriver/safari/driver.rb +1 -1
 - data/lib/selenium/webdriver/safari/options.rb +7 -0
 - data/lib/selenium/webdriver/version.rb +1 -1
 - data/lib/selenium/webdriver.rb +1 -0
 - data/selenium-webdriver.gemspec +2 -2
 - metadata +14 -3
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 9e567f6423da9f54c6c0a42f36f4dbf08ab8dec0fdad4e82d4091e795a7b3584
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 22b0a89de6793d902c4149bf0b87452680b91dc51df3da86752793c9bfde88ee
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: dbc0218b39312e4c1277a544e5ab0cdb735742050827a2f06d60f14c2323c776f5e5e8db0cd7f5e372cfe39e15a6d202daa42bba8bb76ca5ce166522137366a3
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: eb0cfd934645fd48a60b4deaddf7ba207a7f26aaa7c1c8d09971fc61ad05b7a096003df367994881e3daaa40c78008a30a52c58c7794903120f3b217017f5b3d
         
     | 
    
        data/CHANGES
    CHANGED
    
    | 
         @@ -1,3 +1,63 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            4.0.1 (2021-10-19)
         
     | 
| 
      
 2 
     | 
    
         
            +
            =========================
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            Server:
         
     | 
| 
      
 5 
     | 
    
         
            +
              * Fixed download by pointing to new storage location.
         
     | 
| 
      
 6 
     | 
    
         
            +
                - Only supports Selenium 4 versions
         
     | 
| 
      
 7 
     | 
    
         
            +
              * Added default value for Server::get and Server::download to use the latest server version
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            4.0.0 (2021-10-13)
         
     | 
| 
      
 10 
     | 
    
         
            +
            =========================
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            Ruby:
         
     | 
| 
      
 13 
     | 
    
         
            +
              * Updated minimum required Ruby version to 2.6
         
     | 
| 
      
 14 
     | 
    
         
            +
              * Updated minimum required rexml gem version due to vulnerability
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            Chrome:
         
     | 
| 
      
 17 
     | 
    
         
            +
              * Added default values for Network Conditions so no longer need to specify everything
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            Firefox:
         
     | 
| 
      
 20 
     | 
    
         
            +
              * Fixed bug where Firefox prefs were converting snake case to camel case
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            4.0.0.rc3 (2021-10-08)
         
     | 
| 
      
 23 
     | 
    
         
            +
            =========================
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            Ruby:
         
     | 
| 
      
 26 
     | 
    
         
            +
              * Added support for getting timeout values from the driver
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            4.0.0.rc2 (2021-09-30)
         
     | 
| 
      
 29 
     | 
    
         
            +
            =========================
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            DevTools:
         
     | 
| 
      
 32 
     | 
    
         
            +
              * Released selenium-devtools 0.93.0 (2021-09-01)
         
     | 
| 
      
 33 
     | 
    
         
            +
                - adds CDP version 93
         
     | 
| 
      
 34 
     | 
    
         
            +
                - removes CDP version 91
         
     | 
| 
      
 35 
     | 
    
         
            +
              * Released selenium-devtools 0.94.0 (2021-09-22)
         
     | 
| 
      
 36 
     | 
    
         
            +
                - adds CDP version 94
         
     | 
| 
      
 37 
     | 
    
         
            +
                - removes CDP version 92
         
     | 
| 
      
 38 
     | 
    
         
            +
              * Added support for mutating responses in network interception
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
            Ruby:
         
     | 
| 
      
 41 
     | 
    
         
            +
              * Implemented Options#add_option to work for vendor extension capabilities
         
     | 
| 
      
 42 
     | 
    
         
            +
              * Fixed bug for requiring uri (#9825 thanks @flanger001)
         
     | 
| 
      
 43 
     | 
    
         
            +
              * Moved New Window functionality to TargetLocator#new_window to be used with Driver#switch_to
         
     | 
| 
      
 44 
     | 
    
         
            +
              * Deprecated using Manager#new_window
         
     | 
| 
      
 45 
     | 
    
         
            +
              * Changed order of logging output (#9850)
         
     | 
| 
      
 46 
     | 
    
         
            +
              * Added support for web_socket_url capability
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            Chromium:
         
     | 
| 
      
 49 
     | 
    
         
            +
              * Implemented casting functionality
         
     | 
| 
      
 50 
     | 
    
         
            +
              * Implemented ability to launch chromium app
         
     | 
| 
      
 51 
     | 
    
         
            +
              * Implemented support for specifying permissions
         
     | 
| 
      
 52 
     | 
    
         
            +
              * Added support for Chrome-specific Android functionality with #enable_android
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
            Firefox:
         
     | 
| 
      
 55 
     | 
    
         
            +
              * Implemented context functionality
         
     | 
| 
      
 56 
     | 
    
         
            +
              * Added support for Firefox-specific Android functionality with #enable_android
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            Remote:
         
     | 
| 
      
 59 
     | 
    
         
            +
              * Added support for file detector to install Firefox addons from client machine
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
       1 
61 
     | 
    
         
             
            4.0.0.rc1 (2021-09-01)
         
     | 
| 
       2 
62 
     | 
    
         
             
            =========================
         
     | 
| 
       3 
63 
     | 
    
         | 
    
        data/README.md
    CHANGED
    
    
    
        data/lib/selenium/server.rb
    CHANGED
    
    | 
         @@ -57,45 +57,39 @@ module Selenium 
     | 
|
| 
       57 
57 
     | 
    
         | 
| 
       58 
58 
     | 
    
         
             
                CL_RESET = WebDriver::Platform.windows? ? '' : "\r\e[0K"
         
     | 
| 
       59 
59 
     | 
    
         | 
| 
       60 
     | 
    
         
            -
                 
     | 
| 
       61 
     | 
    
         
            -
                   
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
      
 60 
     | 
    
         
            +
                class << self
         
     | 
| 
      
 61 
     | 
    
         
            +
                  #
         
     | 
| 
      
 62 
     | 
    
         
            +
                  # Download the given version of the selenium-server jar and return instance
         
     | 
| 
      
 63 
     | 
    
         
            +
                  #
         
     | 
| 
      
 64 
     | 
    
         
            +
                  # @param [String, Symbol] required_version X.Y.Z defaults to ':latest'
         
     | 
| 
      
 65 
     | 
    
         
            +
                  # @param [Hash] opts
         
     | 
| 
      
 66 
     | 
    
         
            +
                  # @return [Selenium::Server]
         
     | 
| 
      
 67 
     | 
    
         
            +
                  #
         
     | 
| 
       63 
68 
     | 
    
         | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
      
 69 
     | 
    
         
            +
                  def get(required_version = :latest, opts = {})
         
     | 
| 
      
 70 
     | 
    
         
            +
                    new(download(required_version), opts)
         
     | 
| 
      
 71 
     | 
    
         
            +
                  end
         
     | 
| 
       67 
72 
     | 
    
         | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
       69 
     | 
    
         
            -
                   
     | 
| 
      
 73 
     | 
    
         
            +
                  #
         
     | 
| 
      
 74 
     | 
    
         
            +
                  # Download the given version of the selenium-server jar and return location
         
     | 
| 
      
 75 
     | 
    
         
            +
                  #
         
     | 
| 
      
 76 
     | 
    
         
            +
                  # @param [String, Symbol] required_version X.Y.Z defaults to ':latest'
         
     | 
| 
      
 77 
     | 
    
         
            +
                  # @return [String] location of downloaded file
         
     | 
| 
      
 78 
     | 
    
         
            +
                  #
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
                  def download(required_version = :latest)
         
     | 
| 
       70 
81 
     | 
    
         
             
                    required_version = latest if required_version == :latest
         
     | 
| 
       71 
     | 
    
         
            -
                    download_file_name = "selenium-server 
     | 
| 
      
 82 
     | 
    
         
            +
                    download_file_name = "selenium-server-#{required_version}.jar"
         
     | 
| 
       72 
83 
     | 
    
         | 
| 
       73 
84 
     | 
    
         
             
                    return download_file_name if File.exist? download_file_name
         
     | 
| 
       74 
85 
     | 
    
         | 
| 
       75 
86 
     | 
    
         
             
                    begin
         
     | 
| 
       76 
     | 
    
         
            -
                       
     | 
| 
       77 
     | 
    
         
            -
             
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
                            total = response.content_length
         
     | 
| 
       80 
     | 
    
         
            -
                            progress = 0
         
     | 
| 
       81 
     | 
    
         
            -
                            segment_count = 0
         
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
       83 
     | 
    
         
            -
                            response.read_body do |segment|
         
     | 
| 
       84 
     | 
    
         
            -
                              progress += segment.length
         
     | 
| 
       85 
     | 
    
         
            -
                              segment_count += 1
         
     | 
| 
      
 87 
     | 
    
         
            +
                      server = 'https://github.com/seleniumhq/selenium/releases/download'
         
     | 
| 
      
 88 
     | 
    
         
            +
                      released = Net::HTTP.get_response(URI.parse("#{server}/selenium-#{required_version}/#{download_file_name}"))
         
     | 
| 
      
 89 
     | 
    
         
            +
                      redirected = URI.parse released.header['location']
         
     | 
| 
       86 
90 
     | 
    
         | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
                                print "#{CL_RESET}Downloading #{download_file_name}: #{percent.to_i}% (#{progress} / #{total})"
         
     | 
| 
       90 
     | 
    
         
            -
                                segment_count = 0
         
     | 
| 
       91 
     | 
    
         
            -
                              end
         
     | 
| 
       92 
     | 
    
         
            -
             
     | 
| 
       93 
     | 
    
         
            -
                              destination.write(segment)
         
     | 
| 
       94 
     | 
    
         
            -
                            end
         
     | 
| 
       95 
     | 
    
         
            -
                          end
         
     | 
| 
       96 
     | 
    
         
            -
             
     | 
| 
       97 
     | 
    
         
            -
                          raise Error, "#{resp.code} for #{download_file_name}" unless resp.is_a? Net::HTTPSuccess
         
     | 
| 
       98 
     | 
    
         
            -
                        end
         
     | 
| 
      
 91 
     | 
    
         
            +
                      File.open(download_file_name, 'wb') do |destination|
         
     | 
| 
      
 92 
     | 
    
         
            +
                        download_server(redirected, destination)
         
     | 
| 
       99 
93 
     | 
    
         
             
                      end
         
     | 
| 
       100 
94 
     | 
    
         
             
                    rescue StandardError
         
     | 
| 
       101 
95 
     | 
    
         
             
                      FileUtils.rm download_file_name if File.exist? download_file_name
         
     | 
| 
         @@ -106,30 +100,57 @@ module Selenium 
     | 
|
| 
       106 
100 
     | 
    
         
             
                  end
         
     | 
| 
       107 
101 
     | 
    
         | 
| 
       108 
102 
     | 
    
         
             
                  #
         
     | 
| 
       109 
     | 
    
         
            -
                  # Ask  
     | 
| 
      
 103 
     | 
    
         
            +
                  # Ask GitHub what the latest selenium-server version is.
         
     | 
| 
       110 
104 
     | 
    
         
             
                  #
         
     | 
| 
       111 
105 
     | 
    
         | 
| 
       112 
106 
     | 
    
         
             
                  def latest
         
     | 
| 
       113 
     | 
    
         
            -
                     
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
                         
     | 
| 
      
 107 
     | 
    
         
            +
                    @latest ||= begin
         
     | 
| 
      
 108 
     | 
    
         
            +
                      net_http_start('api.github.com') do |http|
         
     | 
| 
      
 109 
     | 
    
         
            +
                        json = http.get('/repos/seleniumhq/selenium/releases').body
         
     | 
| 
      
 110 
     | 
    
         
            +
                        all_assets = JSON.parse(json).map { |release| release['assets'] }.flatten
         
     | 
| 
      
 111 
     | 
    
         
            +
                        server_assets = all_assets.map { |asset| asset['name'][/selenium-server-(\d+\.\d+\.\d+)\.jar/, 1] }.compact
         
     | 
| 
      
 112 
     | 
    
         
            +
                        server_assets.map { |version| Gem::Version.new(version) }.max.version
         
     | 
| 
       117 
113 
     | 
    
         
             
                      end
         
     | 
| 
       118 
     | 
    
         
            -
             
     | 
| 
       119 
     | 
    
         
            -
                      versions.compact.map { |version| Gem::Version.new(version) }.max.version
         
     | 
| 
       120 
114 
     | 
    
         
             
                    end
         
     | 
| 
       121 
115 
     | 
    
         
             
                  end
         
     | 
| 
       122 
116 
     | 
    
         | 
| 
      
 117 
     | 
    
         
            +
                  # @api private
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
       123 
119 
     | 
    
         
             
                  def net_http_start(address, &block)
         
     | 
| 
       124 
120 
     | 
    
         
             
                    http_proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']
         
     | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
       126 
121 
     | 
    
         
             
                    if http_proxy
         
     | 
| 
       127 
122 
     | 
    
         
             
                      http_proxy = "http://#{http_proxy}" unless http_proxy.start_with?('http://')
         
     | 
| 
       128 
123 
     | 
    
         
             
                      uri = URI.parse(http_proxy)
         
     | 
| 
       129 
124 
     | 
    
         | 
| 
       130 
125 
     | 
    
         
             
                      Net::HTTP.start(address, nil, uri.host, uri.port, &block)
         
     | 
| 
       131 
126 
     | 
    
         
             
                    else
         
     | 
| 
       132 
     | 
    
         
            -
                      Net::HTTP.start(address, &block)
         
     | 
| 
      
 127 
     | 
    
         
            +
                      Net::HTTP.start(address, use_ssl: true, &block)
         
     | 
| 
      
 128 
     | 
    
         
            +
                    end
         
     | 
| 
      
 129 
     | 
    
         
            +
                  end
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
      
 131 
     | 
    
         
            +
                  def download_server(uri, destination)
         
     | 
| 
      
 132 
     | 
    
         
            +
                    net_http_start('github-releases.githubusercontent.com') do |http|
         
     | 
| 
      
 133 
     | 
    
         
            +
                      request = Net::HTTP::Get.new uri
         
     | 
| 
      
 134 
     | 
    
         
            +
                      resp = http.request(request) do |response|
         
     | 
| 
      
 135 
     | 
    
         
            +
                        total = response.content_length
         
     | 
| 
      
 136 
     | 
    
         
            +
                        progress = 0
         
     | 
| 
      
 137 
     | 
    
         
            +
                        segment_count = 0
         
     | 
| 
      
 138 
     | 
    
         
            +
             
     | 
| 
      
 139 
     | 
    
         
            +
                        response.read_body do |segment|
         
     | 
| 
      
 140 
     | 
    
         
            +
                          progress += segment.length
         
     | 
| 
      
 141 
     | 
    
         
            +
                          segment_count += 1
         
     | 
| 
      
 142 
     | 
    
         
            +
             
     | 
| 
      
 143 
     | 
    
         
            +
                          if (segment_count % 15).zero?
         
     | 
| 
      
 144 
     | 
    
         
            +
                            percent = progress.fdiv(total) * 100
         
     | 
| 
      
 145 
     | 
    
         
            +
                            print "#{CL_RESET}Downloading #{download_file_name}: #{percent.to_i}% (#{progress} / #{total})"
         
     | 
| 
      
 146 
     | 
    
         
            +
                            segment_count = 0
         
     | 
| 
      
 147 
     | 
    
         
            +
                          end
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
      
 149 
     | 
    
         
            +
                          destination.write(segment)
         
     | 
| 
      
 150 
     | 
    
         
            +
                        end
         
     | 
| 
      
 151 
     | 
    
         
            +
                      end
         
     | 
| 
      
 152 
     | 
    
         
            +
             
     | 
| 
      
 153 
     | 
    
         
            +
                      raise Error, "#{resp.code} for #{download_file_name}" unless resp.is_a? Net::HTTPSuccess
         
     | 
| 
       133 
154 
     | 
    
         
             
                    end
         
     | 
| 
       134 
155 
     | 
    
         
             
                  end
         
     | 
| 
       135 
156 
     | 
    
         
             
                end
         
     | 
| 
         @@ -200,10 +221,6 @@ module Selenium 
     | 
|
| 
       200 
221 
     | 
    
         | 
| 
       201 
222 
     | 
    
         
             
                private
         
     | 
| 
       202 
223 
     | 
    
         | 
| 
       203 
     | 
    
         
            -
                def selenium4?
         
     | 
| 
       204 
     | 
    
         
            -
                  @jar.match?(/[^.]4\./) || @jar.include?('deploy')
         
     | 
| 
       205 
     | 
    
         
            -
                end
         
     | 
| 
       206 
     | 
    
         
            -
             
     | 
| 
       207 
224 
     | 
    
         
             
                def stop_process
         
     | 
| 
       208 
225 
     | 
    
         
             
                  return unless @process.alive?
         
     | 
| 
       209 
226 
     | 
    
         | 
| 
         @@ -222,10 +239,7 @@ module Selenium 
     | 
|
| 
       222 
239 
     | 
    
         
             
                  @process ||= begin
         
     | 
| 
       223 
240 
     | 
    
         
             
                    # extract any additional_args that start with -D as options
         
     | 
| 
       224 
241 
     | 
    
         
             
                    properties = @additional_args.dup - @additional_args.delete_if { |arg| arg[/^-D/] }
         
     | 
| 
       225 
     | 
    
         
            -
                    args = ['-jar', @jar]
         
     | 
| 
       226 
     | 
    
         
            -
                    args << @role if selenium4?
         
     | 
| 
       227 
     | 
    
         
            -
                    args << (selenium4? ? '--port' : '-port')
         
     | 
| 
       228 
     | 
    
         
            -
                    args << @port.to_s
         
     | 
| 
      
 242 
     | 
    
         
            +
                    args = ['-jar', @jar, @role, '--port', @port.to_s]
         
     | 
| 
       229 
243 
     | 
    
         
             
                    server_command = ['java'] + properties + args + @additional_args
         
     | 
| 
       230 
244 
     | 
    
         
             
                    cp = ChildProcess.build(*server_command)
         
     | 
| 
       231 
245 
     | 
    
         
             
                    WebDriver.logger.debug("Executing Process #{server_command}")
         
     | 
| 
         @@ -108,8 +108,8 @@ function gd(a){var b=a.shape.toLowerCase();a=a.coords.split(",");if("rect"==b&&4 
     | 
|
| 
       108 
108 
     | 
    
         
             
            function hd(a){return a.replace(/^[^\S\xa0]+|[^\S\xa0]+$/g,"")}function id(a){var b=[];Yc?jd(a,b):kd(a,b);a=qa(b,hd);return hd(a.join("\n")).replace(/\xa0/g," ")}
         
     | 
| 
       109 
109 
     | 
    
         
             
            function ld(a,b,c){if(S(a,"BR"))b.push("");else{var d=S(a,"TD"),e=V(a,"display"),f=!d&&!(0<=oa(md,e)),g=void 0!==a.previousElementSibling?a.previousElementSibling:gb(a.previousSibling);g=g?V(g,"display"):"";var h=V(a,"float")||V(a,"cssFloat")||V(a,"styleFloat");!f||"run-in"==g&&"none"==h||/^[\s\xa0]*$/.test(b[b.length-1]||"")||b.push("");var n=ed(a),u=null,p=null;n&&(u=V(a,"white-space"),p=V(a,"text-transform"));l(a.childNodes,function(G){c(G,b,n,u,p)});a=b[b.length-1]||"";!d&&"table-cell"!=e||!a||
         
     | 
| 
       110 
110 
     | 
    
         
             
            za(a)||(b[b.length-1]+=" ");f&&"run-in"!=e&&!/^[\s\xa0]*$/.test(a)&&b.push("")}}function kd(a,b){ld(a,b,function(c,d,e,f,g){3==c.nodeType&&e?nd(c,d,f,g):S(c)&&kd(c,d)})}var md="inline inline-block inline-table none table-cell table-column table-column-group".split(" ");
         
     | 
| 
       111 
     | 
    
         
            -
            function nd(a,b,c,d){a=a.nodeValue.replace(/[\u200b\u200e\u200f]/g,"");a=a.replace(/(\r\n|\r|\n)/g,"\n");if("normal"==c||"nowrap"==c)a=a.replace(/\n/g," ");a="pre"==c||"pre-wrap"==c?a.replace(/[ \f\t\v\u2028\u2029]/g,"\u00a0"):a.replace(/[ \f\t\v\u2028\u2029]+/g," ");"capitalize"==d?a=a.replace(/(^|[^\d\p{L}\p{S}])([\p{Ll}|\p{S}])/gu,function(e,f,g){return f+g.toUpperCase()}):"uppercase"==d?a=a.toUpperCase():"lowercase"==d&&(a=a.toLowerCase());c=b.pop()||"";za(c)&&0==a.lastIndexOf(" ", 
     | 
| 
       112 
     | 
    
         
            -
            b.push(c+a)}function dd(a){if(Mc){if("relative"==V(a,"position"))return 1;a=V(a,"filter");return(a=a.match(/^alpha\(opacity=(\d*)\)/)||a.match(/^progid:DXImageTransform.Microsoft.Alpha\(Opacity=(\d*)\)/))?Number(a[1])/100:1}return od(a)}function od(a){var b=1,c=V(a,"opacity");c&&(b=Number(c));(a=Zc(a))&&(b*=od(a));return b}
         
     | 
| 
      
 111 
     | 
    
         
            +
            function nd(a,b,c,d){a=a.nodeValue.replace(/[\u200b\u200e\u200f]/g,"");a=a.replace(/(\r\n|\r|\n)/g,"\n");if("normal"==c||"nowrap"==c)a=a.replace(/\n/g," ");a="pre"==c||"pre-wrap"==c?a.replace(/[ \f\t\v\u2028\u2029]/g,"\u00a0"):a.replace(/[ \f\t\v\u2028\u2029]+/g," ");"capitalize"==d?a=a.replace(t?/(^|\s|\b)(\S)/g:/(^|[^\d\p{L}\p{S}])([\p{Ll}|\p{S}])/gu,function(e,f,g){return f+g.toUpperCase()}):"uppercase"==d?a=a.toUpperCase():"lowercase"==d&&(a=a.toLowerCase());c=b.pop()||"";za(c)&&0==a.lastIndexOf(" ",
         
     | 
| 
      
 112 
     | 
    
         
            +
            0)&&(a=a.substr(1));b.push(c+a)}function dd(a){if(Mc){if("relative"==V(a,"position"))return 1;a=V(a,"filter");return(a=a.match(/^alpha\(opacity=(\d*)\)/)||a.match(/^progid:DXImageTransform.Microsoft.Alpha\(Opacity=(\d*)\)/))?Number(a[1])/100:1}return od(a)}function od(a){var b=1,c=V(a,"opacity");c&&(b=Number(c));(a=Zc(a))&&(b*=od(a));return b}
         
     | 
| 
       113 
113 
     | 
    
         
             
            function pd(a,b,c,d,e){if(3==a.nodeType&&c)nd(a,b,d,e);else if(S(a))if(S(a,"CONTENT")||S(a,"SLOT")){for(var f=a;f.parentNode;)f=f.parentNode;f instanceof ShadowRoot?(a=S(a,"CONTENT")?a.getDistributedNodes():a.assignedNodes(),l(a,function(g){pd(g,b,c,d,e)})):jd(a,b)}else if(S(a,"SHADOW")){for(f=a;f.parentNode;)f=f.parentNode;if(f instanceof ShadowRoot&&(a=f))for(a=a.olderShadowRoot;a;)l(a.childNodes,function(g){pd(g,b,c,d,e)}),a=a.olderShadowRoot}else jd(a,b)}
         
     | 
| 
       114 
114 
     | 
    
         
             
            function jd(a,b){a.shadowRoot&&l(a.shadowRoot.childNodes,function(c){pd(c,b,!0,null,null)});ld(a,b,function(c,d,e,f,g){var h=null;1==c.nodeType?h=c:3==c.nodeType&&(h=c);null!=h&&(null!=h.assignedSlot||h.getDestinationInsertionPoints&&0<h.getDestinationInsertionPoints().length)||pd(c,d,e,f,g)})};var qd={C:function(a,b){return!(!a.querySelectorAll||!a.querySelector)&&!/^\d.*/.test(b)},o:function(a,b){var c=eb(b),d="string"===typeof a?c.a.getElementById(a):a;return d?Uc(d,"id")==a&&b!=d&&hb(b,d)?d:ua(mb(c,"*"),function(e){return Uc(e,"id")==a&&b!=e&&hb(b,e)}):null},j:function(a,b){if(!a)return[];if(qd.C(b,a))try{return b.querySelectorAll("#"+qd.T(a))}catch(c){return[]}b=mb(eb(b),"*",null,b);return pa(b,function(c){return Uc(c,"id")==a})},T:function(a){return a.replace(/([\s'"\\#.:;,!?+<>=~*^$|%&@`{}\-\/\[\]\(\)])/g,
         
     | 
| 
       115 
115 
     | 
    
         
             
            "\\$1")}};var Y={},rd={};Y.N=function(a,b,c){try{var d=Nc.j("a",b)}catch(e){d=mb(eb(b),"A",null,b)}return ua(d,function(e){e=id(e);e=e.replace(/^[\s]+|[\s]+$/g,"");return c&&-1!=e.indexOf(a)||e==a})};Y.K=function(a,b,c){try{var d=Nc.j("a",b)}catch(e){d=mb(eb(b),"A",null,b)}return pa(d,function(e){e=id(e);e=e.replace(/^[\s]+|[\s]+$/g,"");return c&&-1!=e.indexOf(a)||e==a})};Y.o=function(a,b){return Y.N(a,b,!1)};Y.j=function(a,b){return Y.K(a,b,!1)};rd.o=function(a,b){return Y.N(a,b,!0)};
         
     | 
| 
         @@ -32,8 +32,8 @@ function ka(a,b,c){this.a=a;this.b=b||1;this.f=c||1};var la;var ma=Array.prototy 
     | 
|
| 
       32 
32 
     | 
    
         
             
            b,void 0)}:function(a,b){for(var c=a.length,d=[],e=0,f="string"===typeof a?a.split(""):a,g=0;g<c;g++)if(g in f){var k=f[g];b.call(void 0,k,g,a)&&(d[e++]=k)}return d},oa=Array.prototype.map?function(a,b){return Array.prototype.map.call(a,b,void 0)}:function(a,b){for(var c=a.length,d=Array(c),e="string"===typeof a?a.split(""):a,f=0;f<c;f++)f in e&&(d[f]=b.call(void 0,e[f],f,a));return d},pa=Array.prototype.reduce?function(a,b,c){return Array.prototype.reduce.call(a,b,c)}:function(a,b,c){var d=c;n(a,
         
     | 
| 
       33 
33 
     | 
    
         
             
            function(e,f){d=b.call(void 0,d,e,f,a)});return d},qa=Array.prototype.some?function(a,b){return Array.prototype.some.call(a,b,void 0)}:function(a,b){for(var c=a.length,d="string"===typeof a?a.split(""):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a))return!0;return!1};function ra(a,b){a:{for(var c=a.length,d="string"===typeof a?a.split(""):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a)){b=e;break a}b=-1}return 0>b?null:"string"===typeof a?a.charAt(b):a[b]}
         
     | 
| 
       34 
34 
     | 
    
         
             
            function sa(a){return Array.prototype.concat.apply([],arguments)}function ta(a,b,c){return 2>=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};var ua=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]};
         
     | 
| 
       35 
     | 
    
         
            -
            function va(a,b){var c=0;a=ua(String(a)).split(".");b=ua(String(b)).split(".");for(var d=Math.max(a.length,b.length),e=0;0==c&&e<d;e++){var f=a[e]||"",g=b[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;c=wa(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||wa(0==f[2].length,0==g[2].length)||wa(f[2],g[2]);f=f[3];g=g[3]}while(0==c)}return c}function wa(a,b){return a<b?-1:a>b?1:0};var p;a:{var xa=h.navigator;if(xa){var ya=xa.userAgent;if(ya){p=ya;break a}}p=""}function q(a){return-1!=p.indexOf(a)};function za(){return q("Firefox")||q("FxiOS")}function Aa(){return(q("Chrome")||q("CriOS"))&&!q("Edge")};function Ba(){return q("iPhone")&&!q("iPod")&&!q("iPad")};function Ca(a){var  
     | 
| 
       36 
     | 
    
         
            -
            a:{var La="",Ma=function(){var a=p;if(t)return/rv:([^\);]+)(\)|;)/.exec(a);if(Fa)return/Edge\/([\d\.]+)/.exec(a);if(r)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ga)return/WebKit\/(\S+)/.exec(a);if(Ea)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Ma&&(La=Ma?Ma[1]:"");if(r){var Na=Ja();if(null!=Na&&Na>parseFloat(La)){Ka=String(Na);break a}}Ka=La}var Da={};function Oa(){return Ca(function(){return 0<=va(Ka, 
     | 
| 
      
 35 
     | 
    
         
            +
            function va(a,b){var c=0;a=ua(String(a)).split(".");b=ua(String(b)).split(".");for(var d=Math.max(a.length,b.length),e=0;0==c&&e<d;e++){var f=a[e]||"",g=b[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;c=wa(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||wa(0==f[2].length,0==g[2].length)||wa(f[2],g[2]);f=f[3];g=g[3]}while(0==c)}return c}function wa(a,b){return a<b?-1:a>b?1:0};var p;a:{var xa=h.navigator;if(xa){var ya=xa.userAgent;if(ya){p=ya;break a}}p=""}function q(a){return-1!=p.indexOf(a)};function za(){return q("Firefox")||q("FxiOS")}function Aa(){return(q("Chrome")||q("CriOS"))&&!q("Edge")};function Ba(){return q("iPhone")&&!q("iPod")&&!q("iPad")};function Ca(a,b){var c=Da;return Object.prototype.hasOwnProperty.call(c,a)?c[a]:c[a]=b(a)};var Ea=q("Opera"),r=q("Trident")||q("MSIE"),Fa=q("Edge"),t=q("Gecko")&&!(-1!=p.toLowerCase().indexOf("webkit")&&!q("Edge"))&&!(q("Trident")||q("MSIE"))&&!q("Edge"),Ga=-1!=p.toLowerCase().indexOf("webkit")&&!q("Edge"),Ha=q("Macintosh"),Ia=q("Windows");function Ja(){var a=h.document;return a?a.documentMode:void 0}var Ka;
         
     | 
| 
      
 36 
     | 
    
         
            +
            a:{var La="",Ma=function(){var a=p;if(t)return/rv:([^\);]+)(\)|;)/.exec(a);if(Fa)return/Edge\/([\d\.]+)/.exec(a);if(r)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ga)return/WebKit\/(\S+)/.exec(a);if(Ea)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Ma&&(La=Ma?Ma[1]:"");if(r){var Na=Ja();if(null!=Na&&Na>parseFloat(La)){Ka=String(Na);break a}}Ka=La}var Da={};function Oa(a){return Ca(a,function(){return 0<=va(Ka,a)})}var w;w=h.document&&r?Ja():void 0;var x=r&&!(9<=Number(w)),Pa=r&&!(8<=Number(w));function Qa(a,b,c,d){this.a=a;this.nodeName=c;this.nodeValue=d;this.nodeType=2;this.parentNode=this.ownerElement=b}function Sa(a,b){var c=Pa&&"href"==b.nodeName?a.getAttribute(b.nodeName,2):b.nodeValue;return new Qa(b,a,b.nodeName,c)};function Ta(a){this.b=a;this.a=0}function Ua(a){a=a.match(Va);for(var b=0;b<a.length;b++)Wa.test(a[b])&&a.splice(b,1);return new Ta(a)}var Va=/\$?(?:(?![0-9-\.])(?:\*|[\w-\.]+):)?(?![0-9-\.])(?:\*|[\w-\.]+)|\/\/|\.\.|::|\d+(?:\.\d*)?|\.\d+|"[^"]*"|'[^']*'|[!<>]=|\s+|./g,Wa=/^\s/;function y(a,b){return a.b[a.a+(b||0)]}function z(a){return a.b[a.a++]}function Xa(a){return a.b.length<=a.a};function Ya(a){return a.scrollingElement?a.scrollingElement:Ga||"CSS1Compat"!=a.compatMode?a.body||a.documentElement:a.documentElement}function Za(a,b){if(!a||!b)return!1;if(a.contains&&1==b.nodeType)return a==b||a.contains(b);if("undefined"!=typeof a.compareDocumentPosition)return a==b||!!(a.compareDocumentPosition(b)&16);for(;b&&a!=b;)b=b.parentNode;return b==a}
         
     | 
| 
       37 
37 
     | 
    
         
             
            function $a(a,b){if(a==b)return 0;if(a.compareDocumentPosition)return a.compareDocumentPosition(b)&2?1:-1;if(r&&!(9<=Number(w))){if(9==a.nodeType)return-1;if(9==b.nodeType)return 1}if("sourceIndex"in a||a.parentNode&&"sourceIndex"in a.parentNode){var c=1==a.nodeType,d=1==b.nodeType;if(c&&d)return a.sourceIndex-b.sourceIndex;var e=a.parentNode,f=b.parentNode;return e==f?ab(a,b):!c&&Za(e,b)?-1*bb(a,b):!d&&Za(f,a)?bb(b,a):(c?a.sourceIndex:e.sourceIndex)-(d?b.sourceIndex:f.sourceIndex)}d=A(a);c=d.createRange();
         
     | 
| 
       38 
38 
     | 
    
         
             
            c.selectNode(a);c.collapse(!0);a=d.createRange();a.selectNode(b);a.collapse(!0);return c.compareBoundaryPoints(h.Range.START_TO_END,a)}function bb(a,b){var c=a.parentNode;if(c==b)return-1;for(;b.parentNode!=c;)b=b.parentNode;return ab(b,a)}function ab(a,b){for(;b=b.previousSibling;)if(b==a)return-1;return 1}function A(a){return 9==a.nodeType?a:a.ownerDocument||a.document}var cb={SCRIPT:1,STYLE:1,HEAD:1,IFRAME:1,OBJECT:1},db={IMG:" ",BR:"\n"};
         
     | 
| 
       39 
39 
     | 
    
         
             
            function eb(a,b,c){if(!(a.nodeName in cb))if(3==a.nodeType)c?b.push(String(a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):b.push(a.nodeValue);else if(a.nodeName in db)b.push(db[a.nodeName]);else for(a=a.firstChild;a;)eb(a,b,c),a=a.nextSibling}function fb(a){this.a=a||h.document||document}fb.prototype.getElementsByTagName=function(a,b){return(b||this.a).getElementsByTagName(String(a))};function B(a){var b=null,c=a.nodeType;1==c&&(b=a.textContent,b=void 0==b||null==b?a.innerText:b,b=void 0==b||null==b?"":b);if("string"!=typeof b)if(x&&"title"==a.nodeName.toLowerCase()&&1==c)b=a.text;else if(9==c||1==c){a=9==c?a.documentElement:a.firstChild;c=0;var d=[];for(b="";a;){do 1!=a.nodeType&&(b+=a.nodeValue),x&&"title"==a.nodeName.toLowerCase()&&(b+=a.text),d[c++]=a;while(a=a.firstChild);for(;c&&!(a=d[--c].nextSibling););}}else b=a.nodeValue;return b}
         
     | 
| 
         @@ -66,35 +66,35 @@ P("ancestor",function(a,b){for(var c=new D;b=b.parentNode;)a.a(b)&&qb(c,b);retur 
     | 
|
| 
       66 
66 
     | 
    
         
             
            var Lb=P("attribute",function(a,b){var c=new D,d=a.f();if("style"==d&&x&&b.style)return c.add(new Qa(b.style,b,"style",b.style.cssText)),c;var e=b.attributes;if(e)if(a instanceof E&&null===a.b||"*"==d)for(a=0;d=e[a];a++)x?d.nodeValue&&c.add(Sa(b,d)):c.add(d);else(d=e.getNamedItem(d))&&(x?d.nodeValue&&c.add(Sa(b,d)):c.add(d));return c},!1),Sb=P("child",function(a,b,c,d,e){return(x?mb:nb).call(null,a,b,aa(c)?c:null,aa(d)?d:null,e||new D)},!1,!0);P("descendant",gb,!1,!0);
         
     | 
| 
       67 
67 
     | 
    
         
             
            var Tb=P("descendant-or-self",function(a,b,c,d){var e=new D;C(b,c,d)&&a.a(b)&&e.add(b);return gb(a,b,c,d,e)},!1,!0),Pb=P("following",function(a,b,c,d){var e=new D;do for(var f=b;f=f.nextSibling;)C(f,c,d)&&a.a(f)&&e.add(f),e=gb(a,f,c,d,e);while(b=b.parentNode);return e},!1,!0);P("following-sibling",function(a,b){for(var c=new D;b=b.nextSibling;)a.a(b)&&c.add(b);return c},!1);P("namespace",function(){return new D},!1);
         
     | 
| 
       68 
68 
     | 
    
         
             
            var Wb=P("parent",function(a,b){var c=new D;if(9==b.nodeType)return c;if(2==b.nodeType)return c.add(b.ownerElement),c;b=b.parentNode;a.a(b)&&c.add(b);return c},!1),Qb=P("preceding",function(a,b,c,d){var e=new D,f=[];do f.unshift(b);while(b=b.parentNode);for(var g=1,k=f.length;g<k;g++){var l=[];for(b=f[g];b=b.previousSibling;)l.unshift(b);for(var u=0,K=l.length;u<K;u++)b=l[u],C(b,c,d)&&a.a(b)&&e.add(b),e=gb(a,b,c,d,e)}return e},!0,!0);
         
     | 
| 
       69 
     | 
    
         
            -
            P("preceding-sibling",function(a,b){for(var c=new D;b=b.previousSibling;)a.a(b)&&qb(c,b);return c},!0);var Xb=P("self",function(a,b){var c=new D;a.a(b)&&c.add(b);return c},!1);function Yb(a){H.call(this,1);this.c=a;this.i=a.i;this.b=a.b}m(Yb,H);Yb.prototype.a=function(a){return-J(this.c,a)};Yb.prototype.toString=function(){return"Unary Expression: -"+I(this.c)};function Zb(a){H.call(this,4);this.c=a;ub(this,qa(this.c,function(b){return b.i}));vb(this,qa(this.c,function(b){return b.b}))}m(Zb,H);Zb.prototype.a=function(a){var b=new D;n(this.c,function(c){c=c.a(a);if(!(c instanceof D))throw Error("Path expression must evaluate to NodeSet.");b=pb(b,c)});return b};Zb.prototype.toString=function(){return pa(this.c,function(a,b){return a+I(b)},"Union Expression:")};function $b(a,b){this.a=a;this.b=b}function ac(a){for(var b,c=[];;){ 
     | 
| 
      
 69 
     | 
    
         
            +
            P("preceding-sibling",function(a,b){for(var c=new D;b=b.previousSibling;)a.a(b)&&qb(c,b);return c},!0);var Xb=P("self",function(a,b){var c=new D;a.a(b)&&c.add(b);return c},!1);function Yb(a){H.call(this,1);this.c=a;this.i=a.i;this.b=a.b}m(Yb,H);Yb.prototype.a=function(a){return-J(this.c,a)};Yb.prototype.toString=function(){return"Unary Expression: -"+I(this.c)};function Zb(a){H.call(this,4);this.c=a;ub(this,qa(this.c,function(b){return b.i}));vb(this,qa(this.c,function(b){return b.b}))}m(Zb,H);Zb.prototype.a=function(a){var b=new D;n(this.c,function(c){c=c.a(a);if(!(c instanceof D))throw Error("Path expression must evaluate to NodeSet.");b=pb(b,c)});return b};Zb.prototype.toString=function(){return pa(this.c,function(a,b){return a+I(b)},"Union Expression:")};function $b(a,b){this.a=a;this.b=b}function ac(a){for(var b,c=[];;){Q(a,"Missing right hand side of binary expression.");b=bc(a);var d=z(a.a);if(!d)break;var e=(d=Bb[d]||null)&&d.G;if(!e){a.a.a--;break}for(;c.length&&e<=c[c.length-1].G;)b=new xb(c.pop(),c.pop(),b);c.push(b,d)}for(;c.length;)b=new xb(c.pop(),c.pop(),b);return b}function Q(a,b){if(Xa(a.a))throw Error(b);}function cc(a,b){a=z(a.a);if(a!=b)throw Error("Bad token, expected: "+b+" got: "+a);}
         
     | 
| 
       70 
70 
     | 
    
         
             
            function dc(a){a=z(a.a);if(")"!=a)throw Error("Bad token: "+a);}function ec(a){a=z(a.a);if(2>a.length)throw Error("Unclosed literal string");return new Ib(a)}
         
     | 
| 
       71 
     | 
    
         
            -
            function fc(a){var b=[];if(Ob(y(a.a))){var c=z(a.a);var d=y(a.a);if("/"==c&&(Xa(a.a)||"."!=d&&".."!=d&&"@"!=d&&"*"!=d&&!/(?![0-9])[\w]/.test(d)))return new Mb;d=new Mb; 
     | 
| 
       72 
     | 
    
         
            -
            c=Gb[c]||null;z(a.a);for(d=[];")"!=y(a.a);){ 
     | 
| 
       73 
     | 
    
         
            -
            function gc(a,b){if("/"!=b&&"//"!=b)throw Error('Step op should be "/" or "//"');if("."==y(a.a)){var c=new O(Xb,new E("node"));z(a.a);return c}if(".."==y(a.a))return c=new O(Wb,new E("node")),z(a.a),c;if("@"==y(a.a)){var d=Lb;z(a.a); 
     | 
| 
       74 
     | 
    
         
            -
            y(a.a,1)){if(!Hb(e))throw Error("Invalid node type: "+e);e=z(a.a);if(!Hb(e))throw Error("Invalid type name: "+e);cc(a,"("); 
     | 
| 
       75 
     | 
    
         
            -
            new O(d,e,a,"//"==b)}function hc(a){for(var b=[];"["==y(a.a);){z(a.a); 
     | 
| 
      
 71 
     | 
    
         
            +
            function fc(a){var b=[];if(Ob(y(a.a))){var c=z(a.a);var d=y(a.a);if("/"==c&&(Xa(a.a)||"."!=d&&".."!=d&&"@"!=d&&"*"!=d&&!/(?![0-9])[\w]/.test(d)))return new Mb;d=new Mb;Q(a,"Missing next location step.");c=gc(a,c);b.push(c)}else{a:{c=y(a.a);d=c.charAt(0);switch(d){case "$":throw Error("Variable reference not allowed in HTML XPath");case "(":z(a.a);c=ac(a);Q(a,'unclosed "("');cc(a,")");break;case '"':case "'":c=ec(a);break;default:if(isNaN(+c))if(!Hb(c)&&/(?![0-9])[\w]/.test(d)&&"("==y(a.a,1)){c=z(a.a);
         
     | 
| 
      
 72 
     | 
    
         
            +
            c=Gb[c]||null;z(a.a);for(d=[];")"!=y(a.a);){Q(a,"Missing function argument list.");d.push(ac(a));if(","!=y(a.a))break;z(a.a)}Q(a,"Unclosed function argument list.");dc(a);c=new Eb(c,d)}else{c=null;break a}else c=new Jb(+z(a.a))}"["==y(a.a)&&(d=new Rb(hc(a)),c=new Cb(c,d))}if(c)if(Ob(y(a.a)))d=c;else return c;else c=gc(a,"/"),d=new Nb,b.push(c)}for(;Ob(y(a.a));)c=z(a.a),Q(a,"Missing next location step."),c=gc(a,c),b.push(c);return new Kb(d,b)}
         
     | 
| 
      
 73 
     | 
    
         
            +
            function gc(a,b){if("/"!=b&&"//"!=b)throw Error('Step op should be "/" or "//"');if("."==y(a.a)){var c=new O(Xb,new E("node"));z(a.a);return c}if(".."==y(a.a))return c=new O(Wb,new E("node")),z(a.a),c;if("@"==y(a.a)){var d=Lb;z(a.a);Q(a,"Missing attribute name")}else if("::"==y(a.a,1)){if(!/(?![0-9])[\w]/.test(y(a.a).charAt(0)))throw Error("Bad token: "+z(a.a));var e=z(a.a);d=Vb[e]||null;if(!d)throw Error("No axis with name: "+e);z(a.a);Q(a,"Missing node name")}else d=Sb;e=y(a.a);if(/(?![0-9])[\w\*]/.test(e.charAt(0)))if("("==
         
     | 
| 
      
 74 
     | 
    
         
            +
            y(a.a,1)){if(!Hb(e))throw Error("Invalid node type: "+e);e=z(a.a);if(!Hb(e))throw Error("Invalid type name: "+e);cc(a,"(");Q(a,"Bad nodetype");var f=y(a.a).charAt(0),g=null;if('"'==f||"'"==f)g=ec(a);Q(a,"Bad nodetype");dc(a);e=new E(e,g)}else if(e=z(a.a),f=e.indexOf(":"),-1==f)e=new jb(e);else{g=e.substring(0,f);if("*"==g)var k="*";else if(k=a.b(g),!k)throw Error("Namespace prefix not declared: "+g);e=e.substr(f+1);e=new jb(e,k)}else throw Error("Bad token: "+z(a.a));a=new Rb(hc(a),d.v);return c||
         
     | 
| 
      
 75 
     | 
    
         
            +
            new O(d,e,a,"//"==b)}function hc(a){for(var b=[];"["==y(a.a);){z(a.a);Q(a,"Missing predicate expression.");var c=ac(a);b.push(c);Q(a,"Unclosed predicate expression.");cc(a,"]")}return b}function bc(a){if("-"==y(a.a))return z(a.a),new Yb(bc(a));var b=fc(a);if("|"!=y(a.a))a=b;else{for(b=[b];"|"==z(a.a);)Q(a,"Missing next union location path."),b.push(fc(a));a.a.a--;a=new Zb(b)}return a};function ic(a){switch(a.nodeType){case 1:return ia(jc,a);case 9:return ic(a.documentElement);case 11:case 10:case 6:case 12:return kc;default:return a.parentNode?ic(a.parentNode):kc}}function kc(){return null}function jc(a,b){if(a.prefix==b)return a.namespaceURI||"http://www.w3.org/1999/xhtml";var c=a.getAttributeNode("xmlns:"+b);return c&&c.specified?c.value||null:a.parentNode&&9!=a.parentNode.nodeType?jc(a.parentNode,b):null};function lc(a,b){if(!a.length)throw Error("Empty XPath expression.");a=Ua(a);if(Xa(a))throw Error("Invalid XPath expression.");b?"function"==ca(b)||(b=ha(b.lookupNamespaceURI,b)):b=function(){return null};var c=ac(new $b(a,b));if(!Xa(a))throw Error("Bad token: "+z(a));this.evaluate=function(d,e){d=c.a(new ka(d));return new T(d,e)}}
         
     | 
| 
       76 
76 
     | 
    
         
             
            function T(a,b){if(0==b)if(a instanceof D)b=4;else if("string"==typeof a)b=2;else if("number"==typeof a)b=1;else if("boolean"==typeof a)b=3;else throw Error("Unexpected evaluation result.");if(2!=b&&1!=b&&3!=b&&!(a instanceof D))throw Error("value could not be converted to the specified type");this.resultType=b;switch(b){case 2:this.stringValue=a instanceof D?sb(a):""+a;break;case 1:this.numberValue=a instanceof D?+sb(a):+a;break;case 3:this.booleanValue=a instanceof D?0<a.o:!!a;break;case 4:case 5:case 6:case 7:var c=
         
     | 
| 
       77 
77 
     | 
    
         
             
            F(a);var d=[];for(var e=G(c);e;e=G(c))d.push(e instanceof Qa?e.a:e);this.snapshotLength=a.o;this.invalidIteratorState=!1;break;case 8:case 9:a=rb(a);this.singleNodeValue=a instanceof Qa?a.a:a;break;default:throw Error("Unknown XPathResult type.");}var f=0;this.iterateNext=function(){if(4!=b&&5!=b)throw Error("iterateNext called with wrong result type");return f>=d.length?null:d[f++]};this.snapshotItem=function(g){if(6!=b&&7!=b)throw Error("snapshotItem called with wrong result type");return g>=d.length||
         
     | 
| 
       78 
78 
     | 
    
         
             
            0>g?null:d[g]}}T.ANY_TYPE=0;T.NUMBER_TYPE=1;T.STRING_TYPE=2;T.BOOLEAN_TYPE=3;T.UNORDERED_NODE_ITERATOR_TYPE=4;T.ORDERED_NODE_ITERATOR_TYPE=5;T.UNORDERED_NODE_SNAPSHOT_TYPE=6;T.ORDERED_NODE_SNAPSHOT_TYPE=7;T.ANY_UNORDERED_NODE_TYPE=8;T.FIRST_ORDERED_NODE_TYPE=9;function mc(a){this.lookupNamespaceURI=ic(a)}
         
     | 
| 
       79 
79 
     | 
    
         
             
            function nc(a,b){a=a||h;var c=a.Document&&a.Document.prototype||a.document;if(!c.evaluate||b)a.XPathResult=T,c.evaluate=function(d,e,f,g){return(new lc(d,f)).evaluate(e,g)},c.createExpression=function(d,e){return new lc(d,e)},c.createNSResolver=function(d){return new mc(d)}}ba("wgxpath.install",nc);ba("wgxpath.install",nc);var oc=window;function U(a,b){this.code=a;this.a=V[a]||pc;this.message=b||"";a=this.a.replace(/((?:^|\s+)[a-z])/g,function(c){return c.toUpperCase().replace(/^[\s\xa0]+/g,"")});b=a.length-5;if(0>b||a.indexOf("Error",b)!=b)a+="Error";this.name=a;a=Error(this.message);a.name=this.name;this.stack=a.stack||""}m(U,Error);var pc="unknown error",V={15:"element not selectable",11:"element not visible"};V[31]=pc;V[30]=pc;V[24]="invalid cookie domain";V[29]="invalid element coordinates";V[12]="invalid element state";
         
     | 
| 
       80 
80 
     | 
    
         
             
            V[32]="invalid selector";V[51]="invalid selector";V[52]="invalid selector";V[17]="javascript error";V[405]="unsupported operation";V[34]="move target out of bounds";V[27]="no such alert";V[7]="no such element";V[8]="no such frame";V[23]="no such window";V[28]="script timeout";V[33]="session not created";V[10]="stale element reference";V[21]="timeout";V[25]="unable to set cookie";V[26]="unexpected alert open";V[13]=pc;V[9]="unknown command";var qc=za(),rc=Ba()||q("iPod"),sc=q("iPad"),tc=q("Android")&&!(Aa()||za()||q("Opera")||q("Silk")),uc=Aa(),vc=q("Safari")&&!(Aa()||q("Coast")||q("Opera")||q("Edge")||q("Edg/")||q("OPR")||za()||q("Silk")||q("Android"))&&!(Ba()||q("iPad")||q("iPod"));function wc(a){return(a=a.exec(p))?a[1]:""}var xc=function(){if(qc)return wc(/Firefox\/([0-9.]+)/);if(r||Fa||Ea)return Ka;if(uc)return Ba()||q("iPad")||q("iPod")?wc(/CriOS\/([0-9.]+)/):wc(/Chrome\/([0-9.]+)/);if(vc&&!(Ba()||q("iPad")||q("iPod")))return wc(/Version\/([0-9.]+)/);if(rc||sc){var a=/Version\/(\S+).*Mobile\/(\S+)/.exec(p);if(a)return a[1]+"."+a[2]}else if(tc)return(a=wc(/Android\s+([0-9.]+)/))?a:wc(/Version\/([0-9.]+)/);return""}();var yc=sc||rc,zc;if(tc){var Ac=/Android\s+([0-9\.]+)/.exec(p);zc=Ac?Ac[1]:"0"}else zc="0";var Bc=zc,Cc=r&&!(8<=Number(w)),Dc=r&&!(9<=Number(w));function Ec(a,b){b=b.toLowerCase();return"style"==b?Fc(a.style.cssText):Cc&&"value"==b&&Gc(a,"INPUT")?a.value:Dc&&!0===a[b]?String(a.getAttribute(b)):(a=a.getAttributeNode(b))&&a.specified?a.value:null}var Hc=/[;]+(?=(?:(?:[^"]*"){2})*[^"]*$)(?=(?:(?:[^']*'){2})*[^']*$)(?=(?:[^()]*\([^()]*\))*[^()]*$)/;
         
     | 
| 
       81 
81 
     | 
    
         
             
            function Fc(a){var b=[];n(a.split(Hc),function(c){var d=c.indexOf(":");0<d&&(c=[c.slice(0,d),c.slice(d+1)],2==c.length&&b.push(c[0].toLowerCase(),":",c[1],";"))});b=b.join("");return b=";"==b.charAt(b.length-1)?b:b+";"}function Ic(a,b){Cc&&"value"==b&&Gc(a,"OPTION")&&null===Ec(a,"value")?(b=[],eb(a,b,!1),a=b.join("")):a=a[b];return a}function Gc(a,b){b&&"string"!==typeof b&&(b=b.toString());return!!a&&1==a.nodeType&&(!b||a.tagName.toUpperCase()==b)}
         
     | 
| 
       82 
     | 
    
         
            -
            function Jc(a){return Gc(a,"OPTION")?!0:Gc(a,"INPUT")?(a=a.type.toLowerCase(),"checkbox"==a||"radio"==a):!1};function Kc(a){a=a?A(a):document;return!r||9<=Number(w)||"CSS1Compat"==(a?new fb(A(a)):la||(la=new fb)).a.compatMode?a.documentElement:a.body};var Lc 
     | 
| 
       83 
     | 
    
         
            -
            W.prototype.create=function(a,b){if(!t&&this== 
     | 
| 
       84 
     | 
    
         
            -
            Ya((a?new fb(A(a)):la||(la=new fb)).a);c=Kc(c);var g=b.clientX+a.scrollLeft-c.clientLeft,k=b.clientY+a.scrollTop-c.clientTop;Object.defineProperty(e,"pageX",{get:function(){return g}});Object.defineProperty(e,"pageY",{get:function(){return k}})}return e};function  
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
     | 
    
         
            -
            c.keyCode:0;return c};function  
     | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
       88 
     | 
    
         
            -
            clientX:v.clientX,clientY:v.clientY,pageX:v.pageX,pageY:v.pageY,target:a})})}function f( 
     | 
| 
      
 82 
     | 
    
         
            +
            function Jc(a){return Gc(a,"OPTION")?!0:Gc(a,"INPUT")?(a=a.type.toLowerCase(),"checkbox"==a||"radio"==a):!1};function Kc(a){a=a?A(a):document;return!r||9<=Number(w)||"CSS1Compat"==(a?new fb(A(a)):la||(la=new fb)).a.compatMode?a.documentElement:a.body};var Lc=!(r&&!(r?0<=va(w,10):Oa(10))),Mc=tc?!(tc?0<=va(Bc,4):0<=va(xc,4)):!yc,Nc=r&&oc.navigator.msPointerEnabled;function Oc(a,b,c){this.a=a;this.b=b;this.f=c}Oc.prototype.create=function(a){a=A(a).createEvent("HTMLEvents");a.initEvent(this.a,this.b,this.f);return a};Oc.prototype.toString=function(){return this.a};function W(a,b,c){ja(this,a,b,c)}m(W,Oc);
         
     | 
| 
      
 83 
     | 
    
         
            +
            W.prototype.create=function(a,b){if(!t&&this==Pc)throw new U(9,"Browser does not support a mouse pixel scroll event.");var c=A(a),d=c?c.parentWindow||c.defaultView:window;var e=c.createEvent("MouseEvents");var f=1;this==Qc&&(t||(e.wheelDelta=b.wheelDelta),t&&(f=b.wheelDelta/-40));t&&this==Pc&&(f=b.wheelDelta);e.initMouseEvent(this.a,this.b,this.f,d,f,b.clientX,b.clientY,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,b.relatedTarget);if(r&&0===e.pageX&&0===e.pageY&&Object.defineProperty){a=
         
     | 
| 
      
 84 
     | 
    
         
            +
            Ya((a?new fb(A(a)):la||(la=new fb)).a);c=Kc(c);var g=b.clientX+a.scrollLeft-c.clientLeft,k=b.clientY+a.scrollTop-c.clientTop;Object.defineProperty(e,"pageX",{get:function(){return g}});Object.defineProperty(e,"pageY",{get:function(){return k}})}return e};function Rc(a,b,c){ja(this,a,b,c)}m(Rc,Oc);
         
     | 
| 
      
 85 
     | 
    
         
            +
            Rc.prototype.create=function(a,b){var c=A(a);if(t&&!(r?0<=va(w,93):Oa(93))){a=c?c.parentWindow||c.defaultView:window;var d=b.charCode?0:b.keyCode;c=c.createEvent("KeyboardEvent");c.initKeyEvent(this.a,this.b,this.f,a,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,d,b.charCode);this.a==Sc&&b.preventDefault&&c.preventDefault()}else if(c=c.createEvent("Events"),c.initEvent(this.a,this.b,this.f),c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey,c.keyCode=b.charCode||b.keyCode,Ga||
         
     | 
| 
      
 86 
     | 
    
         
            +
            Fa)c.charCode=this==Sc?c.keyCode:0;return c};function Tc(a,b,c){ja(this,a,b,c)}m(Tc,Oc);
         
     | 
| 
      
 87 
     | 
    
         
            +
            Tc.prototype.create=function(a,b){function c(R){R=oa(R,function(v){return g.createTouch(k,a,v.identifier,v.pageX,v.pageY,v.screenX,v.screenY)});return g.createTouchList.apply(g,R)}function d(R){var v=oa(R,function(S){return{identifier:S.identifier,screenX:S.screenX,screenY:S.screenY,clientX:S.clientX,clientY:S.clientY,pageX:S.pageX,pageY:S.pageY,target:a}});v.item=function(S){return v[S]};return v}function e(R){return oa(R,function(v){return new Touch({identifier:v.identifier,screenX:v.screenX,screenY:v.screenY,
         
     | 
| 
      
 88 
     | 
    
         
            +
            clientX:v.clientX,clientY:v.clientY,pageX:v.pageX,pageY:v.pageY,target:a})})}function f(R,v){switch(R){case 1:return d(v);case 2:return c(v);case 3:return e(v)}return null}if(!Lc)throw new U(9,"Browser does not support firing touch events.");var g=A(a),k=g?g.parentWindow||g.defaultView:window;if(Mc)var l=1;else if(TouchEvent.prototype.initTouchEvent)l=2;else if(TouchEvent&&0<TouchEvent.length)l=3;else throw new U(9,"Not able to create touch events in this browser");var u=f(l,b.changedTouches),K=b.touches==
         
     | 
| 
       89 
89 
     | 
    
         
             
            b.changedTouches?u:f(l,b.touches),Ra=b.targetTouches==b.changedTouches?u:f(l,b.targetTouches);if(1==l)l=g.createEvent("MouseEvents"),l.initMouseEvent(this.a,this.b,this.f,k,1,0,0,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,0,b.relatedTarget),l.touches=K,l.targetTouches=Ra,l.changedTouches=u,l.scale=b.scale,l.rotation=b.rotation;else if(2==l)l=g.createEvent("TouchEvent"),0==l.initTouchEvent.length?l.initTouchEvent(K,Ra,u,this.a,k,0,0,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,
         
     | 
| 
       90 
     | 
    
         
            -
            b.metaKey):l.initTouchEvent(this.a,this.b,this.f,k,1,0,0,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,K,Ra,u,b.scale,b.rotation),l.relatedTarget=b.relatedTarget;else if(3==l)l=new TouchEvent(this.a,{touches:K,targetTouches:Ra,changedTouches:u,bubbles:this.b,cancelable:this.f,ctrlKey:b.ctrlKey,shiftKey:b.shiftKey,altKey:b.altKey,metaKey:b.metaKey});else throw new U(9,"Illegal TouchEventStrategy_ value (this is a bug)");return l};function X(a,b,c){ja(this,a,b,c)}m(X, 
     | 
| 
       91 
     | 
    
         
            -
            X.prototype.create=function(a,b){if(! 
     | 
| 
       92 
     | 
    
         
            -
            Y.prototype.create=function(a,b){if(! 
     | 
| 
       93 
     | 
    
         
            -
            new W("mousedown",!0,!0);new W("mousemove",!0,!1);new W("mouseout",!0,!0);new W("mouseover",!0,!0);new W("mouseup",!0,!0);var  
     | 
| 
       94 
     | 
    
         
            -
            new X("MSGestureTap",!0,!0);new X("MSInertiaStart",!0,!0);new Y("MSGotPointerCapture",!0,!1);new Y("MSLostPointerCapture",!0,!1);new Y("MSPointerCancel",!0,!0);new Y("MSPointerDown",!0,!0);new Y("MSPointerMove",!0,!0);new Y("MSPointerOver",!0,!0);new Y("MSPointerOut",!0,!0);new Y("MSPointerUp",!0,!0);function  
     | 
| 
       95 
     | 
    
         
            -
            function  
     | 
| 
       96 
     | 
    
         
            -
             
     | 
| 
       97 
     | 
    
         
            -
            Z(69,"e","E");Z(70,"f","F");Z(71,"g","G");Z(72,"h","H");Z(73,"i","I");Z(74,"j","J");Z(75,"k","K");Z(76,"l","L");Z(77,"m","M");Z(78,"n","N");Z(79,"o","O");Z(80,"p","P");Z(81,"q","Q");Z(82,"r","R");Z(83,"s","S");Z(84,"t","T");Z(85,"u","U");Z(86,"v","V");Z(87,"w","W");Z(88,"x","X");Z(89,"y","Y");Z(90,"z","Z");var  
     | 
| 
      
 90 
     | 
    
         
            +
            b.metaKey):l.initTouchEvent(this.a,this.b,this.f,k,1,0,0,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,K,Ra,u,b.scale,b.rotation),l.relatedTarget=b.relatedTarget;else if(3==l)l=new TouchEvent(this.a,{touches:K,targetTouches:Ra,changedTouches:u,bubbles:this.b,cancelable:this.f,ctrlKey:b.ctrlKey,shiftKey:b.shiftKey,altKey:b.altKey,metaKey:b.metaKey});else throw new U(9,"Illegal TouchEventStrategy_ value (this is a bug)");return l};function X(a,b,c){ja(this,a,b,c)}m(X,Oc);
         
     | 
| 
      
 91 
     | 
    
         
            +
            X.prototype.create=function(a,b){if(!Nc)throw new U(9,"Browser does not support MSGesture events.");var c=A(a);a=c?c.parentWindow||c.defaultView:window;c=c.createEvent("MSGestureEvent");c.initGestureEvent(this.a,this.b,this.f,a,1,0,0,b.clientX,b.clientY,0,0,b.translationX,b.translationY,b.scale,b.expansion,b.rotation,b.velocityX,b.velocityY,b.velocityExpansion,b.velocityAngular,(new Date).getTime(),b.relatedTarget);return c};function Y(a,b,c){ja(this,a,b,c)}m(Y,Oc);
         
     | 
| 
      
 92 
     | 
    
         
            +
            Y.prototype.create=function(a,b){if(!Nc)throw new U(9,"Browser does not support MSPointer events.");var c=A(a);a=c?c.parentWindow||c.defaultView:window;c=c.createEvent("MSPointerEvent");c.initPointerEvent(this.a,this.b,this.f,a,0,0,0,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,b.relatedTarget,0,0,b.width,b.height,b.pressure,b.rotation,b.tiltX,b.tiltY,b.pointerId,b.pointerType,0,b.isPrimary);return c};new W("click",!0,!0);new W("contextmenu",!0,!0);new W("dblclick",!0,!0);
         
     | 
| 
      
 93 
     | 
    
         
            +
            new W("mousedown",!0,!0);new W("mousemove",!0,!1);new W("mouseout",!0,!0);new W("mouseover",!0,!0);new W("mouseup",!0,!0);var Qc=new W(t?"DOMMouseScroll":"mousewheel",!0,!0),Pc=new W("MozMousePixelScroll",!0,!0);new Rc("keydown",!0,!0);var Sc=new Rc("keypress",!0,!0);new Rc("keyup",!0,!0);new Tc("touchend",!0,!0);new Tc("touchmove",!0,!0);new Tc("touchstart",!0,!0);new X("MSGestureChange",!0,!0);new X("MSGestureEnd",!0,!0);new X("MSGestureHold",!0,!0);new X("MSGestureStart",!0,!0);
         
     | 
| 
      
 94 
     | 
    
         
            +
            new X("MSGestureTap",!0,!0);new X("MSInertiaStart",!0,!0);new Y("MSGotPointerCapture",!0,!1);new Y("MSLostPointerCapture",!0,!1);new Y("MSPointerCancel",!0,!0);new Y("MSPointerDown",!0,!0);new Y("MSPointerMove",!0,!0);new Y("MSPointerOver",!0,!0);new Y("MSPointerOut",!0,!0);new Y("MSPointerUp",!0,!0);function Uc(a,b){this.b={};this.a=[];this.f=0;var c=arguments.length;if(1<c){if(c%2)throw Error("Uneven number of arguments");for(var d=0;d<c;d+=2)this.set(arguments[d],arguments[d+1])}else if(a)if(a instanceof Uc)for(c=Vc(a),d=0;d<c.length;d++)this.set(c[d],a.get(c[d]));else for(d in a)this.set(d,a[d])}
         
     | 
| 
      
 95 
     | 
    
         
            +
            function Vc(a){if(a.f!=a.a.length){for(var b=0,c=0;b<a.a.length;){var d=a.a[b];Object.prototype.hasOwnProperty.call(a.b,d)&&(a.a[c++]=d);b++}a.a.length=c}if(a.f!=a.a.length){var e={};for(c=b=0;b<a.a.length;)d=a.a[b],Object.prototype.hasOwnProperty.call(e,d)||(a.a[c++]=d,e[d]=1),b++;a.a.length=c}return a.a.concat()}Uc.prototype.get=function(a,b){return Object.prototype.hasOwnProperty.call(this.b,a)?this.b[a]:b};
         
     | 
| 
      
 96 
     | 
    
         
            +
            Uc.prototype.set=function(a,b){Object.prototype.hasOwnProperty.call(this.b,a)||(this.f++,this.a.push(a));this.b[a]=b};var Wc={};function Z(a,b,c){da(a)&&(a=t?a.g:a.h);a=new Xc(a);!b||b in Wc&&!c||(Wc[b]={key:a,shift:!1},c&&(Wc[c]={key:a,shift:!0}));return a}function Xc(a){this.code=a}Z(8);Z(9);Z(13);var Yc=Z(16),Zc=Z(17),$c=Z(18);Z(19);Z(20);Z(27);Z(32," ");Z(33);Z(34);Z(35);Z(36);Z(37);Z(38);Z(39);Z(40);Z(44);Z(45);Z(46);Z(48,"0",")");Z(49,"1","!");Z(50,"2","@");Z(51,"3","#");Z(52,"4","$");Z(53,"5","%");Z(54,"6","^");Z(55,"7","&");Z(56,"8","*");Z(57,"9","(");Z(65,"a","A");Z(66,"b","B");Z(67,"c","C");Z(68,"d","D");
         
     | 
| 
      
 97 
     | 
    
         
            +
            Z(69,"e","E");Z(70,"f","F");Z(71,"g","G");Z(72,"h","H");Z(73,"i","I");Z(74,"j","J");Z(75,"k","K");Z(76,"l","L");Z(77,"m","M");Z(78,"n","N");Z(79,"o","O");Z(80,"p","P");Z(81,"q","Q");Z(82,"r","R");Z(83,"s","S");Z(84,"t","T");Z(85,"u","U");Z(86,"v","V");Z(87,"w","W");Z(88,"x","X");Z(89,"y","Y");Z(90,"z","Z");var ad=Z(Ia?{g:91,h:91}:Ha?{g:224,h:91}:{g:0,h:91});Z(Ia?{g:92,h:92}:Ha?{g:224,h:93}:{g:0,h:92});Z(Ia?{g:93,h:93}:Ha?{g:0,h:0}:{g:93,h:null});Z({g:96,h:96},"0");Z({g:97,h:97},"1");
         
     | 
| 
       98 
98 
     | 
    
         
             
            Z({g:98,h:98},"2");Z({g:99,h:99},"3");Z({g:100,h:100},"4");Z({g:101,h:101},"5");Z({g:102,h:102},"6");Z({g:103,h:103},"7");Z({g:104,h:104},"8");Z({g:105,h:105},"9");Z({g:106,h:106},"*");Z({g:107,h:107},"+");Z({g:109,h:109},"-");Z({g:110,h:110},".");Z({g:111,h:111},"/");Z(144);Z(112);Z(113);Z(114);Z(115);Z(116);Z(117);Z(118);Z(119);Z(120);Z(121);Z(122);Z(123);Z({g:107,h:187},"=","+");Z(108,",");Z({g:109,h:189},"-","_");Z(188,",","<");Z(190,".",">");Z(191,"/","?");Z(192,"`","~");Z(219,"[","{");
         
     | 
| 
       99 
     | 
    
         
            -
            Z(220,"\\","|");Z(221,"]","}");Z({g:59,h:186},";",":");Z(222,"'",'"');var  
     | 
| 
       100 
     | 
    
         
            -
            d)+""}e= 
     | 
| 
      
 99 
     | 
    
         
            +
            Z(220,"\\","|");Z(221,"]","}");Z({g:59,h:186},";",":");Z(222,"'",'"');var bd=new Uc;bd.set(1,Yc);bd.set(2,Zc);bd.set(4,$c);bd.set(8,ad);(function(a){var b=new Uc;n(Vc(a),function(c){b.set(a.get(c).code,c)});return b})(bd);var cd={"class":"className",readonly:"readOnly"},dd="allowfullscreen allowpaymentrequest allowusermedia async autofocus autoplay checked compact complete controls declare default defaultchecked defaultselected defer disabled ended formnovalidate hidden indeterminate iscontenteditable ismap itemscope loop multiple muted nohref nomodule noresize noshade novalidate nowrap open paused playsinline pubdate readonly required reversed scoped seamless seeking selected truespeed typemustmatch willvalidate".split(" ");ba("_",function(a,b){var c=null,d=b.toLowerCase();if("style"==d)return(c=a.style)&&!aa(c)&&(c=c.cssText),c;if(("selected"==d||"checked"==d)&&Jc(a)){if(!Jc(a))throw new U(15,"Element is not selectable");b="selected";c=a.type&&a.type.toLowerCase();if("checkbox"==c||"radio"==c)b="checked";return Ic(a,b)?"true":null}var e=Gc(a,"A");if(Gc(a,"IMG")&&"src"==d||e&&"href"==d)return(c=Ec(a,d))&&(c=Ic(a,d)),c;if("spellcheck"==d){c=Ec(a,d);if(null!==c){if("false"==c.toLowerCase())return"false";if("true"==c.toLowerCase())return"true"}return Ic(a,
         
     | 
| 
      
 100 
     | 
    
         
            +
            d)+""}e=cd[b]||b;if(0<=ma(dd,d))return(c=null!==Ec(a,b)||Ic(a,e))?"true":null;try{var f=Ic(a,e)}catch(g){}null==f||da(f)?c=Ec(a,b):c=f;return null!=c?c.toString():null});; return this._.apply(null,arguments);}).apply({navigator:typeof window!='undefined'?window.navigator:null,document:typeof window!='undefined'?window.document:null}, arguments);}
         
     | 
| 
         @@ -28,10 +28,13 @@ module Selenium 
     | 
|
| 
       28 
28 
     | 
    
         | 
| 
       29 
29 
     | 
    
         
             
                  class Driver < WebDriver::Driver
         
     | 
| 
       30 
30 
     | 
    
         
             
                    EXTENSIONS = [DriverExtensions::HasCDP,
         
     | 
| 
      
 31 
     | 
    
         
            +
                                  DriverExtensions::HasCasting,
         
     | 
| 
       31 
32 
     | 
    
         
             
                                  DriverExtensions::HasNetworkConditions,
         
     | 
| 
       32 
33 
     | 
    
         
             
                                  DriverExtensions::HasNetworkInterception,
         
     | 
| 
       33 
34 
     | 
    
         
             
                                  DriverExtensions::HasWebStorage,
         
     | 
| 
      
 35 
     | 
    
         
            +
                                  DriverExtensions::HasLaunching,
         
     | 
| 
       34 
36 
     | 
    
         
             
                                  DriverExtensions::HasLocation,
         
     | 
| 
      
 37 
     | 
    
         
            +
                                  DriverExtensions::HasPermissions,
         
     | 
| 
       35 
38 
     | 
    
         
             
                                  DriverExtensions::DownloadsFiles,
         
     | 
| 
       36 
39 
     | 
    
         
             
                                  DriverExtensions::HasDevTools,
         
     | 
| 
       37 
40 
     | 
    
         
             
                                  DriverExtensions::HasAuthentication,
         
     | 
| 
         @@ -23,8 +23,16 @@ module Selenium 
     | 
|
| 
       23 
23 
     | 
    
         
             
                  module Features
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
                    CHROME_COMMANDS = {
         
     | 
| 
      
 26 
     | 
    
         
            +
                      launch_app: [:post, 'session/:session_id/chromium/launch_app'],
         
     | 
| 
      
 27 
     | 
    
         
            +
                      get_cast_sinks: [:get, 'session/:session_id/goog/cast/get_sinks'],
         
     | 
| 
      
 28 
     | 
    
         
            +
                      set_cast_sink_to_use: [:post, 'session/:session_id/goog/cast/set_sink_to_use'],
         
     | 
| 
      
 29 
     | 
    
         
            +
                      start_cast_tab_mirroring: [:post, 'session/:session_id/goog/cast/start_tab_mirroring'],
         
     | 
| 
      
 30 
     | 
    
         
            +
                      get_cast_issue_message: [:get, 'session/:session_id/goog/cast/get_issue_message'],
         
     | 
| 
      
 31 
     | 
    
         
            +
                      stop_casting: [:post, 'session/:session_id/goog/cast/stop_casting'],
         
     | 
| 
       26 
32 
     | 
    
         
             
                      get_network_conditions: [:get, 'session/:session_id/chromium/network_conditions'],
         
     | 
| 
       27 
33 
     | 
    
         
             
                      set_network_conditions: [:post, 'session/:session_id/chromium/network_conditions'],
         
     | 
| 
      
 34 
     | 
    
         
            +
                      delete_network_conditions: [:delete, 'session/:session_id/chromium/network_conditions'],
         
     | 
| 
      
 35 
     | 
    
         
            +
                      set_permission: [:post, 'session/:session_id/permissions'],
         
     | 
| 
       28 
36 
     | 
    
         
             
                      send_command: [:post, 'session/:session_id/goog/cdp/execute'],
         
     | 
| 
       29 
37 
     | 
    
         
             
                      get_available_log_types: [:get, 'session/:session_id/se/log/types'],
         
     | 
| 
       30 
38 
     | 
    
         
             
                      get_log: [:post, 'session/:session_id/se/log']
         
     | 
| 
         @@ -34,18 +42,50 @@ module Selenium 
     | 
|
| 
       34 
42 
     | 
    
         
             
                      CHROME_COMMANDS[command] || self.class::COMMANDS[command]
         
     | 
| 
       35 
43 
     | 
    
         
             
                    end
         
     | 
| 
       36 
44 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
                    def  
     | 
| 
       38 
     | 
    
         
            -
                      execute : 
     | 
| 
      
 45 
     | 
    
         
            +
                    def launch_app(id)
         
     | 
| 
      
 46 
     | 
    
         
            +
                      execute :launch_app, {}, {id: id}
         
     | 
| 
       39 
47 
     | 
    
         
             
                    end
         
     | 
| 
       40 
48 
     | 
    
         | 
| 
       41 
     | 
    
         
            -
                    def  
     | 
| 
       42 
     | 
    
         
            -
                      execute : 
     | 
| 
      
 49 
     | 
    
         
            +
                    def cast_sinks
         
     | 
| 
      
 50 
     | 
    
         
            +
                      execute :get_cast_sinks
         
     | 
| 
      
 51 
     | 
    
         
            +
                    end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                    def cast_sink_to_use=(name)
         
     | 
| 
      
 54 
     | 
    
         
            +
                      execute :set_cast_sink_to_use, {}, {sinkName: name}
         
     | 
| 
      
 55 
     | 
    
         
            +
                    end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                    def cast_issue_message
         
     | 
| 
      
 58 
     | 
    
         
            +
                      execute :cast_issue_message
         
     | 
| 
      
 59 
     | 
    
         
            +
                    end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                    def start_cast_tab_mirroring(name)
         
     | 
| 
      
 62 
     | 
    
         
            +
                      execute :start_cast_tab_mirroring, {}, {sinkName: name}
         
     | 
| 
      
 63 
     | 
    
         
            +
                    end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                    def stop_casting(name)
         
     | 
| 
      
 66 
     | 
    
         
            +
                      execute :stop_casting, {}, {sinkName: name}
         
     | 
| 
      
 67 
     | 
    
         
            +
                    end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                    def set_permission(name, value)
         
     | 
| 
      
 70 
     | 
    
         
            +
                      execute :set_permission, {}, {descriptor: {name: name}, state: value}
         
     | 
| 
      
 71 
     | 
    
         
            +
                    end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                    def network_conditions
         
     | 
| 
      
 74 
     | 
    
         
            +
                      execute :get_network_conditions
         
     | 
| 
       43 
75 
     | 
    
         
             
                    end
         
     | 
| 
       44 
76 
     | 
    
         | 
| 
       45 
77 
     | 
    
         
             
                    def network_conditions=(conditions)
         
     | 
| 
       46 
78 
     | 
    
         
             
                      execute :set_network_conditions, {}, {network_conditions: conditions}
         
     | 
| 
       47 
79 
     | 
    
         
             
                    end
         
     | 
| 
       48 
80 
     | 
    
         | 
| 
      
 81 
     | 
    
         
            +
                    def delete_network_conditions
         
     | 
| 
      
 82 
     | 
    
         
            +
                      execute :delete_network_conditions
         
     | 
| 
      
 83 
     | 
    
         
            +
                    end
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                    def send_command(command_params)
         
     | 
| 
      
 86 
     | 
    
         
            +
                      execute :send_command, {}, command_params
         
     | 
| 
      
 87 
     | 
    
         
            +
                    end
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
       49 
89 
     | 
    
         
             
                    def available_log_types
         
     | 
| 
       50 
90 
     | 
    
         
             
                      types = execute :get_available_log_types
         
     | 
| 
       51 
91 
     | 
    
         
             
                      Array(types).map(&:to_sym)
         
     | 
| 
         @@ -37,7 +37,11 @@ module Selenium 
     | 
|
| 
       37 
37 
     | 
    
         
             
                                    minidump_path: 'minidumpPath',
         
     | 
| 
       38 
38 
     | 
    
         
             
                                    emulation: 'mobileEmulation',
         
     | 
| 
       39 
39 
     | 
    
         
             
                                    perf_logging_prefs: 'perfLoggingPrefs',
         
     | 
| 
       40 
     | 
    
         
            -
                                    window_types: 'windowTypes' 
     | 
| 
      
 40 
     | 
    
         
            +
                                    window_types: 'windowTypes',
         
     | 
| 
      
 41 
     | 
    
         
            +
                                    android_package: 'androidPackage',
         
     | 
| 
      
 42 
     | 
    
         
            +
                                    android_activity: 'androidActivity',
         
     | 
| 
      
 43 
     | 
    
         
            +
                                    android_device_serial: 'androidDeviceSerial',
         
     | 
| 
      
 44 
     | 
    
         
            +
                                    android_use_running_app: 'androidUseRunningApp'}.freeze
         
     | 
| 
       41 
45 
     | 
    
         | 
| 
       42 
46 
     | 
    
         
             
                    # NOTE: special handling of 'extensions' to validate when set instead of when used
         
     | 
| 
       43 
47 
     | 
    
         
             
                    attr_reader :extensions
         
     | 
| 
         @@ -193,6 +197,25 @@ module Selenium 
     | 
|
| 
       193 
197 
     | 
    
         
             
                      @options[:emulation] = opts
         
     | 
| 
       194 
198 
     | 
    
         
             
                    end
         
     | 
| 
       195 
199 
     | 
    
         | 
| 
      
 200 
     | 
    
         
            +
                    #
         
     | 
| 
      
 201 
     | 
    
         
            +
                    # Enables mobile browser use on Android.
         
     | 
| 
      
 202 
     | 
    
         
            +
                    #
         
     | 
| 
      
 203 
     | 
    
         
            +
                    # @see https://chromedriver.chromium.org/getting-started/getting-started---android
         
     | 
| 
      
 204 
     | 
    
         
            +
                    #
         
     | 
| 
      
 205 
     | 
    
         
            +
                    # @param [String] package The package name of the Chrome or WebView app.
         
     | 
| 
      
 206 
     | 
    
         
            +
                    # @param [String] serial_number The device serial number on which to launch the Chrome or WebView app.
         
     | 
| 
      
 207 
     | 
    
         
            +
                    # @param [String] use_running_app When true uses an already-running Chrome or WebView app,
         
     | 
| 
      
 208 
     | 
    
         
            +
                    #   instead of launching the app with a clear data directory.
         
     | 
| 
      
 209 
     | 
    
         
            +
                    # @param [String] activity Name of the Activity hosting the WebView (Not available on Chrome Apps).
         
     | 
| 
      
 210 
     | 
    
         
            +
                    #
         
     | 
| 
      
 211 
     | 
    
         
            +
             
     | 
| 
      
 212 
     | 
    
         
            +
                    def enable_android(package: 'com.android.chrome', serial_number: nil, use_running_app: nil, activity: nil)
         
     | 
| 
      
 213 
     | 
    
         
            +
                      @options[:android_package] = package
         
     | 
| 
      
 214 
     | 
    
         
            +
                      @options[:android_activity] = activity unless activity.nil?
         
     | 
| 
      
 215 
     | 
    
         
            +
                      @options[:android_device_serial] = serial_number unless serial_number.nil?
         
     | 
| 
      
 216 
     | 
    
         
            +
                      @options[:android_use_running_app] = use_running_app unless use_running_app.nil?
         
     | 
| 
      
 217 
     | 
    
         
            +
                    end
         
     | 
| 
      
 218 
     | 
    
         
            +
             
     | 
| 
       196 
219 
     | 
    
         
             
                    private
         
     | 
| 
       197 
220 
     | 
    
         | 
| 
       198 
221 
     | 
    
         
             
                    def enable_logging(browser_options)
         
     | 
| 
         @@ -70,6 +70,7 @@ module Selenium 
     | 
|
| 
       70 
70 
     | 
    
         | 
| 
       71 
71 
     | 
    
         
             
                  def initialize(bridge: nil, listener: nil, **opts)
         
     | 
| 
       72 
72 
     | 
    
         
             
                    @service = nil
         
     | 
| 
      
 73 
     | 
    
         
            +
                    @devtools = nil
         
     | 
| 
       73 
74 
     | 
    
         
             
                    bridge ||= create_bridge(**opts)
         
     | 
| 
       74 
75 
     | 
    
         
             
                    add_extensions(bridge.browser)
         
     | 
| 
       75 
76 
     | 
    
         
             
                    @bridge = listener ? Support::EventFiringBridge.new(bridge, listener) : bridge
         
     | 
| 
         @@ -180,6 +181,7 @@ module Selenium 
     | 
|
| 
       180 
181 
     | 
    
         
             
                    bridge.quit
         
     | 
| 
       181 
182 
     | 
    
         
             
                  ensure
         
     | 
| 
       182 
183 
     | 
    
         
             
                    @service&.stop
         
     | 
| 
      
 184 
     | 
    
         
            +
                    @devtools&.close
         
     | 
| 
       183 
185 
     | 
    
         
             
                  end
         
     | 
| 
       184 
186 
     | 
    
         | 
| 
       185 
187 
     | 
    
         
             
                  #
         
     | 
| 
         @@ -0,0 +1,51 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            # Licensed to the Software Freedom Conservancy (SFC) under one
         
     | 
| 
      
 4 
     | 
    
         
            +
            # or more contributor license agreements.  See the NOTICE file
         
     | 
| 
      
 5 
     | 
    
         
            +
            # distributed with this work for additional information
         
     | 
| 
      
 6 
     | 
    
         
            +
            # regarding copyright ownership.  The SFC licenses this file
         
     | 
| 
      
 7 
     | 
    
         
            +
            # to you under the Apache License, Version 2.0 (the
         
     | 
| 
      
 8 
     | 
    
         
            +
            # "License"); you may not use this file except in compliance
         
     | 
| 
      
 9 
     | 
    
         
            +
            # with the License.  You may obtain a copy of the License at
         
     | 
| 
      
 10 
     | 
    
         
            +
            #
         
     | 
| 
      
 11 
     | 
    
         
            +
            #   http://www.apache.org/licenses/LICENSE-2.0
         
     | 
| 
      
 12 
     | 
    
         
            +
            #
         
     | 
| 
      
 13 
     | 
    
         
            +
            # Unless required by applicable law or agreed to in writing,
         
     | 
| 
      
 14 
     | 
    
         
            +
            # software distributed under the License is distributed on an
         
     | 
| 
      
 15 
     | 
    
         
            +
            # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
         
     | 
| 
      
 16 
     | 
    
         
            +
            # KIND, either express or implied.  See the License for the
         
     | 
| 
      
 17 
     | 
    
         
            +
            # specific language governing permissions and limitations
         
     | 
| 
      
 18 
     | 
    
         
            +
            # under the License.
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            module Selenium
         
     | 
| 
      
 21 
     | 
    
         
            +
              module WebDriver
         
     | 
| 
      
 22 
     | 
    
         
            +
                module DriverExtensions
         
     | 
| 
      
 23 
     | 
    
         
            +
                  module HasApplePermissions
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                    #
         
     | 
| 
      
 26 
     | 
    
         
            +
                    # Returns permissions.
         
     | 
| 
      
 27 
     | 
    
         
            +
                    #
         
     | 
| 
      
 28 
     | 
    
         
            +
                    # @return [Hash]
         
     | 
| 
      
 29 
     | 
    
         
            +
                    #
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                    def permissions
         
     | 
| 
      
 32 
     | 
    
         
            +
                      @bridge.permissions
         
     | 
| 
      
 33 
     | 
    
         
            +
                    end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                    #
         
     | 
| 
      
 36 
     | 
    
         
            +
                    # Sets permissions.
         
     | 
| 
      
 37 
     | 
    
         
            +
                    #
         
     | 
| 
      
 38 
     | 
    
         
            +
                    # @example
         
     | 
| 
      
 39 
     | 
    
         
            +
                    #   driver.permissions = {'getUserMedia' => true}
         
     | 
| 
      
 40 
     | 
    
         
            +
                    #
         
     | 
| 
      
 41 
     | 
    
         
            +
                    # @param [Hash<Symbol, Boolean>] permissions
         
     | 
| 
      
 42 
     | 
    
         
            +
                    #
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                    def permissions=(permissions)
         
     | 
| 
      
 45 
     | 
    
         
            +
                      @bridge.permissions = permissions
         
     | 
| 
      
 46 
     | 
    
         
            +
                    end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                  end # HasPermissions
         
     | 
| 
      
 49 
     | 
    
         
            +
                end # DriverExtensions
         
     | 
| 
      
 50 
     | 
    
         
            +
              end # WebDriver
         
     | 
| 
      
 51 
     | 
    
         
            +
            end # Selenium
         
     |