vcr 4.0.0 → 6.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/vcr/cassette/erb_renderer.rb +4 -2
- data/lib/vcr/cassette/http_interaction_list.rb +14 -9
- data/lib/vcr/cassette/migrator.rb +5 -6
- data/lib/vcr/cassette/persisters/file_system.rb +9 -1
- data/lib/vcr/cassette/serializers/compressed.rb +2 -2
- data/lib/vcr/cassette/serializers/json.rb +14 -8
- data/lib/vcr/cassette/serializers/psych.rb +10 -2
- data/lib/vcr/cassette/serializers/syck.rb +7 -1
- data/lib/vcr/cassette/serializers/yaml.rb +14 -2
- data/lib/vcr/cassette/serializers.rb +10 -0
- data/lib/vcr/cassette.rb +55 -16
- data/lib/vcr/configuration.rb +18 -3
- data/lib/vcr/errors.rb +1 -12
- data/lib/vcr/library_hooks/excon.rb +8 -0
- data/lib/vcr/library_hooks/typhoeus.rb +94 -111
- data/lib/vcr/library_hooks/webmock.rb +2 -11
- data/lib/vcr/linked_cassette.rb +4 -4
- data/lib/vcr/middleware/excon.rb +1 -1
- data/lib/vcr/middleware/faraday.rb +24 -1
- data/lib/vcr/request_ignorer.rb +8 -1
- data/lib/vcr/request_matcher_registry.rb +3 -3
- data/lib/vcr/structs.rb +47 -31
- data/lib/vcr/test_frameworks/cucumber.rb +16 -5
- data/lib/vcr/test_frameworks/rspec.rb +34 -22
- data/lib/vcr/util/internet_connection.rb +15 -21
- data/lib/vcr/version.rb +2 -2
- data/lib/vcr.rb +44 -11
- metadata +51 -38
- data/lib/vcr/library_hooks/typhoeus_0.4.rb +0 -103
@@ -1,31 +1,25 @@
|
|
1
1
|
module VCR
|
2
2
|
# Ruby 1.8 provides Ping.pingecho, but it was removed in 1.9.
|
3
|
-
#
|
4
|
-
|
5
|
-
|
6
|
-
Ping = ::Ping
|
7
|
-
rescue LoadError
|
8
|
-
# This is copied, verbatim, from Ruby 1.8.7's ping.rb.
|
9
|
-
require 'timeout'
|
10
|
-
require "socket"
|
3
|
+
# This is copied, verbatim, from Ruby 1.8.7's ping.rb.
|
4
|
+
require 'timeout'
|
5
|
+
require "socket"
|
11
6
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
20
|
-
rescue Errno::ECONNREFUSED
|
21
|
-
return true
|
22
|
-
rescue Timeout::Error, StandardError
|
23
|
-
return false
|
7
|
+
# @private
|
8
|
+
module Ping
|
9
|
+
def pingecho(host, timeout=5, service="echo")
|
10
|
+
begin
|
11
|
+
Timeout.timeout(timeout) do
|
12
|
+
s = TCPSocket.new(host, service)
|
13
|
+
s.close
|
24
14
|
end
|
15
|
+
rescue Errno::ECONNREFUSED
|
25
16
|
return true
|
17
|
+
rescue Timeout::Error, StandardError
|
18
|
+
return false
|
26
19
|
end
|
27
|
-
|
20
|
+
return true
|
28
21
|
end
|
22
|
+
module_function :pingecho
|
29
23
|
end
|
30
24
|
|
31
25
|
# @private
|
data/lib/vcr/version.rb
CHANGED
@@ -10,7 +10,7 @@ module VCR
|
|
10
10
|
# * `parts` [Array<Integer>] List of the version parts.
|
11
11
|
def version
|
12
12
|
@version ||= begin
|
13
|
-
string = '
|
13
|
+
string = +'6.2.0'
|
14
14
|
|
15
15
|
def string.parts
|
16
16
|
split('.').map { |p| p.to_i }
|
@@ -28,7 +28,7 @@ module VCR
|
|
28
28
|
parts[2]
|
29
29
|
end
|
30
30
|
|
31
|
-
string
|
31
|
+
string.freeze
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
data/lib/vcr.rb
CHANGED
@@ -52,7 +52,7 @@ module VCR
|
|
52
52
|
# Inserts the named cassette using the given cassette options.
|
53
53
|
# New HTTP interactions, if allowed by the cassette's `:record` option, will
|
54
54
|
# be recorded to the cassette. The cassette's existing HTTP interactions
|
55
|
-
# will be used to stub requests, unless prevented by the
|
55
|
+
# will be used to stub requests, unless prevented by the cassette's
|
56
56
|
# `:record` option.
|
57
57
|
#
|
58
58
|
# @example
|
@@ -107,6 +107,12 @@ module VCR
|
|
107
107
|
# @option options :persist_with [Symbol] Which cassette persister to
|
108
108
|
# use. Defaults to :file_system. You can also register and use a
|
109
109
|
# custom persister.
|
110
|
+
# @option options :persister_options [Hash] Pass options to the
|
111
|
+
# persister specified in `persist_with`. Currently available options for the file_system persister:
|
112
|
+
# - `:downcase_cassette_names`: when `true`, names of cassettes will be
|
113
|
+
# normalized in lowercase before reading and writing, which can avoid
|
114
|
+
# confusion when using both case-sensitive and case-insensitive file
|
115
|
+
# systems.
|
110
116
|
# @option options :preserve_exact_body_bytes [Boolean] Whether or not
|
111
117
|
# to base64 encode the bytes of the requests and responses for this cassette
|
112
118
|
# when serializing it. See also `VCR::Configuration#preserve_exact_body_bytes`.
|
@@ -186,6 +192,9 @@ module VCR
|
|
186
192
|
|
187
193
|
begin
|
188
194
|
call_block(block, cassette)
|
195
|
+
rescue StandardError
|
196
|
+
cassette.run_failed!
|
197
|
+
raise
|
189
198
|
ensure
|
190
199
|
eject_cassette
|
191
200
|
end
|
@@ -194,18 +203,21 @@ module VCR
|
|
194
203
|
# Inserts multiple cassettes the given names
|
195
204
|
#
|
196
205
|
# @example
|
197
|
-
#
|
198
|
-
#
|
199
|
-
#
|
200
|
-
#
|
201
|
-
#
|
202
|
-
#
|
203
|
-
#
|
206
|
+
# cassettes = [
|
207
|
+
# { name: 'github' },
|
208
|
+
# { name: 'apple', options: { erb: true } }
|
209
|
+
# ]
|
210
|
+
# VCR.use_cassettes(cassettes) do
|
211
|
+
# # make multiple HTTP requests
|
212
|
+
# end
|
204
213
|
def use_cassettes(cassettes, &block)
|
205
|
-
return use_cassette(cassettes.last[:name]) { block.call } if cassettes.length == 1
|
206
214
|
cassette = cassettes.pop
|
207
|
-
use_cassette(cassette[:name], cassette[:options]) do
|
208
|
-
|
215
|
+
use_cassette(cassette[:name], cassette[:options] || {}) do
|
216
|
+
if cassettes.empty?
|
217
|
+
block.call
|
218
|
+
else
|
219
|
+
use_cassettes(cassettes, &block)
|
220
|
+
end
|
209
221
|
end
|
210
222
|
end
|
211
223
|
|
@@ -254,6 +266,7 @@ module VCR
|
|
254
266
|
# @see #turn_off!
|
255
267
|
# @see #turn_on!
|
256
268
|
# @see #turned_on?
|
269
|
+
# @see #turned_on
|
257
270
|
def turned_off(options = {})
|
258
271
|
turn_off!(options)
|
259
272
|
|
@@ -289,11 +302,28 @@ module VCR
|
|
289
302
|
set_context_value(:turned_off, true)
|
290
303
|
end
|
291
304
|
|
305
|
+
# Turns on VCR, for the duration of a block.
|
306
|
+
# @param (see #turn_off!)
|
307
|
+
# @return [void]
|
308
|
+
# @see #turn_off!
|
309
|
+
# @see #turned_off
|
310
|
+
# @see #turned_on?
|
311
|
+
def turned_on(options = {})
|
312
|
+
turn_on!
|
313
|
+
|
314
|
+
begin
|
315
|
+
yield
|
316
|
+
ensure
|
317
|
+
turn_off!(options)
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
292
321
|
# Turns on VCR, if it has previously been turned off.
|
293
322
|
# @return [void]
|
294
323
|
# @see #turn_off!
|
295
324
|
# @see #turned_off
|
296
325
|
# @see #turned_on?
|
326
|
+
# @see #turned_on
|
297
327
|
def turn_on!
|
298
328
|
set_context_value(:turned_off, false)
|
299
329
|
end
|
@@ -305,6 +335,9 @@ module VCR
|
|
305
335
|
# @see #turn_off!
|
306
336
|
# @see #turned_off
|
307
337
|
def turned_on?
|
338
|
+
linked_context = current_context[:linked_context]
|
339
|
+
return !linked_context[:turned_off] if linked_context
|
340
|
+
|
308
341
|
!context_value(:turned_off)
|
309
342
|
end
|
310
343
|
|
metadata
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vcr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Myron Marston
|
8
|
-
|
8
|
+
- Kurtis Rainbolt-Greene
|
9
|
+
- Olle Jonsson
|
10
|
+
autorequire:
|
9
11
|
bindir: bin
|
10
12
|
cert_chain: []
|
11
|
-
date:
|
13
|
+
date: 2023-06-26 00:00:00.000000000 Z
|
12
14
|
dependencies:
|
13
15
|
- !ruby/object:Gem::Dependency
|
14
16
|
name: bundler
|
@@ -16,14 +18,14 @@ dependencies:
|
|
16
18
|
requirements:
|
17
19
|
- - "~>"
|
18
20
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
21
|
+
version: '2.0'
|
20
22
|
type: :development
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
23
25
|
requirements:
|
24
26
|
- - "~>"
|
25
27
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
28
|
+
version: '2.0'
|
27
29
|
- !ruby/object:Gem::Dependency
|
28
30
|
name: rspec
|
29
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,28 +46,28 @@ dependencies:
|
|
44
46
|
requirements:
|
45
47
|
- - "~>"
|
46
48
|
- !ruby/object:Gem::Version
|
47
|
-
version: 3.
|
49
|
+
version: 3.4.4
|
48
50
|
type: :development
|
49
51
|
prerelease: false
|
50
52
|
version_requirements: !ruby/object:Gem::Requirement
|
51
53
|
requirements:
|
52
54
|
- - "~>"
|
53
55
|
- !ruby/object:Gem::Version
|
54
|
-
version: 3.
|
56
|
+
version: 3.4.4
|
55
57
|
- !ruby/object:Gem::Dependency
|
56
58
|
name: rake
|
57
59
|
requirement: !ruby/object:Gem::Requirement
|
58
60
|
requirements:
|
59
|
-
- - "
|
61
|
+
- - ">="
|
60
62
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
63
|
+
version: 12.3.3
|
62
64
|
type: :development
|
63
65
|
prerelease: false
|
64
66
|
version_requirements: !ruby/object:Gem::Requirement
|
65
67
|
requirements:
|
66
|
-
- - "
|
68
|
+
- - ">="
|
67
69
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
70
|
+
version: 12.3.3
|
69
71
|
- !ruby/object:Gem::Dependency
|
70
72
|
name: pry
|
71
73
|
requirement: !ruby/object:Gem::Requirement
|
@@ -151,63 +153,75 @@ dependencies:
|
|
151
153
|
- !ruby/object:Gem::Version
|
152
154
|
version: '0'
|
153
155
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
156
|
+
name: hashdiff
|
155
157
|
requirement: !ruby/object:Gem::Requirement
|
156
158
|
requirements:
|
157
|
-
- - "
|
159
|
+
- - ">="
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: 1.0.0.beta1
|
162
|
+
- - "<"
|
158
163
|
- !ruby/object:Gem::Version
|
159
|
-
version: 2.0.
|
164
|
+
version: 2.0.0
|
160
165
|
type: :development
|
161
166
|
prerelease: false
|
162
167
|
version_requirements: !ruby/object:Gem::Requirement
|
163
168
|
requirements:
|
164
|
-
- - "
|
169
|
+
- - ">="
|
165
170
|
- !ruby/object:Gem::Version
|
166
|
-
version:
|
171
|
+
version: 1.0.0.beta1
|
172
|
+
- - "<"
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: 2.0.0
|
167
175
|
- !ruby/object:Gem::Dependency
|
168
|
-
name:
|
176
|
+
name: cucumber
|
169
177
|
requirement: !ruby/object:Gem::Requirement
|
170
178
|
requirements:
|
171
179
|
- - "~>"
|
172
180
|
- !ruby/object:Gem::Version
|
173
|
-
version: 0
|
181
|
+
version: '7.0'
|
174
182
|
type: :development
|
175
183
|
prerelease: false
|
176
184
|
version_requirements: !ruby/object:Gem::Requirement
|
177
185
|
requirements:
|
178
186
|
- - "~>"
|
179
187
|
- !ruby/object:Gem::Version
|
180
|
-
version: 0
|
188
|
+
version: '7.0'
|
181
189
|
- !ruby/object:Gem::Dependency
|
182
|
-
name:
|
190
|
+
name: aruba
|
183
191
|
requirement: !ruby/object:Gem::Requirement
|
184
192
|
requirements:
|
185
193
|
- - "~>"
|
186
194
|
- !ruby/object:Gem::Version
|
187
|
-
version: 0.
|
195
|
+
version: 0.14.14
|
188
196
|
type: :development
|
189
197
|
prerelease: false
|
190
198
|
version_requirements: !ruby/object:Gem::Requirement
|
191
199
|
requirements:
|
192
200
|
- - "~>"
|
193
201
|
- !ruby/object:Gem::Version
|
194
|
-
version: 0.
|
202
|
+
version: 0.14.14
|
195
203
|
- !ruby/object:Gem::Dependency
|
196
|
-
name:
|
204
|
+
name: faraday
|
197
205
|
requirement: !ruby/object:Gem::Requirement
|
198
206
|
requirements:
|
199
207
|
- - ">="
|
200
208
|
- !ruby/object:Gem::Version
|
201
|
-
version:
|
209
|
+
version: 0.11.0
|
210
|
+
- - "<"
|
211
|
+
- !ruby/object:Gem::Version
|
212
|
+
version: 2.0.0
|
202
213
|
type: :development
|
203
214
|
prerelease: false
|
204
215
|
version_requirements: !ruby/object:Gem::Requirement
|
205
216
|
requirements:
|
206
217
|
- - ">="
|
207
218
|
- !ruby/object:Gem::Version
|
208
|
-
version:
|
219
|
+
version: 0.11.0
|
220
|
+
- - "<"
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: 2.0.0
|
209
223
|
- !ruby/object:Gem::Dependency
|
210
|
-
name:
|
224
|
+
name: httpclient
|
211
225
|
requirement: !ruby/object:Gem::Requirement
|
212
226
|
requirements:
|
213
227
|
- - ">="
|
@@ -221,21 +235,21 @@ dependencies:
|
|
221
235
|
- !ruby/object:Gem::Version
|
222
236
|
version: '0'
|
223
237
|
- !ruby/object:Gem::Dependency
|
224
|
-
name:
|
238
|
+
name: excon
|
225
239
|
requirement: !ruby/object:Gem::Requirement
|
226
240
|
requirements:
|
227
241
|
- - ">="
|
228
242
|
- !ruby/object:Gem::Version
|
229
|
-
version:
|
243
|
+
version: 0.62.0
|
230
244
|
type: :development
|
231
245
|
prerelease: false
|
232
246
|
version_requirements: !ruby/object:Gem::Requirement
|
233
247
|
requirements:
|
234
248
|
- - ">="
|
235
249
|
- !ruby/object:Gem::Version
|
236
|
-
version:
|
250
|
+
version: 0.62.0
|
237
251
|
- !ruby/object:Gem::Dependency
|
238
|
-
name:
|
252
|
+
name: timecop
|
239
253
|
requirement: !ruby/object:Gem::Requirement
|
240
254
|
requirements:
|
241
255
|
- - ">="
|
@@ -307,7 +321,7 @@ dependencies:
|
|
307
321
|
description: Record your test suite's HTTP interactions and replay them during future
|
308
322
|
test runs for fast, deterministic, accurate tests.
|
309
323
|
email:
|
310
|
-
-
|
324
|
+
- kurtis@rainbolt-greene.online
|
311
325
|
executables: []
|
312
326
|
extensions: []
|
313
327
|
extra_rdoc_files: []
|
@@ -332,7 +346,6 @@ files:
|
|
332
346
|
- lib/vcr/library_hooks/excon.rb
|
333
347
|
- lib/vcr/library_hooks/faraday.rb
|
334
348
|
- lib/vcr/library_hooks/typhoeus.rb
|
335
|
-
- lib/vcr/library_hooks/typhoeus_0.4.rb
|
336
349
|
- lib/vcr/library_hooks/webmock.rb
|
337
350
|
- lib/vcr/linked_cassette.rb
|
338
351
|
- lib/vcr/middleware/excon.rb
|
@@ -352,11 +365,12 @@ files:
|
|
352
365
|
- lib/vcr/util/variable_args_block_caller.rb
|
353
366
|
- lib/vcr/util/version_checker.rb
|
354
367
|
- lib/vcr/version.rb
|
355
|
-
homepage: https://
|
368
|
+
homepage: https://benoittgt.github.io/vcr
|
356
369
|
licenses:
|
370
|
+
- Hippocratic-2.1
|
357
371
|
- MIT
|
358
372
|
metadata: {}
|
359
|
-
post_install_message:
|
373
|
+
post_install_message:
|
360
374
|
rdoc_options: []
|
361
375
|
require_paths:
|
362
376
|
- lib
|
@@ -364,16 +378,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
364
378
|
requirements:
|
365
379
|
- - ">="
|
366
380
|
- !ruby/object:Gem::Version
|
367
|
-
version:
|
381
|
+
version: '2.7'
|
368
382
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
369
383
|
requirements:
|
370
384
|
- - ">="
|
371
385
|
- !ruby/object:Gem::Version
|
372
386
|
version: '0'
|
373
387
|
requirements: []
|
374
|
-
|
375
|
-
|
376
|
-
signing_key:
|
388
|
+
rubygems_version: 3.4.14
|
389
|
+
signing_key:
|
377
390
|
specification_version: 4
|
378
391
|
summary: Record your test suite's HTTP interactions and replay them during future
|
379
392
|
test runs for fast, deterministic, accurate tests.
|
@@ -1,103 +0,0 @@
|
|
1
|
-
VCR::VersionChecker.new('Typhoeus', Typhoeus::VERSION, '0.3.2').check_version!
|
2
|
-
|
3
|
-
module VCR
|
4
|
-
class LibraryHooks
|
5
|
-
# @private
|
6
|
-
module Typhoeus
|
7
|
-
# @private
|
8
|
-
class RequestHandler < ::VCR::RequestHandler
|
9
|
-
attr_reader :request
|
10
|
-
def initialize(request)
|
11
|
-
@request = request
|
12
|
-
end
|
13
|
-
|
14
|
-
def vcr_request
|
15
|
-
@vcr_request ||= VCR::Request.new \
|
16
|
-
request.method,
|
17
|
-
request.url,
|
18
|
-
request.body,
|
19
|
-
request.headers
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def externally_stubbed?
|
25
|
-
::Typhoeus::Hydra.stubs.detect { |stub| stub.matches?(request) }
|
26
|
-
end
|
27
|
-
|
28
|
-
def set_typed_request_for_after_hook(*args)
|
29
|
-
super
|
30
|
-
request.instance_variable_set(:@__typed_vcr_request, @after_hook_typed_request)
|
31
|
-
end
|
32
|
-
|
33
|
-
def on_unhandled_request
|
34
|
-
invoke_after_request_hook(nil)
|
35
|
-
super
|
36
|
-
end
|
37
|
-
|
38
|
-
def on_stubbed_by_vcr_request
|
39
|
-
::Typhoeus::Response.new \
|
40
|
-
:http_version => stubbed_response.http_version,
|
41
|
-
:code => stubbed_response.status.code,
|
42
|
-
:status_message => stubbed_response.status.message,
|
43
|
-
:headers_hash => stubbed_response_headers,
|
44
|
-
:body => stubbed_response.body
|
45
|
-
end
|
46
|
-
|
47
|
-
def stubbed_response_headers
|
48
|
-
@stubbed_response_headers ||= {}.tap do |hash|
|
49
|
-
stubbed_response.headers.each do |key, values|
|
50
|
-
hash[key] = values.size == 1 ? values.first : values
|
51
|
-
end if stubbed_response.headers
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
# @private
|
57
|
-
def self.vcr_response_from(response)
|
58
|
-
VCR::Response.new \
|
59
|
-
VCR::ResponseStatus.new(response.code, response.status_message),
|
60
|
-
response.headers_hash,
|
61
|
-
response.body,
|
62
|
-
response.http_version
|
63
|
-
end
|
64
|
-
|
65
|
-
::Typhoeus::Hydra.after_request_before_on_complete do |request|
|
66
|
-
unless VCR.library_hooks.disabled?(:typhoeus)
|
67
|
-
vcr_response = vcr_response_from(request.response)
|
68
|
-
typed_vcr_request = request.send(:remove_instance_variable, :@__typed_vcr_request)
|
69
|
-
|
70
|
-
unless request.response.mock?
|
71
|
-
http_interaction = VCR::HTTPInteraction.new(typed_vcr_request, vcr_response)
|
72
|
-
VCR.record_http_interaction(http_interaction)
|
73
|
-
end
|
74
|
-
|
75
|
-
VCR.configuration.invoke_hook(:after_http_request, typed_vcr_request, vcr_response)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
::Typhoeus::Hydra.register_stub_finder do |request|
|
80
|
-
VCR::LibraryHooks::Typhoeus::RequestHandler.new(request).handle
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# @private
|
87
|
-
module Typhoeus
|
88
|
-
class << Hydra
|
89
|
-
# ensure HTTP requests are always allowed; VCR takes care of disallowing
|
90
|
-
# them at the appropriate times in its hook
|
91
|
-
def allow_net_connect_with_vcr?(*args)
|
92
|
-
VCR.turned_on? ? true : allow_net_connect_without_vcr?
|
93
|
-
end
|
94
|
-
|
95
|
-
alias allow_net_connect_without_vcr? allow_net_connect?
|
96
|
-
alias allow_net_connect? allow_net_connect_with_vcr?
|
97
|
-
end unless Hydra.respond_to?(:allow_net_connect_with_vcr?)
|
98
|
-
end
|
99
|
-
|
100
|
-
VCR.configuration.after_library_hooks_loaded do
|
101
|
-
::Kernel.warn "WARNING: VCR's Typhoeus 0.4 integration is deprecated and will be removed in VCR 3.0."
|
102
|
-
end
|
103
|
-
|