pindo 4.6.9

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 (120) hide show
  1. checksums.yaml +7 -0
  2. data/bin/pindo +35 -0
  3. data/lib/pindo/base/aeshelper.rb +31 -0
  4. data/lib/pindo/base/deviceinfo.rb +90 -0
  5. data/lib/pindo/base/executable.rb +224 -0
  6. data/lib/pindo/base/githelper.rb +489 -0
  7. data/lib/pindo/base/hashhelper.rb +134 -0
  8. data/lib/pindo/base/plaininformative.rb +15 -0
  9. data/lib/pindo/base/plistbuddyexecutable.rb +121 -0
  10. data/lib/pindo/base/standarderror.rb +14 -0
  11. data/lib/pindo/client/applovinclient.rb +156 -0
  12. data/lib/pindo/client/aws3sclient.rb +183 -0
  13. data/lib/pindo/client/bossclient.rb +229 -0
  14. data/lib/pindo/client/bossconfigclient.rb +175 -0
  15. data/lib/pindo/client/giteeclient.rb +65 -0
  16. data/lib/pindo/client/httpclient.rb +40 -0
  17. data/lib/pindo/client/pgyerclient.rb +439 -0
  18. data/lib/pindo/client/tgateclient.rb +103 -0
  19. data/lib/pindo/command.rb +101 -0
  20. data/lib/pindo/config/pindoconfig.rb +439 -0
  21. data/lib/pindo/config/pindouserlocalconfig.rb +81 -0
  22. data/lib/pindo/deploy/Fastfile +233 -0
  23. data/lib/pindo/deploy/build.rb +167 -0
  24. data/lib/pindo/deploy/bundleid.rb +245 -0
  25. data/lib/pindo/deploy/cert.rb +508 -0
  26. data/lib/pindo/deploy/check.rb +79 -0
  27. data/lib/pindo/deploy/configproj.rb +89 -0
  28. data/lib/pindo/deploy/confusecode.rb +248 -0
  29. data/lib/pindo/deploy/confuseproj.rb +112 -0
  30. data/lib/pindo/deploy/fabric.rb +58 -0
  31. data/lib/pindo/deploy/getitcinfo.rb +248 -0
  32. data/lib/pindo/deploy/iap.rb +796 -0
  33. data/lib/pindo/deploy/initconfig.rb +128 -0
  34. data/lib/pindo/deploy/itcapp.rb +147 -0
  35. data/lib/pindo/deploy/itcinfo.rb +369 -0
  36. data/lib/pindo/deploy/pem.rb +55 -0
  37. data/lib/pindo/deploy/pullconfig.rb +46 -0
  38. data/lib/pindo/deploy/pushconfig.rb +83 -0
  39. data/lib/pindo/deploy/quswark.rb +146 -0
  40. data/lib/pindo/deploy/quswauth.rb +67 -0
  41. data/lib/pindo/deploy/reportbug.rb +135 -0
  42. data/lib/pindo/deploy/resign.rb +338 -0
  43. data/lib/pindo/deploy/tag.rb +108 -0
  44. data/lib/pindo/deploy/updateconfig.rb +129 -0
  45. data/lib/pindo/deploy/uploadipa.rb +63 -0
  46. data/lib/pindo/deploy.rb +44 -0
  47. data/lib/pindo/dev/autobuild.rb +204 -0
  48. data/lib/pindo/dev/autoresign.rb +186 -0
  49. data/lib/pindo/dev/confusecode.rb +127 -0
  50. data/lib/pindo/dev/confuseproj.rb +111 -0
  51. data/lib/pindo/dev/createbuild.rb +159 -0
  52. data/lib/pindo/dev/debug.rb +141 -0
  53. data/lib/pindo/dev/pub.rb +171 -0
  54. data/lib/pindo/dev/renewcert.rb +142 -0
  55. data/lib/pindo/dev.rb +23 -0
  56. data/lib/pindo/env/dreamstudio.rb +53 -0
  57. data/lib/pindo/env/flutter.rb +59 -0
  58. data/lib/pindo/env/flutter.sh +116 -0
  59. data/lib/pindo/env/quarkenv.rb +58 -0
  60. data/lib/pindo/env/swarkenv.rb +62 -0
  61. data/lib/pindo/env/workhard.rb +56 -0
  62. data/lib/pindo/env.rb +17 -0
  63. data/lib/pindo/ipa/autoresign.rb +188 -0
  64. data/lib/pindo/ipa/import.rb +261 -0
  65. data/lib/pindo/ipa/output.rb +396 -0
  66. data/lib/pindo/ipa.rb +22 -0
  67. data/lib/pindo/lib/forcepush.rb +159 -0
  68. data/lib/pindo/lib/lint.rb +115 -0
  69. data/lib/pindo/lib/push.rb +143 -0
  70. data/lib/pindo/lib/update.rb +75 -0
  71. data/lib/pindo/lib.rb +18 -0
  72. data/lib/pindo/module/appselect.rb +200 -0
  73. data/lib/pindo/module/appstore_in_app_purchase.rb +1803 -0
  74. data/lib/pindo/module/appstore_metadata_connect_api_helper.rb +12 -0
  75. data/lib/pindo/module/appstore_metadata_fastlane_helper.rb +922 -0
  76. data/lib/pindo/module/buildconfighelper.rb +13 -0
  77. data/lib/pindo/module/buildhelper.rb +76 -0
  78. data/lib/pindo/module/commonconfuseproj.rb +271 -0
  79. data/lib/pindo/module/config_project.sh +143 -0
  80. data/lib/pindo/module/configprojhelper.rb +631 -0
  81. data/lib/pindo/module/iap_tier.json +813 -0
  82. data/lib/pindo/module/icon_contents.json +116 -0
  83. data/lib/pindo/module/imessage_icon.json +91 -0
  84. data/lib/pindo/module/imgset_contents.json +21 -0
  85. data/lib/pindo/module/launchimg_contents.json +21 -0
  86. data/lib/pindo/module/pemcreate.rb +63 -0
  87. data/lib/pindo/module/pgyerhelper.rb +339 -0
  88. data/lib/pindo/module/xcodebuildpre.rb +258 -0
  89. data/lib/pindo/module/xcodehelper.rb +521 -0
  90. data/lib/pindo/options/appconfigoptions.rb +23 -0
  91. data/lib/pindo/options/deployoptions.rb +363 -0
  92. data/lib/pindo/pgyer/apptest.rb +104 -0
  93. data/lib/pindo/pgyer/comment.rb +95 -0
  94. data/lib/pindo/pgyer/download.rb +105 -0
  95. data/lib/pindo/pgyer/login.rb +61 -0
  96. data/lib/pindo/pgyer/upload.rb +234 -0
  97. data/lib/pindo/pgyer.rb +17 -0
  98. data/lib/pindo/repo/clone.rb +78 -0
  99. data/lib/pindo/repo/create.rb +55 -0
  100. data/lib/pindo/repo/login.rb +64 -0
  101. data/lib/pindo/repo/search.rb +60 -0
  102. data/lib/pindo/repo.rb +16 -0
  103. data/lib/pindo/setup.rb +60 -0
  104. data/lib/pindo/upgrade.rb +56 -0
  105. data/lib/pindo/utils/applovin.rb +213 -0
  106. data/lib/pindo/utils/boss.rb +209 -0
  107. data/lib/pindo/utils/clearcert.rb +60 -0
  108. data/lib/pindo/utils/device.rb +279 -0
  109. data/lib/pindo/utils/icon.rb +91 -0
  110. data/lib/pindo/utils/icon.sh +133 -0
  111. data/lib/pindo/utils/podindex.rb +56 -0
  112. data/lib/pindo/utils/podindex.sh +30 -0
  113. data/lib/pindo/utils/renewproj.rb +146 -0
  114. data/lib/pindo/utils/tgate.rb +159 -0
  115. data/lib/pindo/utils/xcassets.rb +46 -0
  116. data/lib/pindo/utils/xcassets.sh +88 -0
  117. data/lib/pindo/utils.rb +29 -0
  118. data/lib/pindo/version.rb +110 -0
  119. data/lib/pindo.rb +34 -0
  120. metadata +364 -0
