net-ssh 5.0.0.beta1 → 5.0.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.rubocop_todo.yml +98 -258
  5. data/CHANGES.txt +8 -0
  6. data/Gemfile +1 -3
  7. data/Rakefile +37 -39
  8. data/lib/net/ssh.rb +26 -25
  9. data/lib/net/ssh/authentication/agent.rb +228 -225
  10. data/lib/net/ssh/authentication/certificate.rb +166 -164
  11. data/lib/net/ssh/authentication/constants.rb +17 -14
  12. data/lib/net/ssh/authentication/ed25519.rb +107 -104
  13. data/lib/net/ssh/authentication/ed25519_loader.rb +32 -28
  14. data/lib/net/ssh/authentication/key_manager.rb +5 -3
  15. data/lib/net/ssh/authentication/methods/abstract.rb +53 -47
  16. data/lib/net/ssh/authentication/methods/hostbased.rb +32 -33
  17. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +2 -4
  18. data/lib/net/ssh/authentication/methods/none.rb +10 -10
  19. data/lib/net/ssh/authentication/methods/password.rb +13 -13
  20. data/lib/net/ssh/authentication/methods/publickey.rb +54 -55
  21. data/lib/net/ssh/authentication/pageant.rb +468 -465
  22. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +44 -0
  23. data/lib/net/ssh/authentication/session.rb +127 -123
  24. data/lib/net/ssh/buffer.rb +305 -303
  25. data/lib/net/ssh/buffered_io.rb +163 -162
  26. data/lib/net/ssh/config.rb +230 -227
  27. data/lib/net/ssh/connection/channel.rb +659 -654
  28. data/lib/net/ssh/connection/constants.rb +30 -26
  29. data/lib/net/ssh/connection/event_loop.rb +108 -104
  30. data/lib/net/ssh/connection/keepalive.rb +54 -50
  31. data/lib/net/ssh/connection/session.rb +677 -678
  32. data/lib/net/ssh/connection/term.rb +180 -176
  33. data/lib/net/ssh/errors.rb +101 -99
  34. data/lib/net/ssh/key_factory.rb +108 -108
  35. data/lib/net/ssh/known_hosts.rb +148 -154
  36. data/lib/net/ssh/loggable.rb +56 -54
  37. data/lib/net/ssh/packet.rb +82 -78
  38. data/lib/net/ssh/prompt.rb +55 -53
  39. data/lib/net/ssh/proxy/command.rb +103 -102
  40. data/lib/net/ssh/proxy/errors.rb +12 -8
  41. data/lib/net/ssh/proxy/http.rb +92 -91
  42. data/lib/net/ssh/proxy/https.rb +42 -39
  43. data/lib/net/ssh/proxy/jump.rb +50 -47
  44. data/lib/net/ssh/proxy/socks4.rb +0 -2
  45. data/lib/net/ssh/proxy/socks5.rb +11 -11
  46. data/lib/net/ssh/ruby_compat.rb +1 -0
  47. data/lib/net/ssh/service/forward.rb +364 -362
  48. data/lib/net/ssh/test.rb +85 -83
  49. data/lib/net/ssh/test/channel.rb +146 -142
  50. data/lib/net/ssh/test/extensions.rb +148 -146
  51. data/lib/net/ssh/test/kex.rb +35 -31
  52. data/lib/net/ssh/test/local_packet.rb +48 -44
  53. data/lib/net/ssh/test/packet.rb +87 -84
  54. data/lib/net/ssh/test/remote_packet.rb +35 -31
  55. data/lib/net/ssh/test/script.rb +173 -171
  56. data/lib/net/ssh/test/socket.rb +59 -55
  57. data/lib/net/ssh/transport/algorithms.rb +413 -412
  58. data/lib/net/ssh/transport/cipher_factory.rb +108 -105
  59. data/lib/net/ssh/transport/constants.rb +35 -31
  60. data/lib/net/ssh/transport/ctr.rb +1 -1
  61. data/lib/net/ssh/transport/hmac.rb +1 -1
  62. data/lib/net/ssh/transport/hmac/abstract.rb +67 -64
  63. data/lib/net/ssh/transport/hmac/sha2_256_96.rb +1 -1
  64. data/lib/net/ssh/transport/hmac/sha2_512_96.rb +1 -1
  65. data/lib/net/ssh/transport/identity_cipher.rb +55 -51
  66. data/lib/net/ssh/transport/kex.rb +2 -4
  67. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +47 -40
  68. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +201 -197
  69. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +53 -56
  70. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +94 -87
  71. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +17 -10
  72. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +17 -10
  73. data/lib/net/ssh/transport/key_expander.rb +29 -25
  74. data/lib/net/ssh/transport/openssl.rb +17 -30
  75. data/lib/net/ssh/transport/packet_stream.rb +193 -192
  76. data/lib/net/ssh/transport/server_version.rb +64 -66
  77. data/lib/net/ssh/transport/session.rb +286 -284
  78. data/lib/net/ssh/transport/state.rb +198 -196
  79. data/lib/net/ssh/verifiers/lenient.rb +29 -25
  80. data/lib/net/ssh/verifiers/null.rb +13 -9
  81. data/lib/net/ssh/verifiers/secure.rb +45 -45
  82. data/lib/net/ssh/verifiers/strict.rb +20 -16
  83. data/lib/net/ssh/version.rb +55 -53
  84. data/net-ssh.gemspec +4 -4
  85. data/support/ssh_tunnel_bug.rb +2 -2
  86. metadata +25 -24
  87. metadata.gz.sig +0 -0
