chef-server-slice 0.7.10 → 0.7.12
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.
- data/app/controllers/application.rb +5 -1
- data/app/controllers/{cookbook_recipes.rb → cookbook_segment.rb} +8 -11
- data/app/controllers/cookbooks.rb +4 -23
- data/app/views/cookbooks/show.html.haml +16 -1
- data/lib/chef-server-slice.rb +12 -8
- data/public/facebox/closelabel.gif +0 -0
- data/public/facebox/loading.gif +0 -0
- data/public/images/treeBuilderImages/Thumbs.db +0 -0
- data/public/images/treeBuilderImages/doc.gif +0 -0
- data/public/images/treeBuilderImages/docNode.gif +0 -0
- data/public/images/treeBuilderImages/docNodeLast.gif +0 -0
- data/public/images/treeBuilderImages/docNodeLastFirst.gif +0 -0
- data/public/images/treeBuilderImages/folder.gif +0 -0
- data/public/images/treeBuilderImages/folderNode.gif +0 -0
- data/public/images/treeBuilderImages/folderNodeFirst.gif +0 -0
- data/public/images/treeBuilderImages/folderNodeLast.gif +0 -0
- data/public/images/treeBuilderImages/folderNodeLastFirst.gif +0 -0
- data/public/images/treeBuilderImages/folderNodeOpen.gif +0 -0
- data/public/images/treeBuilderImages/folderNodeOpenFirst.gif +0 -0
- data/public/images/treeBuilderImages/folderNodeOpenLast.gif +0 -0
- data/public/images/treeBuilderImages/folderNodeOpenLastFirst.gif +0 -0
- data/public/images/treeBuilderImages/folderOpen.gif +0 -0
- data/public/images/treeBuilderImages/vertLine.gif +0 -0
- data/public/javascripts/JSONeditor.js +0 -0
- data/public/javascripts/jquery-1.3.2.min.js +0 -0
- data/public/javascripts/jquery-ui-1.7.1.custom.min.js +0 -0
- data/public/stylesheets/images/ui-bg_diagonals-small_0_aaaaaa_40x40.png +0 -0
- data/public/stylesheets/images/ui-bg_diagonals-thick_15_444444_40x40.png +0 -0
- data/public/stylesheets/images/ui-bg_glass_100_f0f0f0_1x400.png +0 -0
- data/public/stylesheets/images/ui-bg_glass_50_99c2ff_1x400.png +0 -0
- data/public/stylesheets/images/ui-bg_glass_55_fbf5d0_1x400.png +0 -0
- data/public/stylesheets/images/ui-bg_glass_80_e6e6e6_1x400.png +0 -0
- data/public/stylesheets/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/public/stylesheets/images/ui-bg_highlight-hard_100_f9f9f9_1x100.png +0 -0
- data/public/stylesheets/images/ui-bg_highlight-soft_100_e7eef3_1x100.png +0 -0
- data/public/stylesheets/images/ui-icons_222222_256x240.png +0 -0
- data/public/stylesheets/images/ui-icons_2694e8_256x240.png +0 -0
- data/public/stylesheets/images/ui-icons_2e83ff_256x240.png +0 -0
- data/public/stylesheets/images/ui-icons_72a7cf_256x240.png +0 -0
- data/public/stylesheets/images/ui-icons_888888_256x240.png +0 -0
- data/public/stylesheets/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/public/stylesheets/images/ui-icons_ffffff_256x240.png +0 -0
- data/public/stylesheets/jquery-ui-1.7.1.custom.css +0 -0
- metadata +3 -6
- data/app/controllers/cookbook_attributes.rb +0 -59
- data/app/controllers/cookbook_definitions.rb +0 -60
- data/app/controllers/cookbook_libraries.rb +0 -60
@@ -156,8 +156,12 @@ class ChefServerSlice::Application < Merb::Controller
|
|
156
156
|
files_list = cookbook.definition_files
|
157
157
|
when :libraries
|
158
158
|
files_list = cookbook.lib_files
|
159
|
+
when :providers
|
160
|
+
files_list = cookbook.provider_files
|
161
|
+
when :resources
|
162
|
+
files_list = cookbook.resource_files
|
159
163
|
else
|
160
|
-
raise ArgumentError, "segment must be one of :attributes, :recipes, :definitions or :
|
164
|
+
raise ArgumentError, "segment must be one of :attributes, :recipes, :definitions, :libraries, :providers, or :resources"
|
161
165
|
end
|
162
166
|
files_list
|
163
167
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
3
|
# Author:: Christopher Brown (<cb@opscode.com>)
|
4
|
-
#
|
4
|
+
# Author:: Christopher Walters (<cw@opscode.com>)
|
5
|
+
# Copyright:: Copyright (c) 2009 Opscode, Inc.
|
5
6
|
# License:: Apache License, Version 2.0
|
6
7
|
#
|
7
8
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -19,32 +20,28 @@
|
|
19
20
|
|
20
21
|
require 'chef' / 'mixin' / 'checksum'
|
21
22
|
|
22
|
-
class ChefServerSlice::
|
23
|
+
class ChefServerSlice::CookbookSegment < ChefServerSlice::Application
|
23
24
|
|
24
25
|
provides :html, :json
|
26
|
+
|
25
27
|
before :login_required
|
26
28
|
|
27
29
|
include Chef::Mixin::Checksum
|
28
30
|
|
29
|
-
def load_cookbook_recipes()
|
30
|
-
@recipe_files = load_cookbook_segment(params[:cookbook_id], :recipes)
|
31
|
-
end
|
32
|
-
|
33
31
|
def index
|
34
32
|
if params[:id]
|
35
33
|
show
|
36
34
|
else
|
37
|
-
|
38
|
-
display @recipe_files
|
35
|
+
display load_cookbook_segment(params[:cookbook_id], params[:type])
|
39
36
|
end
|
40
37
|
end
|
41
38
|
|
42
39
|
def show
|
43
40
|
only_provides :json
|
44
|
-
|
45
|
-
raise NotFound, "Cannot find a suitable recipe file!" unless @recipe_files.has_key?(params[:id])
|
41
|
+
files = load_cookbook_segment(params[:cookbook_id], params[:type])
|
46
42
|
|
47
|
-
|
43
|
+
raise NotFound, "Cannot find a suitable #{params[:type].to_s.singularize} file!" unless files.has_key?(params[:id])
|
44
|
+
to_send = files[params[:id]][:file]
|
48
45
|
current_checksum = checksum(to_send)
|
49
46
|
Chef::Log.debug("old sum: #{params[:checksum]}, new sum: #{current_checksum}")
|
50
47
|
if current_checksum == params[:checksum]
|
@@ -1,6 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
3
|
# Author:: Christopher Brown (<cb@opscode.com>)
|
4
|
+
# Author:: Christopher Walters (<cw@opscode.com>)
|
4
5
|
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
5
6
|
# License:: Apache License, Version 2.0
|
6
7
|
#
|
@@ -22,7 +23,7 @@ require 'chef' / 'cookbook_loader'
|
|
22
23
|
class ChefServerSlice::Cookbooks < ChefServerSlice::Application
|
23
24
|
|
24
25
|
provides :html, :json
|
25
|
-
before :login_required
|
26
|
+
before :login_required
|
26
27
|
|
27
28
|
def index
|
28
29
|
@cl = Chef::CookbookLoader.new
|
@@ -36,28 +37,8 @@ class ChefServerSlice::Cookbooks < ChefServerSlice::Application
|
|
36
37
|
display @cookbook
|
37
38
|
end
|
38
39
|
|
39
|
-
def
|
40
|
-
|
41
|
-
@recipe_files = load_all_files(:recipes, node)
|
42
|
-
display @recipe_files
|
43
|
-
end
|
44
|
-
|
45
|
-
def attribute_files
|
46
|
-
node = params.has_key?('node') ? params[:node] : nil
|
47
|
-
@attribute_files = load_all_files(:attributes, node)
|
48
|
-
display @attribute_files
|
49
|
-
end
|
50
|
-
|
51
|
-
def definition_files
|
52
|
-
node = params.has_key?('node') ? params[:node] : nil
|
53
|
-
@definition_files = load_all_files(:definitions, node)
|
54
|
-
display @definition_files
|
55
|
-
end
|
56
|
-
|
57
|
-
def library_files
|
58
|
-
node = params.has_key?('node') ? params[:node] : nil
|
59
|
-
@lib_files = load_all_files(:libraries, node)
|
60
|
-
display @lib_files
|
40
|
+
def files
|
41
|
+
display load_all_files(params[:type], params[:node])
|
61
42
|
end
|
62
43
|
|
63
44
|
end
|
@@ -31,10 +31,25 @@
|
|
31
31
|
.code
|
32
32
|
%h4.head= link_to File.basename(f), "#"
|
33
33
|
%pre.ruby= syntax_highlight(f)
|
34
|
+
- unless @cookbook.resource_files.empty?
|
35
|
+
%h2.head= link_to "Resource Files", "#"
|
36
|
+
.files
|
37
|
+
- @cookbook.resource_files.each do |f|
|
38
|
+
.code
|
39
|
+
%h4.head= link_to File.basename(f), "#"
|
40
|
+
%pre.ruby= syntax_highlight(f)
|
41
|
+
- unless @cookbook.provider_files.empty?
|
42
|
+
%h2.head= link_to "Provider Files", "#"
|
43
|
+
.files
|
44
|
+
- @cookbook.provider_files.each do |f|
|
45
|
+
.code
|
46
|
+
%h4.head= link_to File.basename(f), "#"
|
47
|
+
%pre.ruby= syntax_highlight(f)
|
34
48
|
- unless @cookbook.template_files.empty?
|
35
49
|
%h2.head= link_to "Template Files", "#"
|
36
50
|
.files
|
37
51
|
- @cookbook.template_files.each do |f|
|
52
|
+
- rel = f.split('templates/',2)[1]
|
38
53
|
.code
|
39
|
-
%h4.head= link_to
|
54
|
+
%h4.head= link_to rel, "#"
|
40
55
|
%pre.ruby= syntax_highlight(f)
|
data/lib/chef-server-slice.rb
CHANGED
@@ -94,16 +94,20 @@ if defined?(Merb::Plugins)
|
|
94
94
|
scope.match("/search/:search_id/entries/:id", :method => 'post').to(:controller => "search_entries", :action => "update")
|
95
95
|
scope.match("/search/:search_id/entries/:id", :method => 'delete').to(:controller => "search_entries", :action => "destroy")
|
96
96
|
|
97
|
-
scope.match("/cookbooks/_attribute_files").to(:controller => "cookbooks", :action => "
|
98
|
-
scope.match("/cookbooks/_recipe_files").to(:controller => "cookbooks", :action => "
|
99
|
-
scope.match("/cookbooks/_definition_files").to(:controller => "cookbooks", :action => "
|
100
|
-
scope.match("/cookbooks/_library_files").to(:controller => "cookbooks", :action => "
|
97
|
+
scope.match("/cookbooks/_attribute_files").to(:controller => "cookbooks", :action => "files", :type => :attributes)
|
98
|
+
scope.match("/cookbooks/_recipe_files").to(:controller => "cookbooks", :action => "files", :type => :recipes)
|
99
|
+
scope.match("/cookbooks/_definition_files").to(:controller => "cookbooks", :action => "files", :type => :definitions)
|
100
|
+
scope.match("/cookbooks/_library_files").to(:controller => "cookbooks", :action => "files", :type => :libraries)
|
101
|
+
scope.match("/cookbooks/_provider_files").to(:controller => "cookbooks", :action => "files", :type => :providers)
|
102
|
+
scope.match("/cookbooks/_resource_files").to(:controller => "cookbooks", :action => "files", :type => :resources)
|
101
103
|
|
102
104
|
scope.match("/cookbooks/:cookbook_id/templates", :cookbook_id => /[\w\.]+/).to(:controller => "cookbook_templates", :action => "index")
|
103
|
-
scope.match("/cookbooks/:cookbook_id/libraries", :cookbook_id => /[\w\.]+/).to(:controller => "
|
104
|
-
scope.match("/cookbooks/:cookbook_id/definitions", :cookbook_id => /[\w\.]+/).to(:controller => "
|
105
|
-
scope.match("/cookbooks/:cookbook_id/
|
106
|
-
scope.match("/cookbooks/:cookbook_id/
|
105
|
+
scope.match("/cookbooks/:cookbook_id/libraries", :cookbook_id => /[\w\.]+/).to(:controller => "cookbook_segment", :action => "index", :type => :libraries)
|
106
|
+
scope.match("/cookbooks/:cookbook_id/definitions", :cookbook_id => /[\w\.]+/).to(:controller => "cookbook_segment", :action => "index", :type => :definitions)
|
107
|
+
scope.match("/cookbooks/:cookbook_id/providers", :cookbook_id => /[\w\.]+/).to(:controller => "cookbook_segment", :action => "index", :type => :providers)
|
108
|
+
scope.match("/cookbooks/:cookbook_id/resources", :cookbook_id => /[\w\.]+/).to(:controller => "cookbook_segment", :action => "index", :type => :resources)
|
109
|
+
scope.match("/cookbooks/:cookbook_id/recipes", :cookbook_id => /[\w\.]+/).to(:controller => "cookbook_segment", :action => "index", :type => :recipes)
|
110
|
+
scope.match("/cookbooks/:cookbook_id/attributes", :cookbook_id => /[\w\.]+/).to(:controller => "cookbook_segment", :action => "index", :type => :attributes)
|
107
111
|
scope.match("/cookbooks/:cookbook_id/files", :cookbook_id => /[\w\.]+/).to(:controller => "cookbook_files", :action => "index")
|
108
112
|
|
109
113
|
scope.resources :cookbooks
|
File without changes
|
data/public/facebox/loading.gif
CHANGED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-server-slice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Opscode
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-10-21 00:00:00 +13:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -155,11 +155,8 @@ files:
|
|
155
155
|
- LICENSE
|
156
156
|
- README.rdoc
|
157
157
|
- app/controllers/application.rb
|
158
|
-
- app/controllers/cookbook_attributes.rb
|
159
|
-
- app/controllers/cookbook_definitions.rb
|
160
158
|
- app/controllers/cookbook_files.rb
|
161
|
-
- app/controllers/
|
162
|
-
- app/controllers/cookbook_recipes.rb
|
159
|
+
- app/controllers/cookbook_segment.rb
|
163
160
|
- app/controllers/cookbook_templates.rb
|
164
161
|
- app/controllers/cookbooks.rb
|
165
162
|
- app/controllers/exceptions.rb
|
@@ -1,59 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
-
# Author:: Christopher Brown (<cb@opscode.com>)
|
4
|
-
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
5
|
-
# License:: Apache License, Version 2.0
|
6
|
-
#
|
7
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
-
# you may not use this file except in compliance with the License.
|
9
|
-
# 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, software
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
-
# See the License for the specific language governing permissions and
|
17
|
-
# limitations under the License.
|
18
|
-
#
|
19
|
-
|
20
|
-
require 'chef' / 'mixin' / 'checksum'
|
21
|
-
|
22
|
-
class ChefServerSlice::CookbookAttributes < ChefServerSlice::Application
|
23
|
-
|
24
|
-
provides :html, :json
|
25
|
-
|
26
|
-
before :login_required
|
27
|
-
|
28
|
-
include Chef::Mixin::Checksum
|
29
|
-
|
30
|
-
def load_cookbook_attributes()
|
31
|
-
@attribute_files = load_cookbook_segment(params[:cookbook_id], :attributes)
|
32
|
-
end
|
33
|
-
|
34
|
-
def index
|
35
|
-
if params[:id]
|
36
|
-
show
|
37
|
-
else
|
38
|
-
load_cookbook_attributes()
|
39
|
-
display @attribute_files
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def show
|
44
|
-
only_provides :json
|
45
|
-
load_cookbook_attributes
|
46
|
-
raise NotFound, "Cannot find a suitable attribute file!" unless @attribute_files.has_key?(params[:id])
|
47
|
-
to_send = @attribute_files[params[:id]][:file]
|
48
|
-
current_checksum = checksum(to_send)
|
49
|
-
Chef::Log.debug("old sum: #{params[:checksum]}, new sum: #{current_checksum}")
|
50
|
-
if current_checksum == params[:checksum]
|
51
|
-
display "File #{to_send} has not changed", :status => 304
|
52
|
-
else
|
53
|
-
send_file(to_send)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
|
@@ -1,60 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
-
# Author:: Christopher Brown (<cb@opscode.com>)
|
4
|
-
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
5
|
-
# License:: Apache License, Version 2.0
|
6
|
-
#
|
7
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
-
# you may not use this file except in compliance with the License.
|
9
|
-
# 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, software
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
-
# See the License for the specific language governing permissions and
|
17
|
-
# limitations under the License.
|
18
|
-
#
|
19
|
-
|
20
|
-
require 'chef' / 'mixin' / 'checksum'
|
21
|
-
|
22
|
-
class ChefServerSlice::CookbookDefinitions < ChefServerSlice::Application
|
23
|
-
|
24
|
-
provides :html, :json
|
25
|
-
|
26
|
-
before :login_required
|
27
|
-
|
28
|
-
include Chef::Mixin::Checksum
|
29
|
-
|
30
|
-
def load_cookbook_definitions()
|
31
|
-
@definition_files = load_cookbook_segment(params[:cookbook_id], :definitions)
|
32
|
-
end
|
33
|
-
|
34
|
-
def index
|
35
|
-
if params[:id]
|
36
|
-
show
|
37
|
-
else
|
38
|
-
load_cookbook_definitions()
|
39
|
-
display @definition_files
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def show
|
44
|
-
only_provides :json
|
45
|
-
load_cookbook_definitions
|
46
|
-
raise NotFound, "Cannot find a suitable definition file!" unless @definition_files.has_key?(params[:id])
|
47
|
-
|
48
|
-
to_send = @definition_files[params[:id]][:file]
|
49
|
-
current_checksum = checksum(to_send)
|
50
|
-
Chef::Log.debug("Old sum: #{params[:checksum]}, New sum: #{current_checksum}")
|
51
|
-
if current_checksum == params[:checksum]
|
52
|
-
display "File #{to_send} has not changed", :status => 304
|
53
|
-
else
|
54
|
-
send_file(to_send)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
|
@@ -1,60 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: Adam Jacob (<adam@opscode.com>)
|
3
|
-
# Author:: Christopher Brown (<cb@opscode.com>)
|
4
|
-
# Copyright:: Copyright (c) 2008 Opscode, Inc.
|
5
|
-
# License:: Apache License, Version 2.0
|
6
|
-
#
|
7
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
-
# you may not use this file except in compliance with the License.
|
9
|
-
# 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, software
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
-
# See the License for the specific language governing permissions and
|
17
|
-
# limitations under the License.
|
18
|
-
#
|
19
|
-
|
20
|
-
require 'chef' / 'mixin' / 'checksum'
|
21
|
-
require 'chef' / 'cookbook_loader'
|
22
|
-
|
23
|
-
class ChefServerSlice::CookbookLibraries < ChefServerSlice::Application
|
24
|
-
|
25
|
-
provides :html, :json
|
26
|
-
before :login_required
|
27
|
-
|
28
|
-
include Chef::Mixin::Checksum
|
29
|
-
|
30
|
-
def load_cookbook_libs()
|
31
|
-
@lib_files = load_cookbook_segment(params[:cookbook_id], :libraries)
|
32
|
-
end
|
33
|
-
|
34
|
-
def index
|
35
|
-
if params[:id]
|
36
|
-
show
|
37
|
-
else
|
38
|
-
load_cookbook_libs()
|
39
|
-
display @lib_files
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def show
|
44
|
-
only_provides :json
|
45
|
-
load_cookbook_libs
|
46
|
-
raise NotFound, "Cannot find a suitable library file!" unless @lib_files.has_key?(params[:id])
|
47
|
-
|
48
|
-
to_send = @lib_files[params[:id]][:file]
|
49
|
-
current_checksum = checksum(to_send)
|
50
|
-
Chef::Log.debug("Old sum: #{params[:checksum]}, New sum: #{current_checksum}")
|
51
|
-
if current_checksum == params[:checksum]
|
52
|
-
display "File #{to_send} has not changed", :status => 304
|
53
|
-
else
|
54
|
-
send_file(to_send)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
|