fog 0.0.38 → 0.0.39
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/fog.gemspec +5 -7
- data/lib/fog/aws/models/ec2/addresses.rb +7 -5
- data/lib/fog/aws/models/ec2/instances.rb +7 -9
- data/lib/fog/aws/models/ec2/key_pairs.rb +7 -9
- data/lib/fog/aws/models/ec2/security_groups.rb +7 -9
- data/lib/fog/aws/models/ec2/snapshots.rb +8 -9
- data/lib/fog/aws/models/ec2/volumes.rb +8 -9
- data/lib/fog/aws/models/s3/buckets.rb +9 -16
- data/lib/fog/aws/models/s3/objects.rb +12 -13
- data/lib/fog/aws/requests/s3/get_bucket.rb +1 -1
- data/lib/fog/collection.rb +16 -0
- data/lib/fog/rackspace/models/servers/flavors.rb +6 -8
- data/lib/fog/rackspace/models/servers/images.rb +7 -14
- data/lib/fog/rackspace/models/servers/servers.rb +6 -8
- data/spec/slicehost/requests/create_slice_spec.rb +1 -1
- data/spec/slicehost/requests/delete_slice_spec.rb +1 -1
- metadata +3 -5
- data/spec/aws/models/s3/owner_spec.rb +0 -18
data/Rakefile
CHANGED
@@ -7,7 +7,7 @@ require "#{current_directory}/lib/fog"
|
|
7
7
|
begin
|
8
8
|
require 'jeweler'
|
9
9
|
Jeweler::Tasks.new do |gem|
|
10
|
-
gem.add_dependency('excon', '>=0.0.
|
10
|
+
gem.add_dependency('excon', '>=0.0.14')
|
11
11
|
gem.add_dependency('mime-types')
|
12
12
|
gem.add_dependency('nokogiri')
|
13
13
|
gem.add_dependency('ruby-hmac')
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.39
|
data/fog.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{fog}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.39"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["geemus (Wesley Beary)"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2010-01-04}
|
13
13
|
s.default_executable = %q{fog}
|
14
14
|
s.description = %q{brings clouds to you}
|
15
15
|
s.email = %q{me@geemus.com}
|
@@ -194,7 +194,6 @@ Gem::Specification.new do |s|
|
|
194
194
|
"spec/aws/models/s3/buckets_spec.rb",
|
195
195
|
"spec/aws/models/s3/object_spec.rb",
|
196
196
|
"spec/aws/models/s3/objects_spec.rb",
|
197
|
-
"spec/aws/models/s3/owner_spec.rb",
|
198
197
|
"spec/aws/requests/ec2/allocate_address_spec.rb",
|
199
198
|
"spec/aws/requests/ec2/associate_address_spec.rb",
|
200
199
|
"spec/aws/requests/ec2/attach_volume_spec.rb",
|
@@ -303,7 +302,6 @@ Gem::Specification.new do |s|
|
|
303
302
|
"spec/aws/models/s3/buckets_spec.rb",
|
304
303
|
"spec/aws/models/s3/object_spec.rb",
|
305
304
|
"spec/aws/models/s3/objects_spec.rb",
|
306
|
-
"spec/aws/models/s3/owner_spec.rb",
|
307
305
|
"spec/aws/requests/ec2/allocate_address_spec.rb",
|
308
306
|
"spec/aws/requests/ec2/associate_address_spec.rb",
|
309
307
|
"spec/aws/requests/ec2/attach_volume_spec.rb",
|
@@ -393,18 +391,18 @@ Gem::Specification.new do |s|
|
|
393
391
|
s.specification_version = 3
|
394
392
|
|
395
393
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
396
|
-
s.add_runtime_dependency(%q<excon>, [">= 0.0.
|
394
|
+
s.add_runtime_dependency(%q<excon>, [">= 0.0.14"])
|
397
395
|
s.add_runtime_dependency(%q<mime-types>, [">= 0"])
|
398
396
|
s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
|
399
397
|
s.add_runtime_dependency(%q<ruby-hmac>, [">= 0"])
|
400
398
|
else
|
401
|
-
s.add_dependency(%q<excon>, [">= 0.0.
|
399
|
+
s.add_dependency(%q<excon>, [">= 0.0.14"])
|
402
400
|
s.add_dependency(%q<mime-types>, [">= 0"])
|
403
401
|
s.add_dependency(%q<nokogiri>, [">= 0"])
|
404
402
|
s.add_dependency(%q<ruby-hmac>, [">= 0"])
|
405
403
|
end
|
406
404
|
else
|
407
|
-
s.add_dependency(%q<excon>, [">= 0.0.
|
405
|
+
s.add_dependency(%q<excon>, [">= 0.0.14"])
|
408
406
|
s.add_dependency(%q<mime-types>, [">= 0"])
|
409
407
|
s.add_dependency(%q<nokogiri>, [">= 0"])
|
410
408
|
s.add_dependency(%q<ruby-hmac>, [">= 0"])
|
@@ -21,18 +21,20 @@ module Fog
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def all(public_ip = @public_ip)
|
24
|
+
@public_ip = public_ip
|
25
|
+
if @loaded
|
26
|
+
clear
|
27
|
+
end
|
28
|
+
@loaded = true
|
24
29
|
data = connection.describe_addresses(public_ip).body
|
25
|
-
addresses =
|
26
|
-
:connection => connection,
|
27
|
-
:public_ip => public_ip
|
28
|
-
}.merge!(attributes))
|
30
|
+
addresses = []
|
29
31
|
data['addressesSet'].each do |address|
|
30
32
|
addresses << new(address.reject {|key, value| value.nil? || value.empty? })
|
31
33
|
end
|
32
34
|
if instance
|
33
35
|
addresses = addresses.select {|address| address.instance_id == instance.id}
|
34
36
|
end
|
35
|
-
addresses
|
37
|
+
self.replace(addresses)
|
36
38
|
end
|
37
39
|
|
38
40
|
def get(public_ip)
|
@@ -18,20 +18,18 @@ module Fog
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def all(instance_id = @instance_id)
|
21
|
+
@instance_id = instance_id
|
22
|
+
if @loaded
|
23
|
+
clear
|
24
|
+
end
|
25
|
+
@loaded = true
|
21
26
|
data = connection.describe_instances(instance_id).body
|
22
|
-
instances = Fog::AWS::EC2::Instances.new({
|
23
|
-
:connection => connection,
|
24
|
-
:instance_id => instance_id
|
25
|
-
}.merge!(attributes))
|
26
27
|
data['reservationSet'].each do |reservation|
|
27
28
|
reservation['instancesSet'].each do |instance|
|
28
|
-
|
29
|
-
:collection => instances,
|
30
|
-
:connection => connection
|
31
|
-
}.merge!(instance))
|
29
|
+
self << new(instance)
|
32
30
|
end
|
33
31
|
end
|
34
|
-
|
32
|
+
self
|
35
33
|
end
|
36
34
|
|
37
35
|
def get(instance_id)
|
@@ -18,18 +18,16 @@ module Fog
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def all(key_name = @key_name)
|
21
|
+
@key_name = key_name
|
22
|
+
if @loaded
|
23
|
+
clear
|
24
|
+
end
|
25
|
+
@loaded = true
|
21
26
|
data = connection.describe_key_pairs(key_name).body
|
22
|
-
key_pairs = Fog::AWS::EC2::KeyPairs.new({
|
23
|
-
:connection => connection,
|
24
|
-
:key_name => key_name
|
25
|
-
}.merge!(attributes))
|
26
27
|
data['keySet'].each do |key|
|
27
|
-
|
28
|
-
:collection => key_pairs,
|
29
|
-
:connection => connection
|
30
|
-
}.merge!(key))
|
28
|
+
self << new(key)
|
31
29
|
end
|
32
|
-
|
30
|
+
self
|
33
31
|
end
|
34
32
|
|
35
33
|
def get(key_name)
|
@@ -18,18 +18,16 @@ module Fog
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def all(group_name = @group_name)
|
21
|
+
@group_name = group_name
|
22
|
+
if @loaded
|
23
|
+
clear
|
24
|
+
end
|
25
|
+
@loaded = true
|
21
26
|
data = connection.describe_security_groups(group_name).body
|
22
|
-
security_groups = Fog::AWS::EC2::SecurityGroups.new({
|
23
|
-
:connection => connection,
|
24
|
-
:group_name => group_name
|
25
|
-
}.merge!(attributes))
|
26
27
|
data['securityGroupInfo'].each do |security_group|
|
27
|
-
|
28
|
-
:collection => security_groups,
|
29
|
-
:connection => connection
|
30
|
-
}.merge!(security_group))
|
28
|
+
self << new(security_group)
|
31
29
|
end
|
32
|
-
|
30
|
+
self
|
33
31
|
end
|
34
32
|
|
35
33
|
def get(group_name)
|
@@ -21,21 +21,20 @@ module Fog
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def all(snapshot_id = @snapshot_id)
|
24
|
+
@snapshot_id = snapshot_id
|
25
|
+
if @loaded
|
26
|
+
clear
|
27
|
+
end
|
28
|
+
@loaded = true
|
24
29
|
data = connection.describe_snapshots(snapshot_id).body
|
25
|
-
snapshots =
|
26
|
-
:connection => connection,
|
27
|
-
:snapshot_id => snapshot_id
|
28
|
-
}.merge!(attributes))
|
30
|
+
snapshots = []
|
29
31
|
data['snapshotSet'].each do |snapshot|
|
30
|
-
snapshots <<
|
31
|
-
:collection => snapshots,
|
32
|
-
:connection => connection
|
33
|
-
}.merge!(snapshot))
|
32
|
+
snapshots << new(snapshot)
|
34
33
|
end
|
35
34
|
if volume
|
36
35
|
snapshots = snapshots.select {|snapshot| snapshot.volume_id == volume.id}
|
37
36
|
end
|
38
|
-
snapshots
|
37
|
+
self.replace(snapshots)
|
39
38
|
end
|
40
39
|
|
41
40
|
def get(snapshot_id)
|
@@ -21,21 +21,20 @@ module Fog
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def all(volume_id = @volume_id)
|
24
|
+
@volume_id = volume_id
|
25
|
+
if @loaded
|
26
|
+
clear
|
27
|
+
end
|
28
|
+
@loaded = true
|
24
29
|
data = connection.describe_volumes(volume_id).body
|
25
|
-
volumes =
|
26
|
-
:connection => connection,
|
27
|
-
:volume_id => volume_id
|
28
|
-
}.merge!(attributes))
|
30
|
+
volumes = []
|
29
31
|
data['volumeSet'].each do |volume|
|
30
|
-
volumes <<
|
31
|
-
:collection => volumes,
|
32
|
-
:connection => connection
|
33
|
-
}.merge!(volume))
|
32
|
+
volumes << new(volume)
|
34
33
|
end
|
35
34
|
if instance
|
36
35
|
volumes = volumes.select {|volume| volume.instance_id == instance.id}
|
37
36
|
end
|
38
|
-
volumes
|
37
|
+
self.replace(volumes)
|
39
38
|
end
|
40
39
|
|
41
40
|
def get(volume_id)
|
@@ -11,15 +11,15 @@ module Fog
|
|
11
11
|
model Fog::AWS::S3::Bucket
|
12
12
|
|
13
13
|
def all
|
14
|
+
if @loaded
|
15
|
+
clear
|
16
|
+
end
|
17
|
+
@loaded = true
|
14
18
|
data = connection.get_service.body
|
15
|
-
buckets = Fog::AWS::S3::Buckets.new(:connection => connection)
|
16
19
|
data['Buckets'].each do |bucket|
|
17
|
-
|
18
|
-
:collection => buckets,
|
19
|
-
:connection => connection
|
20
|
-
}.merge!(bucket))
|
20
|
+
self << new(bucket)
|
21
21
|
end
|
22
|
-
|
22
|
+
self
|
23
23
|
end
|
24
24
|
|
25
25
|
def get(name, options = {})
|
@@ -27,11 +27,7 @@ module Fog
|
|
27
27
|
:max_keys => 'max-keys',
|
28
28
|
})
|
29
29
|
data = connection.get_bucket(name, options).body
|
30
|
-
bucket =
|
31
|
-
:collection => self,
|
32
|
-
:connection => connection,
|
33
|
-
:name => data['Name']
|
34
|
-
})
|
30
|
+
bucket = new(:name => data['Name'])
|
35
31
|
options = {}
|
36
32
|
for key, value in data
|
37
33
|
if ['Delimiter', 'IsTruncated', 'Marker', 'MaxKeys', 'Prefix'].include?(key)
|
@@ -39,12 +35,9 @@ module Fog
|
|
39
35
|
end
|
40
36
|
end
|
41
37
|
bucket.objects.merge_attributes(options)
|
38
|
+
bucket.objects.instance_variable_set(:@loaded, true)
|
42
39
|
data['Contents'].each do |object|
|
43
|
-
bucket.objects <<
|
44
|
-
:bucket => bucket,
|
45
|
-
:connection => connection,
|
46
|
-
:collection => bucket.objects
|
47
|
-
}.merge!(object))
|
40
|
+
bucket.objects << bucket.objects.new(object)
|
48
41
|
end
|
49
42
|
bucket
|
50
43
|
rescue Excon::Errors::NotFound
|
@@ -13,11 +13,20 @@ module Fog
|
|
13
13
|
model Fog::AWS::S3::Object
|
14
14
|
|
15
15
|
def all(options = {})
|
16
|
+
merge_attributes(options)
|
17
|
+
if @loaded
|
18
|
+
clear
|
19
|
+
end
|
20
|
+
@loaded = true
|
16
21
|
collection = bucket.collection.get(
|
17
22
|
bucket.name,
|
18
23
|
options
|
19
24
|
)
|
20
|
-
|
25
|
+
if collection
|
26
|
+
self.replace(collection.objects)
|
27
|
+
else
|
28
|
+
nil
|
29
|
+
end
|
21
30
|
end
|
22
31
|
|
23
32
|
def bucket
|
@@ -41,12 +50,7 @@ module Fog
|
|
41
50
|
object_data[key] = value
|
42
51
|
end
|
43
52
|
end
|
44
|
-
|
45
|
-
:bucket => bucket,
|
46
|
-
:collection => self,
|
47
|
-
:connection => connection
|
48
|
-
}.merge!(object_data))
|
49
|
-
object
|
53
|
+
new(object_data)
|
50
54
|
rescue Excon::Errors::NotFound
|
51
55
|
nil
|
52
56
|
end
|
@@ -65,12 +69,7 @@ module Fog
|
|
65
69
|
object_data[key] = value
|
66
70
|
end
|
67
71
|
end
|
68
|
-
|
69
|
-
:bucket => bucket,
|
70
|
-
:collection => self,
|
71
|
-
:connection => connection
|
72
|
-
}.merge!(object_data))
|
73
|
-
object
|
72
|
+
new(object_data)
|
74
73
|
rescue Excon::Errors::NotFound
|
75
74
|
nil
|
76
75
|
end
|
data/lib/fog/collection.rb
CHANGED
@@ -1,6 +1,15 @@
|
|
1
1
|
module Fog
|
2
2
|
class Collection < Array
|
3
3
|
|
4
|
+
Array.public_instance_methods(false).each do |method|
|
5
|
+
class_eval <<-RUBY
|
6
|
+
def #{method}(*args)
|
7
|
+
lazy_load
|
8
|
+
super
|
9
|
+
end
|
10
|
+
RUBY
|
11
|
+
end
|
12
|
+
|
4
13
|
def self._load(marhsalled)
|
5
14
|
new(Marshal.load(marshalled))
|
6
15
|
end
|
@@ -56,6 +65,7 @@ module Fog
|
|
56
65
|
|
57
66
|
def initialize(attributes = {})
|
58
67
|
merge_attributes(attributes)
|
68
|
+
@loaded = false
|
59
69
|
end
|
60
70
|
|
61
71
|
def inspect
|
@@ -101,6 +111,12 @@ module Fog
|
|
101
111
|
|
102
112
|
private
|
103
113
|
|
114
|
+
def lazy_load
|
115
|
+
unless @loaded
|
116
|
+
self.all
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
104
120
|
def remap_attributes(attributes, mapping)
|
105
121
|
for key, value in mapping
|
106
122
|
if attributes.key?(key)
|
@@ -11,17 +11,15 @@ module Fog
|
|
11
11
|
model Fog::Rackspace::Servers::Flavor
|
12
12
|
|
13
13
|
def all
|
14
|
+
if @loaded
|
15
|
+
clear
|
16
|
+
end
|
17
|
+
@loaded = true
|
14
18
|
data = connection.list_flavors_detail.body
|
15
|
-
flavors = Fog::Rackspace::Servers::Flavors.new({
|
16
|
-
:connection => connection
|
17
|
-
})
|
18
19
|
for flavor in data['flavors']
|
19
|
-
|
20
|
-
:collection => flavors,
|
21
|
-
:connection => connection
|
22
|
-
}.merge!(flavor))
|
20
|
+
self << new(flavor)
|
23
21
|
end
|
24
|
-
|
22
|
+
self
|
25
23
|
end
|
26
24
|
|
27
25
|
def get(flavor_id)
|
@@ -2,12 +2,6 @@ module Fog
|
|
2
2
|
module Rackspace
|
3
3
|
class Servers
|
4
4
|
|
5
|
-
def addresses(attributes = {})
|
6
|
-
Fog::AWS::EC2::Addresses.new({
|
7
|
-
:connection => self
|
8
|
-
}.merge!(attributes))
|
9
|
-
end
|
10
|
-
|
11
5
|
def images(attributes = {})
|
12
6
|
Fog::Rackspace::Servers::Images.new({
|
13
7
|
:connection => self
|
@@ -21,20 +15,19 @@ module Fog
|
|
21
15
|
attribute :server
|
22
16
|
|
23
17
|
def all
|
18
|
+
if @loaded
|
19
|
+
clear
|
20
|
+
end
|
21
|
+
@loaded = true
|
24
22
|
data = connection.list_images_detail.body
|
25
|
-
|
26
|
-
:connection => connection
|
27
|
-
})
|
23
|
+
images = []
|
28
24
|
for image in data['images']
|
29
|
-
|
30
|
-
:collection => images,
|
31
|
-
:connection => connection
|
32
|
-
}.merge!(image))
|
25
|
+
images << new(image)
|
33
26
|
end
|
34
27
|
if server
|
35
28
|
images = images.select {|image| image.server_id == server.id}
|
36
29
|
end
|
37
|
-
images
|
30
|
+
self.replace(images)
|
38
31
|
end
|
39
32
|
|
40
33
|
def get(image_id)
|
@@ -11,17 +11,15 @@ module Fog
|
|
11
11
|
model Fog::Rackspace::Servers::Server
|
12
12
|
|
13
13
|
def all
|
14
|
+
if @loaded
|
15
|
+
clear
|
16
|
+
end
|
17
|
+
@loaded = true
|
14
18
|
data = connection.list_servers_detail.body
|
15
|
-
servers = Fog::Rackspace::Servers::Servers.new({
|
16
|
-
:connection => connection
|
17
|
-
})
|
18
19
|
for server in data['servers']
|
19
|
-
|
20
|
-
:collection => servers,
|
21
|
-
:connection => connection
|
22
|
-
}.merge!(server))
|
20
|
+
self << new(server)
|
23
21
|
end
|
24
|
-
|
22
|
+
self
|
25
23
|
end
|
26
24
|
|
27
25
|
def get(server_id)
|
@@ -11,7 +11,7 @@ describe 'Slicehost.create_slice' do
|
|
11
11
|
|
12
12
|
it "should return proper attributes" do
|
13
13
|
# flavor_id 1: 256 ram, image_id 3: Gentoo 2008.0
|
14
|
-
actual = slicehost.create_slice(1, 3, '
|
14
|
+
actual = slicehost.create_slice(1, 3, 'fog_create_slice').body
|
15
15
|
actual['addresses'].should be_a(Array)
|
16
16
|
# actual['backup-id'].should be_an(Integer)
|
17
17
|
actual['bw-in'].should be_an(Float)
|
@@ -5,7 +5,7 @@ describe 'Slicehost.delete_slice' do
|
|
5
5
|
|
6
6
|
before(:each) do
|
7
7
|
# flavor_id 1: 256 ram, image_id 3: Gentoo 2008.0
|
8
|
-
@slice_id = slicehost.create_slice(1, 3, '
|
8
|
+
@slice_id = slicehost.create_slice(1, 3, 'fog_delete_slice').body['id']
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should return proper attributes" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.39
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- geemus (Wesley Beary)
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-04 00:00:00 -08:00
|
13
13
|
default_executable: fog
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.
|
23
|
+
version: 0.0.14
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: mime-types
|
@@ -237,7 +237,6 @@ files:
|
|
237
237
|
- spec/aws/models/s3/buckets_spec.rb
|
238
238
|
- spec/aws/models/s3/object_spec.rb
|
239
239
|
- spec/aws/models/s3/objects_spec.rb
|
240
|
-
- spec/aws/models/s3/owner_spec.rb
|
241
240
|
- spec/aws/requests/ec2/allocate_address_spec.rb
|
242
241
|
- spec/aws/requests/ec2/associate_address_spec.rb
|
243
242
|
- spec/aws/requests/ec2/attach_volume_spec.rb
|
@@ -367,7 +366,6 @@ test_files:
|
|
367
366
|
- spec/aws/models/s3/buckets_spec.rb
|
368
367
|
- spec/aws/models/s3/object_spec.rb
|
369
368
|
- spec/aws/models/s3/objects_spec.rb
|
370
|
-
- spec/aws/models/s3/owner_spec.rb
|
371
369
|
- spec/aws/requests/ec2/allocate_address_spec.rb
|
372
370
|
- spec/aws/requests/ec2/associate_address_spec.rb
|
373
371
|
- spec/aws/requests/ec2/attach_volume_spec.rb
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
|
-
|
3
|
-
describe 'Fog::AWS::S3::Owner' do
|
4
|
-
|
5
|
-
describe "#initialize" do
|
6
|
-
|
7
|
-
it "should remap attributes from parser" do
|
8
|
-
owner = Fog::AWS::S3::Owner.new(
|
9
|
-
'DisplayName' => 'name',
|
10
|
-
'ID' => 'id'
|
11
|
-
)
|
12
|
-
owner.display_name.should == 'name'
|
13
|
-
owner.id.should == 'id'
|
14
|
-
end
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|