@@ -0,0 +1,258 @@
1
+
2
+ require 'fileutils'
3
+
4
+ module Pindo
5
+
6
+ module Xcodebuildpre
7
+
8
+ def prepare_env(project_dir:nil, apple_id:nil, bundle_id:nil, config_json:nil)
9
+
10
+ apple_id_temp=apple_id
11
+ bundle_id_temp = bundle_id
12
+
13
+
14
+ if !File.exist?(File.join(project_dir, "fastlane"))
15
+ FileUtils.mkdir(File.join(project_dir, "fastlane"))
16
+ end
17
+
18
+ if File.exist?(File.join(project_dir, "fastlane/metadata"))
19
+ FileUtils.rm_rf(File.join(project_dir, "fastlane/metadata"))
20
+ end
21
+ FileUtils.mkdir(File.join(project_dir, "fastlane/metadata"))
22
+
23
+ if File.exist?(File.join(project_dir, "fastlane/screenshots"))
24
+ FileUtils.rm_rf(File.join(project_dir, "fastlane/screenshots"))
25
+ end
26
+ FileUtils.mkdir(File.join(project_dir, "fastlane/screenshots"))
27
+
28
+ if File.exist?(File.join(project_dir, "fastlane/Appfile"))
29
+ FileUtils.rm_rf(File.join(project_dir, "fastlane/Appfile"))
30
+ end
31
+
32
+ if File.exist?(File.join(project_dir, "fastlane/Deliverfile"))
33
+ FileUtils.rm_rf(File.join(project_dir, "fastlane/Deliverfile"))
34
+ end
35
+
36
+ # aFile = File.new(File.join(project_dir, "fastlane/Deliverfile"), "w+")
37
+ # if aFile
38
+ # aFile.syswrite(%Q{username "#{apple_id_temp}"\r\n})
39
+ # aFile.syswrite(%Q{app_identifier "#{bundle_id_temp}"\r\n})
40
+ # end
41
+
42
+ if File.exist?(File.join(project_dir, "fastlane/Matchfile"))
43
+ FileUtils.rm_rf(File.join(project_dir, "fastlane/Matchfile"))
44
+ end
45
+
46
+ project_fullname = ""
47
+ Dir.foreach(project_dir) do |file|
48
+ if file =~ /(.*).xcodeproj/
49
+ project_fullname = file
50
+ break;
51
+ end
52
+ end
53
+
54
+ project_base_name=File.basename(project_fullname, ".xcodeproj")
55
+
56
+ fast_file = File.join(File.expand_path('../', __dir__), 'deploy/Fastfile')
57
+ FileUtils.cp_r(fast_file, File.join(project_dir, "fastlane/Fastfile"))
58
+
59
+ app_version_temp = "1.0.0"
60
+ if config_json && config_json['app_info'] && config_json['app_info']['app_version']
61
+ app_version_temp = config_json['app_info']['app_version']
62
+ end
63
+ app_ipaname_temp = config_json['app_info']['app_display_name']
64
+ app_ipaname_temp = app_ipaname_temp.gsub(/ /, '');
65
+ app_ipaname_temp = app_ipaname_temp.gsub(/\'/, '');
66
+
67
+ if File.exist?(File.join(project_dir, "fastlane/Fastfile"))
68
+ text = File.read(File.join(project_dir, "fastlane/Fastfile"))
69
+ new_contents = text.gsub!(/demo_apple_id/, "#{apple_id_temp}")
70
+ new_contents = text.gsub!(/demo_bundle_id/, "#{bundle_id_temp}")
71
+ new_contents = text.gsub!(/DemoProj/, "#{project_base_name}")
72
+ new_contents = text.gsub!(/1.0.0/, "#{app_version_temp}")
73
+ new_contents = text.gsub!(/demo_ipa_name/, "#{app_ipaname_temp}")
74
+ File.open(File.join(project_dir, "fastlane/Fastfile"), "w") {|file| file.puts new_contents }
75
+ end
76
+
77
+ end
78
+
79
+
80
+
81
+ def config_project_cert(new_proj_name:nil, new_project_dir:nil, cert_type:nil, team_id_vaule:nil, bundle_id_dict:nil)
82
+
83
+ new_proj_fullname = File.join(new_project_dir, new_proj_name) + ".xcodeproj"
84
+ new_project_obj = Xcodeproj::Project.open(new_proj_fullname)
85
+
86
+ bundle_id_value = bundle_id_dict['bundle_id']['bundle_id_value']
87
+
88
+ bundle_id_pushcontent_value = nil
89
+ if bundle_id_dict['bundle_id_pushcontent']
90
+ bundle_id_pushcontent_value = bundle_id_dict['bundle_id_pushcontent']['bundle_id_pushcontent_value']
91
+ end
92
+
93
+ bundle_id_pushservice_value = nil
94
+ if bundle_id_dict['bundle_id_pushservice']
95
+ bundle_id_pushservice_value = bundle_id_dict['bundle_id_pushservice']['bundle_id_pushservice_value']
96
+ end
97
+ bundle_id_keyboard_value = nil
98
+ if bundle_id_dict['bundle_id_keyboard']
99
+ bundle_id_keyboard_value = bundle_id_dict['bundle_id_keyboard']['bundle_id_keyboard_value']
100
+ end
101
+
102
+ bundle_id_imessage_value = nil
103
+ if bundle_id_dict['bundle_id_imessage']
104
+ bundle_id_imessage_value = bundle_id_dict['bundle_id_imessage']['bundle_id_imessage_value']
105
+ end
106
+
107
+ bundle_id_siri_value = nil
108
+ if bundle_id_dict['bundle_id_siri']
109
+ bundle_id_siri_value = bundle_id_dict['bundle_id_siri']['bundle_id_siri_value']
110
+ end
111
+
112
+ bundle_id_siriui_value = nil
113
+ if bundle_id_dict['bundle_id_siriui']
114
+ bundle_id_siriui_value = bundle_id_dict['bundle_id_siriui']['bundle_id_siriui_value']
115
+ end
116
+
117
+ bundle_id_widget_value = nil
118
+ if bundle_id_dict['bundle_id_widget']
119
+ bundle_id_widget_value = bundle_id_dict['bundle_id_widget']['bundle_id_widget_value']
120
+ end
121
+
122
+ bundle_id_extension_value = nil
123
+ if bundle_id_dict['bundle_id_extension']
124
+ bundle_id_extension_value = bundle_id_dict['bundle_id_extension']['bundle_id_extension_value']
125
+ end
126
+
127
+ bundle_id_extensionad_value = nil
128
+ if bundle_id_dict['bundle_id_extensionad']
129
+ bundle_id_extensionad_value = bundle_id_dict['bundle_id_extensionad']['bundle_id_extensionad_value']
130
+ end
131
+
132
+ bundle_id_extensionporn_value = nil
133
+ if bundle_id_dict['bundle_id_extensionporn']
134
+ bundle_id_extensionporn_value = bundle_id_dict['bundle_id_extensionporn']['bundle_id_extensionporn_value']
135
+ end
136
+
137
+
138
+ bundle_id_watchapp_value = nil
139
+ if bundle_id_dict['bundle_id_watchapp']
140
+ bundle_id_watchapp_value = bundle_id_dict['bundle_id_watchapp']['bundle_id_watchapp_value']
141
+ end
142
+
143
+ bundle_id_watchapp_extension_value = nil
144
+ if bundle_id_dict['bundle_id_watchapp_extension']
145
+ bundle_id_watchapp_extension_value = bundle_id_dict['bundle_id_watchapp_extension']['bundle_id_watchapp_extension_value']
146
+ end
147
+
148
+
149
+
150
+ new_project_obj.root_object.build_configuration_list.set_setting('CODE_SIGN_IDENTITY[sdk=iphoneos*]', "Apple Distribution")
151
+ new_project_obj.root_object.build_configuration_list.set_setting('CODE_SIGN_IDENTITY*', "Apple Distribution")
152
+
153
+ if cert_type == "development"
154
+ new_project_obj.root_object.build_configuration_list.set_setting('CODE_SIGN_IDENTITY[sdk=iphoneos*]', "Apple Development")
155
+ new_project_obj.root_object.build_configuration_list.set_setting('CODE_SIGN_IDENTITY*', "Apple Development")
156
+ end
157
+
158
+ new_project_obj.root_object.attributes['TargetAttributes'] = new_project_obj.root_object.attributes['TargetAttributes'] || {}
159
+ target_atts_obj = new_project_obj.root_object.attributes['TargetAttributes']
160
+
161
+ new_project_obj.targets.each do |target|
162
+
163
+ target.build_configurations.each do |config|
164
+
165
+ target_atts_obj[target.uuid] = target_atts_obj[target.uuid] || {}
166
+ target_atts_obj[target.uuid]['DevelopmentTeam'] = team_id_vaule
167
+ target_atts_obj[target.uuid]['ProvisioningStyle'] = "Manual"
168
+ config.build_settings['DEVELOPMENT_TEAM'] = team_id_vaule
169
+ config.build_settings['DEVELOPMENT_TEAM[sdk=iphoneos*]'] = team_id_vaule
170
+ config.build_settings['CODE_SIGN_STYLE'] = "Manual"
171
+
172
+ config.build_settings['CODE_SIGN_IDENTITY'] = "Apple Distribution"
173
+ config.build_settings['CODE_SIGN_IDENTITY[sdk=iphoneos*]'] = "Apple Distribution"
174
+
175
+ if cert_type == "development"
176
+ config.build_settings['CODE_SIGN_IDENTITY'] = "Apple Development"
177
+ config.build_settings['CODE_SIGN_IDENTITY[sdk=iphoneos*]'] = "Apple Development"
178
+ end
179
+
180
+ if target.name.to_s.end_with?("Content") then
181
+ config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id_dict['bundle_id_pushcontent']['bundle_id']
182
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = bundle_id_pushcontent_value
183
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]'] = bundle_id_pushcontent_value
184
+ elsif target.name.to_s.end_with?("Service") then
185
+ config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id_dict['bundle_id_pushservice']['bundle_id']
186
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = bundle_id_pushservice_value
187
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]'] = bundle_id_pushservice_value
188
+ elsif target.name.to_s.end_with?("Keyboard") then
189
+ config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id_dict['bundle_id_keyboard']['bundle_id']
190
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = bundle_id_keyboard_value
191
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]'] = bundle_id_keyboard_value
192
+ elsif target.name.to_s.end_with?("iMessage") then
193
+ config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id_dict['bundle_id_imessage']['bundle_id']
194
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = bundle_id_imessage_value
195
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]'] = bundle_id_imessage_value
196
+ elsif target.name.to_s.end_with?("Siri") then
197
+ config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id_dict['bundle_id_siri']['bundle_id']
198
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = bundle_id_siri_value
199
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]'] = bundle_id_siri_value
200
+ elsif target.name.to_s.end_with?("SiriUI") then
201
+ config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id_dict['bundle_id_siriui']['bundle_id']
202
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = bundle_id_siriui_value
203
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]'] = bundle_id_siriui_value
204
+ elsif target.name.to_s.end_with?("Widget") then
205
+ config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id_dict['bundle_id_widget']['bundle_id']
206
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = bundle_id_widget_value
207
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]'] = bundle_id_widget_value
208
+ elsif target.name.to_s.end_with?("Extension") then
209
+ config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id_dict['bundle_id_extension']['bundle_id']
210
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = bundle_id_extension_value
211
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]'] = bundle_id_extension_value
212
+ elsif target.name.to_s.end_with?("ExtensionAd") then
213
+ config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id_dict['bundle_id_extensionad']['bundle_id']
214
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = bundle_id_extensionad_value
215
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]'] = bundle_id_extensionad_value
216
+ elsif target.name.to_s.end_with?("ExtensionPorn") then
217
+ config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id_dict['bundle_id_extensionporn']['bundle_id']
218
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = bundle_id_extensionporn_value
219
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]'] = bundle_id_extensionporn_value
220
+ elsif target.name.to_s.end_with?("WatchApp") then
221
+ config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id_dict['bundle_id_watchapp']['bundle_id']
222
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = bundle_id_watchapp_value
223
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]'] = bundle_id_watchapp_value
224
+ elsif target.name.to_s.end_with?("WatchAppComplication") then
225
+ config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id_dict['bundle_id_watchapp_extension']['bundle_id']
226
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = bundle_id_watchapp_extension_value
227
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]'] = bundle_id_watchapp_extension_value
228
+ else
229
+ config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id_dict['bundle_id']['bundle_id']
230
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = bundle_id_value
231
+ config.build_settings['PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]'] = bundle_id_value
232
+ end
233
+ end
234
+ end
235
+ new_project_obj.save
236
+
237
+ end
238
+
239
+ def modify_entitlements_plist(entitlements_plist_path:nil, group_id:nil, icloud_id:nil)
240
+ if File.exist?(entitlements_plist_path)
241
+
242
+ entitlements_plist_dict = Xcodeproj::Plist.read_from_path(entitlements_plist_path)
243
+
244
+ if !group_id.nil? && !entitlements_plist_dict['com.apple.security.application-groups'].nil?
245
+ entitlements_plist_dict['com.apple.security.application-groups'] = [group_id]
246
+ end
247
+
248
+ if !icloud_id.nil?
249
+ entitlements_plist_dict['com.apple.developer.icloud-container-identifiers'] = [icloud_id]
250
+ entitlements_plist_dict['com.apple.developer.ubiquity-container-identifiers'] = [icloud_id]
251
+ end
252
+
253
+ Xcodeproj::Plist.write_to_path(entitlements_plist_dict, entitlements_plist_path)
254
+ end
255
+ end
256
+
257
+ end
258
+ end