@@ -1,178 +1,182 @@
1
- module Net; module SSH; module Connection
1
+ module Net
2
+ module SSH
3
+ module Connection
2
4
 
3
- # These constants are used when requesting a pseudo-terminal (via
4
- # Net::SSH::Connection::Channel#request_pty). The descriptions for each are
5
- # taken directly from RFC 4254 ("The Secure Shell (SSH) Connection Protocol"),
6
- # http://tools.ietf.org/html/rfc4254.
7
- module Term
8
- # Interrupt character; 255 if none. Similarly for the other characters.
9
- # Not all of these characters are supported on all systems.
10
- VINTR = 1
11
-
12
- # The quit character (sends SIGQUIT signal on POSIX systems).
13
- VQUIT = 2
14
-
15
- # Erase the character to left of the cursor.
16
- VERASE = 3
17
-
18
- # Kill the current input line.
19
- VKILL = 4
20
-
21
- # End-of-file character (sends EOF from the terminal).
22
- VEOF = 5
23
-
24
- # End-of-line character in addition to carriage return and/or linefeed.
25
- VEOL = 6
26
-
27
- # Additional end-of-line character.
28
- VEOL2 = 7
29
-
30
- # Continues paused output (normally control-Q).
31
- VSTART = 8
32
-
33
- # Pauses output (normally control-S).
34
- VSTOP = 9
35
-
36
- # Suspends the current program.
37
- VSUSP = 10
38
-
39
- # Another suspend character.
40
- VDSUSP = 11
41
-
42
- # Reprints the current input line.
43
- VREPRINT = 12
44
-
45
- # Erases a word left of cursor.
46
- VWERASE = 13
47
-
48
- # Enter the next character typed literally, even if it is a special
49
- # character.
50
- VLNEXT = 14
51
-
52
- # Character to flush output.
53
- VFLUSH = 15
54
-
55
- # Switch to a different shell layer.
56
- VSWITCH = 16
57
-
58
- # Prints system status line (load, command, pid, etc).
59
- VSTATUS = 17
60
-
61
- # Toggles the flushing of terminal output.
62
- VDISCARD = 18
63
-
64
- # The ignore parity flag. The parameter SHOULD be 0 if this flag is FALSE,
65
- # and 1 if it is TRUE.
66
- IGNPAR = 30
67
-
68
- # Mark parity and framing errors.
69
- PARMRK = 31
70
-
71
- # Enable checking of parity errors.
72
- INPCK = 32
73
-
74
- # Strip 8th bit off characters.
75
- ISTRIP = 33
76
-
77
- # Map NL into CR on input.
78
- INCLR = 34
79
-
80
- # Ignore CR on input.
81
- IGNCR = 35
82
-
83
- # Map CR to NL on input.
84
- ICRNL = 36
85
-
86
- # Translate uppercase characters to lowercase.
87
- IUCLC = 37
88
-
89
- # Enable output flow control.
90
- IXON = 38
91
-
92
- # Any char will restart after stop.
93
- IXANY = 39
94
-
95
- # Enable input flow control.
96
- IXOFF = 40
97
-
98
- # Ring bell on input queue full.
99
- IMAXBEL = 41
100
-
101
- # Enable signals INTR, QUIT, [D]SUSP.
102
- ISIG = 50
103
-
104
- # Canonicalize input lines.
105
- ICANON = 51
106
-
107
- # Enable input and output of uppercase characters by preceding their
108
- # lowercase equivalents with "\".
109
- XCASE = 52
110
-
111
- # Enable echoing.
112
- ECHO = 53
113
-
114
- # Visually erase chars.
115
- ECHOE = 54
116
-
117
- # Kill character discards current line.
118
- ECHOK = 55
119
-
120
- # Echo NL even if ECHO is off.
121
- ECHONL = 56
122
-
123
- # Don't flush after interrupt.
124
- NOFLSH = 57
125
-
126
- # Stop background jobs from output.
127
- TOSTOP= 58
128
-
129
- # Enable extensions.
130
- IEXTEN = 59
131
-
132
- # Echo control characters as ^(Char).
133
- ECHOCTL = 60
134
-
135
- # Visual erase for line kill.
136
- ECHOKE = 61
137
-
138
- # Retype pending input.
139
- PENDIN = 62
140
-
141
- # Enable output processing.
142
- OPOST = 70
143
-
144
- # Convert lowercase to uppercase.
145
- OLCUC = 71
146
-
147
- # Map NL to CR-NL.
148
- ONLCR = 72
149
-
150
- # Translate carriage return to newline (output).
151
- OCRNL = 73
152
-
153
- # Translate newline to carriage return-newline (output).
154
- ONOCR = 74
155
-
156
- # Newline performs a carriage return (output).
157
- ONLRET = 75
158
-
159
- # 7 bit mode.
160
- CS7 = 90
161
-
162
- # 8 bit mode.
163
- CS8 = 91
164
-
165
- # Parity enable.
166
- PARENB = 92
167
-
168
- # Odd parity, else even.
169
- PARODD = 93
170
-
171
- # Specifies the input baud rate in bits per second.
172
- TTY_OP_ISPEED = 128
173
-
174
- # Specifies the output baud rate in bits per second.
175
- TTY_OP_OSPEED = 129
5
+ # These constants are used when requesting a pseudo-terminal (via
6
+ # Net::SSH::Connection::Channel#request_pty). The descriptions for each are
7
+ # taken directly from RFC 4254 ("The Secure Shell (SSH) Connection Protocol"),
8
+ # http://tools.ietf.org/html/rfc4254.
9
+ module Term
10
+ # Interrupt character; 255 if none. Similarly for the other characters.
11
+ # Not all of these characters are supported on all systems.
12
+ VINTR = 1
13
+
14
+ # The quit character (sends SIGQUIT signal on POSIX systems).
15
+ VQUIT = 2
16
+
17
+ # Erase the character to left of the cursor.
18
+ VERASE = 3
19
+
20
+ # Kill the current input line.
21
+ VKILL = 4
22
+
23
+ # End-of-file character (sends EOF from the terminal).
24
+ VEOF = 5
25
+
26
+ # End-of-line character in addition to carriage return and/or linefeed.
27
+ VEOL = 6
28
+
29
+ # Additional end-of-line character.
30
+ VEOL2 = 7
31
+
32
+ # Continues paused output (normally control-Q).
33
+ VSTART = 8
34
+
35
+ # Pauses output (normally control-S).
36
+ VSTOP = 9
37
+
38
+ # Suspends the current program.
39
+ VSUSP = 10
40
+
41
+ # Another suspend character.
42
+ VDSUSP = 11
43
+
44
+ # Reprints the current input line.
45
+ VREPRINT = 12
46
+
47
+ # Erases a word left of cursor.
48
+ VWERASE = 13
49
+
50
+ # Enter the next character typed literally, even if it is a special
51
+ # character.
52
+ VLNEXT = 14
53
+
54
+ # Character to flush output.
55
+ VFLUSH = 15
56
+
57
+ # Switch to a different shell layer.
58
+ VSWITCH = 16
59
+
60
+ # Prints system status line (load, command, pid, etc).
61
+ VSTATUS = 17
62
+
63
+ # Toggles the flushing of terminal output.
64
+ VDISCARD = 18
65
+
66
+ # The ignore parity flag. The parameter SHOULD be 0 if this flag is FALSE,
67
+ # and 1 if it is TRUE.
68
+ IGNPAR = 30
69
+
70
+ # Mark parity and framing errors.
71
+ PARMRK = 31
72
+
73
+ # Enable checking of parity errors.
74
+ INPCK = 32
75
+
76
+ # Strip 8th bit off characters.
77
+ ISTRIP = 33
78
+
79
+ # Map NL into CR on input.
80
+ INCLR = 34
81
+
82
+ # Ignore CR on input.
83
+ IGNCR = 35
84
+
85
+ # Map CR to NL on input.
86
+ ICRNL = 36
87
+
88
+ # Translate uppercase characters to lowercase.
89
+ IUCLC = 37
90
+
91
+ # Enable output flow control.
92
+ IXON = 38
93
+
94
+ # Any char will restart after stop.
95
+ IXANY = 39
96
+
97
+ # Enable input flow control.
98
+ IXOFF = 40
99
+
100
+ # Ring bell on input queue full.
101
+ IMAXBEL = 41
102
+
103
+ # Enable signals INTR, QUIT, [D]SUSP.
104
+ ISIG = 50
105
+
106
+ # Canonicalize input lines.
107
+ ICANON = 51
108
+
109
+ # Enable input and output of uppercase characters by preceding their
110
+ # lowercase equivalents with "\".
111
+ XCASE = 52
112
+
113
+ # Enable echoing.
114
+ ECHO = 53
115
+
116
+ # Visually erase chars.
117
+ ECHOE = 54
118
+
119
+ # Kill character discards current line.
120
+ ECHOK = 55
121
+
122
+ # Echo NL even if ECHO is off.
123
+ ECHONL = 56
124
+
125
+ # Don't flush after interrupt.
126
+ NOFLSH = 57
127
+
128
+ # Stop background jobs from output.
129
+ TOSTOP = 58
130
+
131
+ # Enable extensions.
132
+ IEXTEN = 59
133
+
134
+ # Echo control characters as ^(Char).
135
+ ECHOCTL = 60
136
+
137
+ # Visual erase for line kill.
138
+ ECHOKE = 61
139
+
140
+ # Retype pending input.
141
+ PENDIN = 62
142
+
143
+ # Enable output processing.
144
+ OPOST = 70
145
+
146
+ # Convert lowercase to uppercase.
147
+ OLCUC = 71
148
+
149
+ # Map NL to CR-NL.
150
+ ONLCR = 72
151
+
152
+ # Translate carriage return to newline (output).
153
+ OCRNL = 73
154
+
155
+ # Translate newline to carriage return-newline (output).
156
+ ONOCR = 74
157
+
158
+ # Newline performs a carriage return (output).
159
+ ONLRET = 75
160
+
161
+ # 7 bit mode.
162
+ CS7 = 90
163
+
164
+ # 8 bit mode.
165
+ CS8 = 91
166
+
167
+ # Parity enable.
168
+ PARENB = 92
169
+
170
+ # Odd parity, else even.
171
+ PARODD = 93
172
+
173
+ # Specifies the input baud rate in bits per second.
174
+ TTY_OP_ISPEED = 128
175
+
176
+ # Specifies the output baud rate in bits per second.
177
+ TTY_OP_OSPEED = 129
178
+ end
179
+
180
+ end
176
181
  end
