cocoapods 0.39.0.beta.2 → 0.39.0.beta.3

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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/lib/cocoapods/command/cache/clean.rb +90 -0
  4. data/lib/cocoapods/command/cache/list.rb +69 -0
  5. data/lib/cocoapods/command/repo/add.rb +53 -0
  6. data/lib/cocoapods/command/repo/lint.rb +77 -0
  7. data/lib/cocoapods/command/repo/list.rb +93 -0
  8. data/lib/cocoapods/command/repo/push.rb +223 -0
  9. data/lib/cocoapods/command/repo/remove.rb +36 -0
  10. data/lib/cocoapods/command/repo/update.rb +27 -0
  11. data/lib/cocoapods/command/spec/cat.rb +51 -0
  12. data/lib/cocoapods/command/spec/create.rb +279 -0
  13. data/lib/cocoapods/command/spec/edit.rb +94 -0
  14. data/lib/cocoapods/command/spec/lint.rb +119 -0
  15. data/lib/cocoapods/command/spec/which.rb +43 -0
  16. data/lib/cocoapods/gem_version.rb +1 -1
  17. data/lib/cocoapods/generator/acknowledgements/markdown.rb +38 -0
  18. data/lib/cocoapods/generator/acknowledgements/plist.rb +80 -0
  19. data/lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb +260 -0
  20. data/lib/cocoapods/generator/xcconfig/pod_xcconfig.rb +83 -0
  21. data/lib/cocoapods/generator/xcconfig/xcconfig_helper.rb +213 -0
  22. data/lib/cocoapods/installer/analyzer/analysis_result.rb +46 -0
  23. data/lib/cocoapods/installer/analyzer/locking_dependency_analyzer.rb +79 -0
  24. data/lib/cocoapods/installer/analyzer/sandbox_analyzer.rb +262 -0
  25. data/lib/cocoapods/installer/analyzer/specs_state.rb +76 -0
  26. data/lib/cocoapods/installer/analyzer/target_inspection_result.rb +41 -0
  27. data/lib/cocoapods/installer/analyzer/target_inspector.rb +203 -0
  28. data/lib/cocoapods/installer/target_installer/aggregate_target_installer.rb +186 -0
  29. data/lib/cocoapods/installer/target_installer/pod_target_installer.rb +297 -0
  30. data/lib/cocoapods/installer/user_project_integrator/target_integrator.rb +318 -0
  31. data/lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb +173 -0
  32. metadata +78 -50
@@ -0,0 +1,173 @@
1
+ module Pod
2
+ class Installer
3
+ class UserProjectIntegrator
4
+ class TargetIntegrator
5
+ # Configures an user target to use the CocoaPods xcconfigs which allow
6
+ # lo link against the Pods.
7
+ #
8
+ class XCConfigIntegrator
9
+ # Integrates the user target.
10
+ #
11
+ # @param [Target::AggregateTarget] pod_bundle
12
+ # The Pods bundle.
13
+ #
14
+ # @param [Array<PBXNativeTarget>] targets
15
+ # The native targets associated which should be integrated
16
+ # with the Pod bundle.
17
+ #
18
+ # @return [Bool] whether any changes to the project were made.
19
+ #
20
+ def self.integrate(pod_bundle, targets)
21
+ changes = false
22
+ targets.each do |target|
23
+ target.build_configurations.each do |config|
24
+ changes = true if update_to_cocoapods_0_34(pod_bundle, targets)
25
+ changes = true if set_target_xcconfig(pod_bundle, target, config)
26
+ end
27
+ end
28
+ changes
29
+ end
30
+
31
+ private
32
+
33
+ # @!group Integration steps
34
+ #-------------------------------------------------------------------#
35
+
36
+ # Removes the xcconfig used up to CocoaPods 0.33 from the project and
37
+ # deletes the file if it exists.
38
+ #
39
+ # @param [Target::AggregateTarget] pod_bundle
40
+ # The Pods bundle.
41
+ #
42
+ # @param [Array<XcodeProj::PBXNativeTarget>] targets
43
+ # The native targets.
44
+ #
45
+ # @return [Bool] whether any changes to the project were made.
46
+ #
47
+ # @todo This can be removed for CocoaPods 1.0
48
+ #
49
+ def self.update_to_cocoapods_0_34(pod_bundle, targets)
50
+ sandbox = pod_bundle.sandbox
51
+ changes = false
52
+ targets.map(&:project).uniq.each do |project|
53
+ file_refs = project.files.select do |file_ref|
54
+ path = file_ref.path.to_s
55
+ if File.extname(path) == '.xcconfig'
56
+ absolute_path = file_ref.real_path.to_s
57
+ absolute_path.start_with?(sandbox.root.to_s) &&
58
+ !absolute_path.start_with?(sandbox.target_support_files_root.to_s)
59
+ end
60
+ end
61
+
62
+ file_refs.uniq.each do |file_ref|
63
+ UI.message "- Removing (#{file_ref.path})" do
64
+ file_ref.remove_from_project
65
+ end
66
+ end
67
+
68
+ changes = true unless file_refs.empty?
69
+ end
70
+ changes
71
+ end
72
+
73
+ # Creates a file reference to the xcconfig generated by
74
+ # CocoaPods (if needed) and sets it as the base configuration of
75
+ # build configuration of the user target.
76
+ #
77
+ # @param [Target::AggregateTarget] pod_bundle
78
+ # The Pods bundle.
79
+ #
80
+ # @param [PBXNativeTarget] target
81
+ # The native target.
82
+ #
83
+ # @param [Xcodeproj::XCBuildConfiguration] config
84
+ # The build configuration.
85
+ #
86
+ # @return [Boolean] Indicates whether or not any changes were made.
87
+ #
88
+ def self.set_target_xcconfig(pod_bundle, target, config)
89
+ path = pod_bundle.xcconfig_relative_path(config.name)
90
+ group = config.project['Pods'] || config.project.new_group('Pods')
91
+ file_ref = group.files.find { |f| f.path == path }
92
+ if config.base_configuration_reference &&
93
+ config.base_configuration_reference != file_ref
94
+ unless xcconfig_includes_target_xcconfig?(config.base_configuration_reference, path)
95
+ UI.warn 'CocoaPods did not set the base configuration of your ' \
96
+ 'project because your project already has a custom ' \
97
+ 'config set. In order for CocoaPods integration to work at ' \
98
+ 'all, please either set the base configurations of the target ' \
99
+ "`#{target.name}` to `#{path}` or include the `#{path}` in your " \
100
+ 'build configuration.'
101
+ end
102
+ elsif config.base_configuration_reference.nil? || file_ref.nil?
103
+ file_ref ||= group.new_file(path)
104
+ config.base_configuration_reference = file_ref
105
+ return true
106
+ end
107
+ false
108
+ end
109
+
110
+ private
111
+
112
+ # @!group Private helpers
113
+ #-------------------------------------------------------------------#
114
+
115
+ # Prints a warning informing the user that a build configuration of
116
+ # the integrated target is overriding the CocoaPods build settings.
117
+ #
118
+ # @param [Target::AggregateTarget] pod_bundle
119
+ # The Pods bundle.
120
+ #
121
+ # @param [XcodeProj::PBXNativeTarget] target
122
+ # The native target.
123
+ #
124
+ # @param [Xcodeproj::XCBuildConfiguration] config
125
+ # The build configuration.
126
+ #
127
+ # @param [String] key
128
+ # The key of the overridden build setting.
129
+ #
130
+ def self.print_override_warning(pod_bundle, target, config, key)
131
+ actions = [
132
+ 'Use the `$(inherited)` flag, or',
133
+ 'Remove the build settings from the target.',
134
+ ]
135
+ message = "The `#{target.name} [#{config.name}]` " \
136
+ "target overrides the `#{key}` build setting defined in " \
137
+ "`#{pod_bundle.xcconfig_relative_path(config.name)}'. " \
138
+ 'This can lead to problems with the CocoaPods installation'
139
+ UI.warn(message, actions)
140
+ end
141
+
142
+ # Naively checks to see if a given PBXFileReference imports a given
143
+ # path.
144
+ #
145
+ # @param [PBXFileReference] base_config_ref
146
+ # A file reference to an `.xcconfig` file.
147
+ #
148
+ # @param [String] target_config_path
149
+ # The path to check for.
150
+ #
151
+ SILENCE_WARNINGS_STRING = '// @COCOAPODS_SILENCE_WARNINGS@ //'
152
+ def self.xcconfig_includes_target_xcconfig?(base_config_ref, target_config_path)
153
+ return unless base_config_ref && base_config_ref.real_path.file?
154
+ regex = /
155
+ ^(
156
+ (\s* # Possible, but unlikely, space before include statement
157
+ \#include\s+ # Include statement
158
+ ['"] # Open quote
159
+ (.*\/)? # Possible prefix to path
160
+ #{Regexp.quote(target_config_path)} # The path should end in the target_config_path
161
+ ['"] # Close quote
162
+ )
163
+ |
164
+ (#{Regexp.quote(SILENCE_WARNINGS_STRING)}) # Token to treat xcconfig as good and silence pod install warnings
165
+ )
166
+ /x
167
+ base_config_ref.real_path.readlines.find { |line| line =~ regex }
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
173
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.39.0.beta.2
4
+ version: 0.39.0.beta.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eloy Duran
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-08-26 00:00:00.000000000 Z
14
+ date: 2015-08-27 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: cocoapods-core
@@ -19,222 +19,222 @@ dependencies:
19
19
  requirements:
20
20
  - - '='
21
21
  - !ruby/object:Gem::Version
22
- version: 0.39.0.beta.2
22
+ version: 0.39.0.beta.3
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - '='
28
28
  - !ruby/object:Gem::Version
29
- version: 0.39.0.beta.2
29
+ version: 0.39.0.beta.3
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: claide
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
- - - "~>"
34
+ - - ~>
35
35
  - !ruby/object:Gem::Version
36
36
  version: 0.9.1
37
37
  type: :runtime
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - "~>"
41
+ - - ~>
42
42
  - !ruby/object:Gem::Version
43
43
  version: 0.9.1
44
44
  - !ruby/object:Gem::Dependency
45
45
  name: xcodeproj
46
46
  requirement: !ruby/object:Gem::Requirement
47
47
  requirements:
48
- - - "~>"
48
+ - - ~>
49
49
  - !ruby/object:Gem::Version
50
- version: 0.27.0
50
+ version: 0.27.1
51
51
  type: :runtime
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
54
54
  requirements:
55
- - - "~>"
55
+ - - ~>
56
56
  - !ruby/object:Gem::Version
57
- version: 0.27.0
57
+ version: 0.27.1
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: cocoapods-downloader
60
60
  requirement: !ruby/object:Gem::Requirement
61
61
  requirements:
62
- - - "~>"
62
+ - - ~>
63
63
  - !ruby/object:Gem::Version
64
- version: 0.9.2
64
+ version: 0.9.3
65
65
  type: :runtime
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
68
68
  requirements:
69
- - - "~>"
69
+ - - ~>
70
70
  - !ruby/object:Gem::Version
71
- version: 0.9.2
71
+ version: 0.9.3
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: cocoapods-plugins
74
74
  requirement: !ruby/object:Gem::Requirement
75
75
  requirements:
76
- - - "~>"
76
+ - - ~>
77
77
  - !ruby/object:Gem::Version
78
78
  version: 0.4.2
79
79
  type: :runtime
80
80
  prerelease: false
81
81
  version_requirements: !ruby/object:Gem::Requirement
82
82
  requirements:
83
- - - "~>"
83
+ - - ~>
84
84
  - !ruby/object:Gem::Version
85
85
  version: 0.4.2
86
86
  - !ruby/object:Gem::Dependency
87
87
  name: cocoapods-stats
88
88
  requirement: !ruby/object:Gem::Requirement
89
89
  requirements:
90
- - - "~>"
90
+ - - ~>
91
91
  - !ruby/object:Gem::Version
92
- version: 0.6.0
92
+ version: 0.6.1
93
93
  type: :runtime
94
94
  prerelease: false
95
95
  version_requirements: !ruby/object:Gem::Requirement
96
96
  requirements:
97
- - - "~>"
97
+ - - ~>
98
98
  - !ruby/object:Gem::Version
99
- version: 0.6.0
99
+ version: 0.6.1
100
100
  - !ruby/object:Gem::Dependency
101
101
  name: cocoapods-try
102
102
  requirement: !ruby/object:Gem::Requirement
103
103
  requirements:
104
- - - "~>"
104
+ - - ~>
105
105
  - !ruby/object:Gem::Version
106
- version: 0.5.0
106
+ version: 0.5.1
107
107
  type: :runtime
108
108
  prerelease: false
109
109
  version_requirements: !ruby/object:Gem::Requirement
110
110
  requirements:
111
- - - "~>"
111
+ - - ~>
112
112
  - !ruby/object:Gem::Version
113
- version: 0.5.0
113
+ version: 0.5.1
114
114
  - !ruby/object:Gem::Dependency
115
115
  name: cocoapods-trunk
116
116
  requirement: !ruby/object:Gem::Requirement
117
117
  requirements:
118
- - - "~>"
118
+ - - ~>
119
119
  - !ruby/object:Gem::Version
120
- version: 0.6.2
120
+ version: 0.6.3
121
121
  type: :runtime
122
122
  prerelease: false
123
123
  version_requirements: !ruby/object:Gem::Requirement
124
124
  requirements:
125
- - - "~>"
125
+ - - ~>
126
126
  - !ruby/object:Gem::Version
127
- version: 0.6.2
127
+ version: 0.6.3
128
128
  - !ruby/object:Gem::Dependency
129
129
  name: molinillo
130
130
  requirement: !ruby/object:Gem::Requirement
131
131
  requirements:
132
- - - "~>"
132
+ - - ~>
133
133
  - !ruby/object:Gem::Version
134
134
  version: 0.3.1
135
135
  type: :runtime
136
136
  prerelease: false
137
137
  version_requirements: !ruby/object:Gem::Requirement
138
138
  requirements:
139
- - - "~>"
139
+ - - ~>
140
140
  - !ruby/object:Gem::Version
141
141
  version: 0.3.1
142
142
  - !ruby/object:Gem::Dependency
143
143
  name: colored
144
144
  requirement: !ruby/object:Gem::Requirement
145
145
  requirements:
146
- - - "~>"
146
+ - - ~>
147
147
  - !ruby/object:Gem::Version
148
148
  version: '1.2'
149
149
  type: :runtime
150
150
  prerelease: false
151
151
  version_requirements: !ruby/object:Gem::Requirement
152
152
  requirements:
153
- - - "~>"
153
+ - - ~>
154
154
  - !ruby/object:Gem::Version
155
155
  version: '1.2'
156
156
  - !ruby/object:Gem::Dependency
157
157
  name: escape
158
158
  requirement: !ruby/object:Gem::Requirement
159
159
  requirements:
160
- - - "~>"
160
+ - - ~>
161
161
  - !ruby/object:Gem::Version
162
162
  version: 0.0.4
163
163
  type: :runtime
164
164
  prerelease: false
165
165
  version_requirements: !ruby/object:Gem::Requirement
166
166
  requirements:
167
- - - "~>"
167
+ - - ~>
168
168
  - !ruby/object:Gem::Version
169
169
  version: 0.0.4
170
170
  - !ruby/object:Gem::Dependency
171
171
  name: activesupport
172
172
  requirement: !ruby/object:Gem::Requirement
173
173
  requirements:
174
- - - ">="
174
+ - - '>='
175
175
  - !ruby/object:Gem::Version
176
176
  version: 3.2.15
177
177
  type: :runtime
178
178
  prerelease: false
179
179
  version_requirements: !ruby/object:Gem::Requirement
180
180
  requirements:
181
- - - ">="
181
+ - - '>='
182
182
  - !ruby/object:Gem::Version
183
183
  version: 3.2.15
184
184
  - !ruby/object:Gem::Dependency
185
185
  name: nap
186
186
  requirement: !ruby/object:Gem::Requirement
187
187
  requirements:
188
- - - "~>"
188
+ - - ~>
189
189
  - !ruby/object:Gem::Version
190
- version: '0.8'
190
+ version: '1.0'
191
191
  type: :runtime
192
192
  prerelease: false
193
193
  version_requirements: !ruby/object:Gem::Requirement
194
194
  requirements:
195
- - - "~>"
195
+ - - ~>
196
196
  - !ruby/object:Gem::Version
197
- version: '0.8'
197
+ version: '1.0'
198
198
  - !ruby/object:Gem::Dependency
199
199
  name: bundler
200
200
  requirement: !ruby/object:Gem::Requirement
201
201
  requirements:
202
- - - "~>"
202
+ - - ~>
203
203
  - !ruby/object:Gem::Version
204
204
  version: '1.3'
205
205
  type: :development
206
206
  prerelease: false
207
207
  version_requirements: !ruby/object:Gem::Requirement
208
208
  requirements:
209
- - - "~>"
209
+ - - ~>
210
210
  - !ruby/object:Gem::Version
211
211
  version: '1.3'
212
212
  - !ruby/object:Gem::Dependency
213
213
  name: rake
214
214
  requirement: !ruby/object:Gem::Requirement
215
215
  requirements:
216
- - - ">="
216
+ - - ~>
217
217
  - !ruby/object:Gem::Version
218
- version: '0'
218
+ version: '10.0'
219
219
  type: :development
220
220
  prerelease: false
221
221
  version_requirements: !ruby/object:Gem::Requirement
222
222
  requirements:
223
- - - ">="
223
+ - - ~>
224
224
  - !ruby/object:Gem::Version
225
- version: '0'
225
+ version: '10.0'
226
226
  - !ruby/object:Gem::Dependency
227
227
  name: bacon
228
228
  requirement: !ruby/object:Gem::Requirement
229
229
  requirements:
230
- - - "~>"
230
+ - - ~>
231
231
  - !ruby/object:Gem::Version
232
232
  version: '1.1'
233
233
  type: :development
234
234
  prerelease: false
235
235
  version_requirements: !ruby/object:Gem::Requirement
236
236
  requirements:
237
- - - "~>"
237
+ - - ~>
238
238
  - !ruby/object:Gem::Version
239
239
  version: '1.1'
240
240
  description: |-
@@ -262,6 +262,8 @@ files:
262
262
  - lib/cocoapods.rb
263
263
  - lib/cocoapods/command.rb
264
264
  - lib/cocoapods/command/cache.rb
265
+ - lib/cocoapods/command/cache/clean.rb
266
+ - lib/cocoapods/command/cache/list.rb
265
267
  - lib/cocoapods/command/init.rb
266
268
  - lib/cocoapods/command/inter_process_communication.rb
267
269
  - lib/cocoapods/command/lib.rb
@@ -269,9 +271,20 @@ files:
269
271
  - lib/cocoapods/command/outdated.rb
270
272
  - lib/cocoapods/command/project.rb
271
273
  - lib/cocoapods/command/repo.rb
274
+ - lib/cocoapods/command/repo/add.rb
275
+ - lib/cocoapods/command/repo/lint.rb
276
+ - lib/cocoapods/command/repo/list.rb
277
+ - lib/cocoapods/command/repo/push.rb
278
+ - lib/cocoapods/command/repo/remove.rb
279
+ - lib/cocoapods/command/repo/update.rb
272
280
  - lib/cocoapods/command/search.rb
273
281
  - lib/cocoapods/command/setup.rb
274
282
  - lib/cocoapods/command/spec.rb
283
+ - lib/cocoapods/command/spec/cat.rb
284
+ - lib/cocoapods/command/spec/create.rb
285
+ - lib/cocoapods/command/spec/edit.rb
286
+ - lib/cocoapods/command/spec/lint.rb
287
+ - lib/cocoapods/command/spec/which.rb
275
288
  - lib/cocoapods/config.rb
276
289
  - lib/cocoapods/downloader.rb
277
290
  - lib/cocoapods/downloader/cache.rb
@@ -285,6 +298,8 @@ files:
285
298
  - lib/cocoapods/external_sources/podspec_source.rb
286
299
  - lib/cocoapods/gem_version.rb
287
300
  - lib/cocoapods/generator/acknowledgements.rb
301
+ - lib/cocoapods/generator/acknowledgements/markdown.rb
302
+ - lib/cocoapods/generator/acknowledgements/plist.rb
288
303
  - lib/cocoapods/generator/bridge_support.rb
289
304
  - lib/cocoapods/generator/copy_resources_script.rb
290
305
  - lib/cocoapods/generator/dummy_source.rb
@@ -295,9 +310,18 @@ files:
295
310
  - lib/cocoapods/generator/prefix_header.rb
296
311
  - lib/cocoapods/generator/umbrella_header.rb
297
312
  - lib/cocoapods/generator/xcconfig.rb
313
+ - lib/cocoapods/generator/xcconfig/aggregate_xcconfig.rb
314
+ - lib/cocoapods/generator/xcconfig/pod_xcconfig.rb
315
+ - lib/cocoapods/generator/xcconfig/xcconfig_helper.rb
298
316
  - lib/cocoapods/hooks_manager.rb
299
317
  - lib/cocoapods/installer.rb
300
318
  - lib/cocoapods/installer/analyzer.rb
319
+ - lib/cocoapods/installer/analyzer/analysis_result.rb
320
+ - lib/cocoapods/installer/analyzer/locking_dependency_analyzer.rb
321
+ - lib/cocoapods/installer/analyzer/sandbox_analyzer.rb
322
+ - lib/cocoapods/installer/analyzer/specs_state.rb
323
+ - lib/cocoapods/installer/analyzer/target_inspection_result.rb
324
+ - lib/cocoapods/installer/analyzer/target_inspector.rb
301
325
  - lib/cocoapods/installer/file_references_installer.rb
302
326
  - lib/cocoapods/installer/migrator.rb
303
327
  - lib/cocoapods/installer/pod_source_installer.rb
@@ -307,7 +331,11 @@ files:
307
331
  - lib/cocoapods/installer/pre_install_hooks_context.rb
308
332
  - lib/cocoapods/installer/source_provider_hooks_context.rb
309
333
  - lib/cocoapods/installer/target_installer.rb
334
+ - lib/cocoapods/installer/target_installer/aggregate_target_installer.rb
335
+ - lib/cocoapods/installer/target_installer/pod_target_installer.rb
310
336
  - lib/cocoapods/installer/user_project_integrator.rb
337
+ - lib/cocoapods/installer/user_project_integrator/target_integrator.rb
338
+ - lib/cocoapods/installer/user_project_integrator/target_integrator/xcconfig_integrator.rb
311
339
  - lib/cocoapods/open_uri.rb
312
340
  - lib/cocoapods/project.rb
313
341
  - lib/cocoapods/resolver.rb
@@ -335,12 +363,12 @@ require_paths:
335
363
  - lib
336
364
  required_ruby_version: !ruby/object:Gem::Requirement
337
365
  requirements:
338
- - - ">="
366
+ - - '>='
339
367
  - !ruby/object:Gem::Version
340
368
  version: 2.0.0
341
369
  required_rubygems_version: !ruby/object:Gem::Requirement
342
370
  requirements:
343
- - - ">="
371
+ - - '>='
344
372
  - !ruby/object:Gem::Version
345
373
  version: '0'
346
374
  requirements: []