177
-
178
- end; end; end
182
+ end
@@ -1,104 +1,106 @@
1
- module Net; module SSH
2
- # A general exception class, to act as the ancestor of all other Net::SSH
3
- # exception classes.
4
- class Exception < ::RuntimeError; end
5
-
6
- # This exception is raised when authentication fails (whether it be
7
- # public key authentication, password authentication, or whatever).
8
- class AuthenticationFailed < Net::SSH::Exception; end
9
-
10
- # This exception is raised when a connection attempt times out.
11
- class ConnectionTimeout < Net::SSH::Exception; end
12
-
13
- # This exception is raised when the remote host has disconnected
14
- # unexpectedly.
15
- class Disconnect < Net::SSH::Exception; end
16
-
17
- # This exception is raised when the remote host has disconnected/
18
- # timeouted unexpectedly.
19
- class Timeout < Disconnect; end
20
-
21
- # This exception is primarily used internally, but if you have a channel
22
- # request handler (see Net::SSH::Connection::Channel#on_request) that you
23
- # want to fail in such a way that the server knows it failed, you can
24
- # raise this exception in the handler and Net::SSH will translate that into
25
- # a "channel failure" message.
26
- class ChannelRequestFailed < Net::SSH::Exception; end
27
-
28
- # This is exception is primarily used internally, but if you have a channel
29
- # open handler (see Net::SSH::Connection::Session#on_open_channel) and you
30
- # want to fail in such a way that the server knows it failed, you can
31
- # raise this exception in the handler and Net::SSH will translate that into
32
- # a "channel open failed" message.
33
- class ChannelOpenFailed < Net::SSH::Exception
34
- attr_reader :code, :reason
35
-
36
- def initialize(code, reason)
37
- @code, @reason = code, reason
38
- super "#{reason} (#{code})"
39
- end
40
- end
41
-
42
- # Base class for host key exceptions. When rescuing this exception, you can
43
- # inspect the key fingerprint and, if you want to proceed anyway, simply call
44
- # the remember_host! method on the exception, and then retry.
45
- class HostKeyError < Net::SSH::Exception
46
- # the callback to use when #remember_host! is called
47
- attr_writer :callback #:nodoc:
48
-
49
- # situation-specific data describing the host (see #host, #port, etc.)
50
- attr_writer :data #:nodoc:
51
-
52
- # An accessor for getting at the data that was used to look up the host
53
- # (see also #fingerprint, #host, #port, #ip, and #key).
54
- def [](key)
55
- @data && @data[key]
1
+ module Net
2
+ module SSH
3
+ # A general exception class, to act as the ancestor of all other Net::SSH
4
+ # exception classes.
5
+ class Exception < ::RuntimeError; end
6
+
7
+ # This exception is raised when authentication fails (whether it be
8
+ # public key authentication, password authentication, or whatever).
9
+ class AuthenticationFailed < Net::SSH::Exception; end
10
+
11
+ # This exception is raised when a connection attempt times out.
12
+ class ConnectionTimeout < Net::SSH::Exception; end
13
+
14
+ # This exception is raised when the remote host has disconnected
15
+ # unexpectedly.
16
+ class Disconnect < Net::SSH::Exception; end
17
+
18
+ # This exception is raised when the remote host has disconnected/
19
+ # timeouted unexpectedly.
20
+ class Timeout < Disconnect; end
21
+
22
+ # This exception is primarily used internally, but if you have a channel
23
+ # request handler (see Net::SSH::Connection::Channel#on_request) that you
24
+ # want to fail in such a way that the server knows it failed, you can
25
+ # raise this exception in the handler and Net::SSH will translate that into
26
+ # a "channel failure" message.
27
+ class ChannelRequestFailed < Net::SSH::Exception; end
28
+
29
+ # This is exception is primarily used internally, but if you have a channel
30
+ # open handler (see Net::SSH::Connection::Session#on_open_channel) and you
31
+ # want to fail in such a way that the server knows it failed, you can
32
+ # raise this exception in the handler and Net::SSH will translate that into
33
+ # a "channel open failed" message.
34
+ class ChannelOpenFailed < Net::SSH::Exception
35
+ attr_reader :code, :reason
36
+
37
+ def initialize(code, reason)
38
+ @code, @reason = code, reason
39
+ super "#{reason} (#{code})"
40
+ end
56
41
  end
57
42
 
58
- # Returns the fingerprint of the key for the host, which either was not
59
- # found or did not match.
60
- def fingerprint
61
- @data && @data[:fingerprint]
43
+ # Base class for host key exceptions. When rescuing this exception, you can
44
+ # inspect the key fingerprint and, if you want to proceed anyway, simply call
45
+ # the remember_host! method on the exception, and then retry.
46
+ class HostKeyError < Net::SSH::Exception
47
+ # the callback to use when #remember_host! is called
48
+ attr_writer :callback #:nodoc:
49
+
50
+ # situation-specific data describing the host (see #host, #port, etc.)
51
+ attr_writer :data #:nodoc:
52
+
53
+ # An accessor for getting at the data that was used to look up the host
54
+ # (see also #fingerprint, #host, #port, #ip, and #key).
55
+ def [](key)
56
+ @data && @data[key]
57
+ end
58
+
59
+ # Returns the fingerprint of the key for the host, which either was not
60
+ # found or did not match.
61
+ def fingerprint
62
+ @data && @data[:fingerprint]
63
+ end
64
+
65
+ # Returns the host name for the remote host, as reported by the socket.
66
+ def host
67
+ @data && @data[:peer] && @data[:peer][:host]
68
+ end
69
+
70
+ # Returns the port number for the remote host, as reported by the socket.
71
+ def port
72
+ @data && @data[:peer] && @data[:peer][:port]
73
+ end
74
+
75
+ # Returns the IP address of the remote host, as reported by the socket.
76
+ def ip
77
+ @data && @data[:peer] && @data[:peer][:ip]
78
+ end
79
+
80
+ # Returns the key itself, as reported by the remote host.
81
+ def key
82
+ @data && @data[:key]
83
+ end
84
+
85
+ # Tell Net::SSH to record this host and key in the known hosts file, so
86
+ # that subsequent connections will remember them.
87
+ def remember_host!
88
+ @callback.call
89
+ end
62
90
  end
63
91
 
64
- # Returns the host name for the remote host, as reported by the socket.
65
- def host
66
- @data && @data[:peer] && @data[:peer][:host]
67
- end
68
-
69
- # Returns the port number for the remote host, as reported by the socket.
70
- def port
71
- @data && @data[:peer] && @data[:peer][:port]
72
- end
73
-
74
- # Returns the IP address of the remote host, as reported by the socket.
75
- def ip
76
- @data && @data[:peer] && @data[:peer][:ip]
77
- end
78
-
79
- # Returns the key itself, as reported by the remote host.
80
- def key
81
- @data && @data[:key]
82
- end
83
-
84
- # Tell Net::SSH to record this host and key in the known hosts file, so
85
- # that subsequent connections will remember them.
86
- def remember_host!
87
- @callback.call
88
- end
92
+ # Raised when the cached key for a particular host does not match the
93
+ # key given by the host, which can be indicative of a man-in-the-middle
94
+ # attack. When rescuing this exception, you can inspect the key fingerprint
95
+ # and, if you want to proceed anyway, simply call the remember_host!
96
+ # method on the exception, and then retry.
97
+ class HostKeyMismatch < HostKeyError; end
98
+
99
+ # Raised when there is no cached key for a particular host, which probably
100
+ # means that the host has simply not been seen before.
101
+ # When rescuing this exception, you can inspect the key fingerprint and, if
102
+ # you want to proceed anyway, simply call the remember_host! method on the
103
+ # exception, and then retry.
104
+ class HostKeyUnknown < HostKeyError; end
89
105
  end
90
-
91
- # Raised when the cached key for a particular host does not match the
92
- # key given by the host, which can be indicative of a man-in-the-middle
93
- # attack. When rescuing this exception, you can inspect the key fingerprint
94
- # and, if you want to proceed anyway, simply call the remember_host!
95
- # method on the exception, and then retry.
96
- class HostKeyMismatch < HostKeyError; end
97
-
98
- # Raised when there is no cached key for a particular host, which probably
99
- # means that the host has simply not been seen before.
100
- # When rescuing this exception, you can inspect the key fingerprint and, if
101
- # you want to proceed anyway, simply call the remember_host! method on the
102
- # exception, and then retry.
103
- class HostKeyUnknown < HostKeyError; end
104
- end; end
106
+ end