chef 12.4.0 → 12.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/lib/chef/api_client.rb +31 -129
  3. data/lib/chef/api_client_v1.rb +325 -0
  4. data/lib/chef/chef_class.rb +15 -7
  5. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +2 -2
  6. data/lib/chef/dsl/resources.rb +6 -4
  7. data/lib/chef/exceptions.rb +2 -2
  8. data/lib/chef/guard_interpreter/resource_guard_interpreter.rb +2 -1
  9. data/lib/chef/knife/bootstrap/templates/chef-full.erb +4 -4
  10. data/lib/chef/knife/client_bulk_delete.rb +2 -2
  11. data/lib/chef/knife/client_create.rb +4 -4
  12. data/lib/chef/knife/client_delete.rb +3 -3
  13. data/lib/chef/knife/client_edit.rb +10 -2
  14. data/lib/chef/knife/client_list.rb +2 -2
  15. data/lib/chef/knife/client_reregister.rb +2 -2
  16. data/lib/chef/knife/client_show.rb +2 -2
  17. data/lib/chef/knife/osc_user_create.rb +3 -3
  18. data/lib/chef/knife/osc_user_delete.rb +2 -2
  19. data/lib/chef/knife/osc_user_edit.rb +3 -3
  20. data/lib/chef/knife/osc_user_list.rb +2 -2
  21. data/lib/chef/knife/osc_user_reregister.rb +2 -2
  22. data/lib/chef/knife/osc_user_show.rb +2 -2
  23. data/lib/chef/knife/user_create.rb +3 -3
  24. data/lib/chef/knife/user_delete.rb +4 -4
  25. data/lib/chef/knife/user_edit.rb +3 -3
  26. data/lib/chef/knife/user_list.rb +2 -2
  27. data/lib/chef/knife/user_reregister.rb +2 -2
  28. data/lib/chef/knife/user_show.rb +2 -2
  29. data/lib/chef/node_map.rb +14 -18
  30. data/lib/chef/platform/handler_map.rb +45 -0
  31. data/lib/chef/platform/priority_map.rb +19 -32
  32. data/lib/chef/platform/provider_handler_map.rb +29 -0
  33. data/lib/chef/platform/provider_mapping.rb +3 -2
  34. data/lib/chef/platform/resource_handler_map.rb +29 -0
  35. data/lib/chef/platform/resource_priority_map.rb +0 -6
  36. data/lib/chef/provider.rb +1 -1
  37. data/lib/chef/provider/dsc_resource.rb +2 -2
  38. data/lib/chef/provider/dsc_script.rb +1 -1
  39. data/lib/chef/provider/mount/aix.rb +1 -1
  40. data/lib/chef/provider/package.rb +0 -31
  41. data/lib/chef/provider/package/aix.rb +1 -0
  42. data/lib/chef/provider/package/apt.rb +1 -0
  43. data/lib/chef/provider/package/homebrew.rb +1 -0
  44. data/lib/chef/provider/package/ips.rb +1 -0
  45. data/lib/chef/provider/package/macports.rb +1 -0
  46. data/lib/chef/provider/package/openbsd.rb +1 -0
  47. data/lib/chef/provider/package/pacman.rb +1 -0
  48. data/lib/chef/provider/package/paludis.rb +1 -0
  49. data/lib/chef/provider/package/portage.rb +2 -0
  50. data/lib/chef/provider/package/smartos.rb +1 -0
  51. data/lib/chef/provider/package/solaris.rb +2 -0
  52. data/lib/chef/provider/package/yum.rb +1 -0
  53. data/lib/chef/provider/package/zypper.rb +1 -0
  54. data/lib/chef/provider/service.rb +4 -22
  55. data/lib/chef/provider/service/debian.rb +2 -0
  56. data/lib/chef/provider/service/insserv.rb +2 -0
  57. data/lib/chef/provider/service/invokercd.rb +2 -0
  58. data/lib/chef/provider/service/openbsd.rb +1 -1
  59. data/lib/chef/provider/service/redhat.rb +2 -0
  60. data/lib/chef/provider/service/upstart.rb +3 -0
  61. data/lib/chef/provider_resolver.rb +59 -53
  62. data/lib/chef/resource.rb +22 -73
  63. data/lib/chef/resource/dsc_script.rb +1 -1
  64. data/lib/chef/resource/ips_package.rb +1 -0
  65. data/lib/chef/resource/mount.rb +8 -0
  66. data/lib/chef/resource/openbsd_package.rb +0 -11
  67. data/lib/chef/resource/solaris_package.rb +1 -4
  68. data/lib/chef/resource_resolver.rb +54 -26
  69. data/lib/chef/run_list/versioned_recipe_list.rb +6 -5
  70. data/lib/chef/user.rb +52 -188
  71. data/lib/chef/user_v1.rb +335 -0
  72. data/lib/chef/version.rb +1 -1
  73. data/spec/data/trusted_certs/opscode.pem +53 -56
  74. data/spec/functional/provider/whyrun_safe_ruby_block_spec.rb +1 -1
  75. data/spec/functional/resource/package_spec.rb +0 -2
  76. data/spec/integration/recipes/recipe_dsl_spec.rb +661 -126
  77. data/spec/spec_helper.rb +19 -13
  78. data/spec/support/shared/unit/api_versioning.rb +2 -2
  79. data/spec/unit/api_client_spec.rb +22 -201
  80. data/spec/unit/api_client_v1_spec.rb +457 -0
  81. data/spec/unit/knife/client_bulk_delete_spec.rb +4 -4
  82. data/spec/unit/knife/client_create_spec.rb +1 -1
  83. data/spec/unit/knife/client_delete_spec.rb +3 -3
  84. data/spec/unit/knife/client_edit_spec.rb +14 -1
  85. data/spec/unit/knife/client_list_spec.rb +1 -1
  86. data/spec/unit/knife/client_reregister_spec.rb +2 -2
  87. data/spec/unit/knife/client_show_spec.rb +2 -2
  88. data/spec/unit/knife/osc_user_create_spec.rb +5 -5
  89. data/spec/unit/knife/osc_user_delete_spec.rb +1 -1
  90. data/spec/unit/knife/osc_user_edit_spec.rb +1 -1
  91. data/spec/unit/knife/osc_user_list_spec.rb +1 -1
  92. data/spec/unit/knife/osc_user_reregister_spec.rb +1 -1
  93. data/spec/unit/knife/osc_user_show_spec.rb +1 -1
  94. data/spec/unit/knife/user_create_spec.rb +1 -1
  95. data/spec/unit/knife/user_delete_spec.rb +2 -2
  96. data/spec/unit/knife/user_edit_spec.rb +2 -2
  97. data/spec/unit/knife/user_list_spec.rb +1 -1
  98. data/spec/unit/knife/user_reregister_spec.rb +1 -1
  99. data/spec/unit/knife/user_show_spec.rb +2 -2
  100. data/spec/unit/lwrp_spec.rb +146 -134
  101. data/spec/unit/node_map_spec.rb +12 -0
  102. data/spec/unit/platform_spec.rb +1 -1
  103. data/spec/unit/provider/deploy_spec.rb +1 -1
  104. data/spec/unit/provider/dsc_resource_spec.rb +3 -3
  105. data/spec/unit/provider/dsc_script_spec.rb +2 -2
  106. data/spec/unit/provider_resolver_spec.rb +170 -135
  107. data/spec/unit/recipe_spec.rb +3 -3
  108. data/spec/unit/resource/breakpoint_spec.rb +1 -1
  109. data/spec/unit/resource/cron_spec.rb +1 -1
  110. data/spec/unit/resource/directory_spec.rb +1 -1
  111. data/spec/unit/resource/dsc_resource_spec.rb +1 -1
  112. data/spec/unit/resource/dsc_script_spec.rb +2 -2
  113. data/spec/unit/resource/env_spec.rb +1 -1
  114. data/spec/unit/resource/erl_call_spec.rb +1 -1
  115. data/spec/unit/resource/file_spec.rb +1 -1
  116. data/spec/unit/resource/group_spec.rb +1 -1
  117. data/spec/unit/resource/link_spec.rb +1 -1
  118. data/spec/unit/resource/mdadm_spec.rb +1 -1
  119. data/spec/unit/resource/mount_spec.rb +1 -1
  120. data/spec/unit/resource/ohai_spec.rb +1 -1
  121. data/spec/unit/resource/registry_key_spec.rb +1 -1
  122. data/spec/unit/resource/route_spec.rb +1 -1
  123. data/spec/unit/resource/ruby_block_spec.rb +3 -3
  124. data/spec/unit/resource/user_spec.rb +1 -1
  125. data/spec/unit/resource/windows_service_spec.rb +1 -1
  126. data/spec/unit/resource_resolver_spec.rb +8 -4
  127. data/spec/unit/resource_spec.rb +89 -3
  128. data/spec/unit/run_list/versioned_recipe_list_spec.rb +115 -48
  129. data/spec/unit/user_spec.rb +97 -405
  130. data/spec/unit/user_v1_spec.rb +584 -0
  131. metadata +11 -6
  132. data/lib/chef/osc_user.rb +0 -194
  133. data/spec/unit/osc_user_spec.rb +0 -276
@@ -0,0 +1,335 @@
1
+ #
2
+ # Author:: Steven Danna (steve@opscode.com)
3
+ # Copyright:: Copyright 2012 Opscode, Inc.
4
+ # License:: Apache License, Version 2.0
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ require 'chef/config'
19
+ require 'chef/mixin/params_validate'
20
+ require 'chef/mixin/from_file'
21
+ require 'chef/mash'
22
+ require 'chef/json_compat'
23
+ require 'chef/search/query'
24
+ require 'chef/mixin/api_version_request_handling'
25
+ require 'chef/exceptions'
26
+ require 'chef/server_api'
27
+
28
+ # OSC 11 BACKWARDS COMPATIBILITY NOTE (remove after OSC 11 support ends)
29
+ #
30
+ # In general, Chef::UserV1 is no longer expected to support Open Source Chef 11 Server requests.
31
+ # The object that handles those requests remain in the Chef::User namespace.
32
+ # This code will be moved to the Chef::User namespace as of Chef 13.
33
+ #
34
+ # Exception: self.list is backwards compatible with OSC 11
35
+ class Chef
36
+ class UserV1
37
+
38
+ include Chef::Mixin::FromFile
39
+ include Chef::Mixin::ParamsValidate
40
+ include Chef::Mixin::ApiVersionRequestHandling
41
+
42
+ SUPPORTED_API_VERSIONS = [0,1]
43
+
44
+ def initialize
45
+ @username = nil
46
+ @display_name = nil
47
+ @first_name = nil
48
+ @middle_name = nil
49
+ @last_name = nil
50
+ @email = nil
51
+ @password = nil
52
+ @public_key = nil
53
+ @private_key = nil
54
+ @create_key = nil
55
+ @password = nil
56
+ end
57
+
58
+ def chef_root_rest_v0
59
+ @chef_root_rest_v0 ||= Chef::ServerAPI.new(Chef::Config[:chef_server_root], {:api_version => "0"})
60
+ end
61
+
62
+ def chef_root_rest_v1
63
+ @chef_root_rest_v1 ||= Chef::ServerAPI.new(Chef::Config[:chef_server_root], {:api_version => "1"})
64
+ end
65
+
66
+ def username(arg=nil)
67
+ set_or_return(:username, arg,
68
+ :regex => /^[a-z0-9\-_]+$/)
69
+ end
70
+
71
+ def display_name(arg=nil)
72
+ set_or_return(:display_name,
73
+ arg, :kind_of => String)
74
+ end
75
+
76
+ def first_name(arg=nil)
77
+ set_or_return(:first_name,
78
+ arg, :kind_of => String)
79
+ end
80
+
81
+ def middle_name(arg=nil)
82
+ set_or_return(:middle_name,
83
+ arg, :kind_of => String)
84
+ end
85
+
86
+ def last_name(arg=nil)
87
+ set_or_return(:last_name,
88
+ arg, :kind_of => String)
89
+ end
90
+
91
+ def email(arg=nil)
92
+ set_or_return(:email,
93
+ arg, :kind_of => String)
94
+ end
95
+
96
+ def password(arg=nil)
97
+ set_or_return(:password,
98
+ arg, :kind_of => String)
99
+ end
100
+
101
+ def create_key(arg=nil)
102
+ set_or_return(:create_key, arg,
103
+ :kind_of => [TrueClass, FalseClass])
104
+ end
105
+
106
+ def public_key(arg=nil)
107
+ set_or_return(:public_key,
108
+ arg, :kind_of => String)
109
+ end
110
+
111
+ def private_key(arg=nil)
112
+ set_or_return(:private_key,
113
+ arg, :kind_of => String)
114
+ end
115
+
116
+ def password(arg=nil)
117
+ set_or_return(:password,
118
+ arg, :kind_of => String)
119
+ end
120
+
121
+ def to_hash
122
+ result = {
123
+ "username" => @username
124
+ }
125
+ result["display_name"] = @display_name unless @display_name.nil?
126
+ result["first_name"] = @first_name unless @first_name.nil?
127
+ result["middle_name"] = @middle_name unless @middle_name.nil?
128
+ result["last_name"] = @last_name unless @last_name.nil?
129
+ result["email"] = @email unless @email.nil?
130
+ result["password"] = @password unless @password.nil?
131
+ result["public_key"] = @public_key unless @public_key.nil?
132
+ result["private_key"] = @private_key unless @private_key.nil?
133
+ result["create_key"] = @create_key unless @create_key.nil?
134
+ result
135
+ end
136
+
137
+ def to_json(*a)
138
+ Chef::JSONCompat.to_json(to_hash, *a)
139
+ end
140
+
141
+ def destroy
142
+ # will default to the current API version (Chef::Authenticator::DEFAULT_SERVER_API_VERSION)
143
+ Chef::REST.new(Chef::Config[:chef_server_url]).delete("users/#{@username}")
144
+ end
145
+
146
+ def create
147
+ # try v1, fail back to v0 if v1 not supported
148
+ begin
149
+ payload = {
150
+ :username => @username,
151
+ :display_name => @display_name,
152
+ :first_name => @first_name,
153
+ :last_name => @last_name,
154
+ :email => @email,
155
+ :password => @password
156
+ }
157
+ payload[:public_key] = @public_key unless @public_key.nil?
158
+ payload[:create_key] = @create_key unless @create_key.nil?
159
+ payload[:middle_name] = @middle_name unless @middle_name.nil?
160
+ raise Chef::Exceptions::InvalidUserAttribute, "You cannot set both public_key and create_key for create." if !@create_key.nil? && !@public_key.nil?
161
+ new_user = chef_root_rest_v1.post("users", payload)
162
+
163
+ # get the private_key out of the chef_key hash if it exists
164
+ if new_user['chef_key']
165
+ if new_user['chef_key']['private_key']
166
+ new_user['private_key'] = new_user['chef_key']['private_key']
167
+ end
168
+ new_user['public_key'] = new_user['chef_key']['public_key']
169
+ new_user.delete('chef_key')
170
+ end
171
+ rescue Net::HTTPServerException => e
172
+ # rescue API V0 if 406 and the server supports V0
173
+ supported_versions = server_client_api_version_intersection(e, SUPPORTED_API_VERSIONS)
174
+ raise e unless supported_versions && supported_versions.include?(0)
175
+ payload = {
176
+ :username => @username,
177
+ :display_name => @display_name,
178
+ :first_name => @first_name,
179
+ :last_name => @last_name,
180
+ :email => @email,
181
+ :password => @password
182
+ }
183
+ payload[:middle_name] = @middle_name unless @middle_name.nil?
184
+ payload[:public_key] = @public_key unless @public_key.nil?
185
+ # under API V0, the server will create a key pair if public_key isn't passed
186
+ new_user = chef_root_rest_v0.post("users", payload)
187
+ end
188
+
189
+ Chef::UserV1.from_hash(self.to_hash.merge(new_user))
190
+ end
191
+
192
+ def update(new_key=false)
193
+ begin
194
+ payload = {:username => username}
195
+ payload[:display_name] = display_name unless display_name.nil?
196
+ payload[:first_name] = first_name unless first_name.nil?
197
+ payload[:middle_name] = middle_name unless middle_name.nil?
198
+ payload[:last_name] = last_name unless last_name.nil?
199
+ payload[:email] = email unless email.nil?
200
+ payload[:password] = password unless password.nil?
201
+
202
+ # API V1 will fail if these key fields are defined, and try V0 below if relevant 400 is returned
203
+ payload[:public_key] = public_key unless public_key.nil?
204
+ payload[:private_key] = new_key if new_key
205
+
206
+ updated_user = chef_root_rest_v1.put("users/#{username}", payload)
207
+ rescue Net::HTTPServerException => e
208
+ if e.response.code == "400"
209
+ # if a 400 is returned but the error message matches the error related to private / public key fields, try V0
210
+ # else, raise the 400
211
+ error = Chef::JSONCompat.from_json(e.response.body)["error"].first
212
+ error_match = /Since Server API v1, all keys must be updated via the keys endpoint/.match(error)
213
+ if error_match.nil?
214
+ raise e
215
+ end
216
+ else # for other types of errors, test for API versioning errors right away
217
+ supported_versions = server_client_api_version_intersection(e, SUPPORTED_API_VERSIONS)
218
+ raise e unless supported_versions && supported_versions.include?(0)
219
+ end
220
+ updated_user = chef_root_rest_v0.put("users/#{username}", payload)
221
+ end
222
+ Chef::UserV1.from_hash(self.to_hash.merge(updated_user))
223
+ end
224
+
225
+ def save(new_key=false)
226
+ begin
227
+ create
228
+ rescue Net::HTTPServerException => e
229
+ if e.response.code == "409"
230
+ update(new_key)
231
+ else
232
+ raise e
233
+ end
234
+ end
235
+ end
236
+
237
+ # Note: remove after API v0 no longer supported by client (and knife command).
238
+ def reregister
239
+ begin
240
+ payload = self.to_hash.merge({"private_key" => true})
241
+ reregistered_self = chef_root_rest_v0.put("users/#{username}", payload)
242
+ private_key(reregistered_self["private_key"])
243
+ # only V0 supported for reregister
244
+ rescue Net::HTTPServerException => e
245
+ # if there was a 406 related to versioning, give error explaining that
246
+ # only API version 0 is supported for reregister command
247
+ if e.response.code == "406" && e.response["x-ops-server-api-version"]
248
+ version_header = Chef::JSONCompat.from_json(e.response["x-ops-server-api-version"])
249
+ min_version = version_header["min_version"]
250
+ max_version = version_header["max_version"]
251
+ error_msg = reregister_only_v0_supported_error_msg(max_version, min_version)
252
+ raise Chef::Exceptions::OnlyApiVersion0SupportedForAction.new(error_msg)
253
+ else
254
+ raise e
255
+ end
256
+ end
257
+ self
258
+ end
259
+
260
+ def to_s
261
+ "user[#{@username}]"
262
+ end
263
+
264
+ # Class Methods
265
+
266
+ def self.from_hash(user_hash)
267
+ user = Chef::UserV1.new
268
+ user.username user_hash['username']
269
+ user.display_name user_hash['display_name'] if user_hash.key?('display_name')
270
+ user.first_name user_hash['first_name'] if user_hash.key?('first_name')
271
+ user.middle_name user_hash['middle_name'] if user_hash.key?('middle_name')
272
+ user.last_name user_hash['last_name'] if user_hash.key?('last_name')
273
+ user.email user_hash['email'] if user_hash.key?('email')
274
+ user.password user_hash['password'] if user_hash.key?('password')
275
+ user.public_key user_hash['public_key'] if user_hash.key?('public_key')
276
+ user.private_key user_hash['private_key'] if user_hash.key?('private_key')
277
+ user.create_key user_hash['create_key'] if user_hash.key?('create_key')
278
+ user
279
+ end
280
+
281
+ def self.from_json(json)
282
+ Chef::UserV1.from_hash(Chef::JSONCompat.from_json(json))
283
+ end
284
+
285
+ class << self
286
+ alias_method :json_create, :from_json
287
+ end
288
+
289
+ def self.list(inflate=false)
290
+ response = Chef::REST.new(Chef::Config[:chef_server_url]).get('users')
291
+ users = if response.is_a?(Array)
292
+ # EC 11 / CS 12 V0, V1
293
+ # GET /organizations/<org>/users
294
+ transform_list_response(response)
295
+ else
296
+ # OSC 11
297
+ # GET /users
298
+ # EC 11 / CS 12 V0, V1
299
+ # GET /users
300
+ response # OSC
301
+ end
302
+
303
+ if inflate
304
+ users.inject({}) do |user_map, (name, _url)|
305
+ user_map[name] = Chef::UserV1.load(name)
306
+ user_map
307
+ end
308
+ else
309
+ users
310
+ end
311
+ end
312
+
313
+ def self.load(username)
314
+ # will default to the current API version (Chef::Authenticator::DEFAULT_SERVER_API_VERSION)
315
+ response = Chef::REST.new(Chef::Config[:chef_server_url]).get("users/#{username}")
316
+ Chef::UserV1.from_hash(response)
317
+ end
318
+
319
+ # Gross. Transforms an API response in the form of:
320
+ # [ { "user" => { "username" => USERNAME }}, ...]
321
+ # into the form
322
+ # { "USERNAME" => "URI" }
323
+ def self.transform_list_response(response)
324
+ new_response = Hash.new
325
+ response.each do |u|
326
+ name = u['user']['username']
327
+ new_response[name] = Chef::Config[:chef_server_url] + "/users/#{name}"
328
+ end
329
+ new_response
330
+ end
331
+
332
+ private_class_method :transform_list_response
333
+
334
+ end
335
+ end
@@ -21,7 +21,7 @@
21
21
 
22
22
  class Chef
23
23
  CHEF_ROOT = File.dirname(File.expand_path(File.dirname(__FILE__)))
24
- VERSION = '12.4.0'
24
+ VERSION = '12.4.1'
25
25
  end
26
26
 
27
27
  #
@@ -1,60 +1,57 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIIFrDCCBJSgAwIBAgIQB1O/fCb6cEytJ4BP3HTbCTANBgkqhkiG9w0BAQUFADBI
3
- MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSIwIAYDVQQDExlE
4
- aWdpQ2VydCBTZWN1cmUgU2VydmVyIENBMB4XDTE0MDYxMDAwMDAwMFoXDTE1MDcw
5
- MTEyMDAwMFowaTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
6
- BgNVBAcTB1NlYXR0bGUxGzAZBgNVBAoTEkNoZWYgU29mdHdhcmUsIEluYzEWMBQG
7
- A1UEAwwNKi5vcHNjb2RlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
8
- ggEBAMm+rf2RcPGBlZoM+hI4BxlaHbdRg1GZJ/T46UWFOBnZFVP++TX/pyjDsvns
9
- xymcQywtoN/26+UIys6oWX1um9ikEokvf67LdsUeemQGFHFky8X1Ka2hVtKnxBhi
10
- XZfvyHDR4IyFWU9AwmhnqySzxqCtynUu8Gktx7JVfqbRFMZ186pDcSw8LoaqjTVG
11
- SzO7eNH2sM3doMueAHj7ITc2wUzmfa0Pdh+K8UoCn/HopU5LzycziJVPYvUkLT2m
12
- YCV7VWRc+kObZseHhZAbyaDk3RgPQ/eRMhytAgbruBHWDqNesNw+ZA70w856Oj2Y
13
- geO7JF+5V6WvkywrF8vydaoM2l8CAwEAAaOCAm8wggJrMB8GA1UdIwQYMBaAFJBx
14
- 2zfrc8jv3NUeErY0uitaoKaSMB0GA1UdDgQWBBQK5zjZwbcmcMNLnI2h1ioAldEV
15
- ujCBygYDVR0RBIHCMIG/gg0qLm9wc2NvZGUuY29tghBjb3JwLm9wc2NvZGUuY29t
16
- ghIqLmNvcnAub3BzY29kZS5jb22CDyoubGVhcm5jaGVmLmNvbYISKi5jb3JwLmdl
17
- dGNoZWYuY29tgg0qLmdldGNoZWYuY29tggwqLm9wc2NvZGUudXOCC2dldGNoZWYu
18
- Y29tggtvcHNjb2RlLmNvbYIRYXBpLmJlcmtzaGVsZi5jb22CDWxlYXJuY2hlZi5j
19
- b22CCm9wc2NvZGUudXMwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUF
20
- BwMBBggrBgEFBQcDAjBhBgNVHR8EWjBYMCqgKKAmhiRodHRwOi8vY3JsMy5kaWdp
21
- Y2VydC5jb20vc3NjYS1nNi5jcmwwKqAooCaGJGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0
22
- LmNvbS9zc2NhLWc2LmNybDBCBgNVHSAEOzA5MDcGCWCGSAGG/WwBATAqMCgGCCsG
23
- AQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMHgGCCsGAQUFBwEB
24
- BGwwajAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEIGCCsG
25
- AQUFBzAChjZodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRTZWN1
26
- cmVTZXJ2ZXJDQS5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQUFAAOCAQEA
27
- kgBpJ2t+St7SmWfeNU9EWAhy0NuUnRIi1jnqXdapfPmS6V/M0i2wP/p+crMty78e
28
- +3ieuF5s0GJBLs85Hikcl3SlrrbIBJxozov1TY6zeOi6+TCsdXer6t6iQKz36zno
29
- +k+T6lnMCyo9+pk1PhcAWyfo1Fz4xVOBVec/71VovFkkGD2//KB+sbDs+yh21N9M
30
- ReO7duj16rQSctfO9R2h65djBNlgz6hXY2nlw8/x3uFfZobXOxDrTcH6Z8HIslkE
31
- MiTXGix6zdqJaFRCWi+prnAztWs+jEy+v95VSEHPj3xpwZ9WjsxQN0kFA2EX61v/
32
- kGunmyhehGjblQRt7bpyiA==
33
- -----END CERTIFICATE-----
34
- -----BEGIN CERTIFICATE-----
35
- MIIEjzCCA3egAwIBAgIQBp4dt3/PHfupevXlyaJANzANBgkqhkiG9w0BAQUFADBh
2
+ MIIElDCCA3ygAwIBAgIQAf2j627KdciIQ4tyS8+8kTANBgkqhkiG9w0BAQsFADBh
36
3
  MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
37
4
  d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
38
- QTAeFw0xMzAzMDgxMjAwMDBaFw0yMzAzMDgxMjAwMDBaMEgxCzAJBgNVBAYTAlVT
39
- MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxIjAgBgNVBAMTGURpZ2lDZXJ0IFNlY3Vy
40
- ZSBTZXJ2ZXIgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7V+Qh
41
- qdWbYDd+jqFhf4HiGsJ1ZNmRUAvkNkQkbjDSm3on+sJqrmpwCTi5IArIZRBKiKwx
42
- 8tyS8mOhXYBjWYCSIxzm73ZKUDXJ2HE4ue3w5kKu0zgmeTD5IpTG26Y/QXiQ2N5c
43
- fml9+JAVOtChoL76srIZodgr0c6/a91Jq6OS/rWryME+7gEA2KlEuEJziMNh9atK
44
- gygK0tRJ+mqxzd9XLJTl4sqDX7e6YlwvaKXwwLn9K9HpH9gaYhW9/z2m98vv5ttl
45
- LyU47PvmIGZYljQZ0hXOIdMkzNkUb9j+Vcfnb7YPGoxJvinyulqagSY3JG/XSBJs
46
- Lln1nBi72fZo4t9FAgMBAAGjggFaMIIBVjASBgNVHRMBAf8ECDAGAQH/AgEAMA4G
47
- A1UdDwEB/wQEAwIBhjA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6
48
- Ly9vY3NwLmRpZ2ljZXJ0LmNvbTB7BgNVHR8EdDByMDegNaAzhjFodHRwOi8vY3Js
49
- My5kaWdpY2VydC5jb20vRGlnaUNlcnRHbG9iYWxSb290Q0EuY3JsMDegNaAzhjFo
50
- dHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRHbG9iYWxSb290Q0EuY3Js
51
- MD0GA1UdIAQ2MDQwMgYEVR0gADAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5k
52
- aWdpY2VydC5jb20vQ1BTMB0GA1UdDgQWBBSQcds363PI79zVHhK2NLorWqCmkjAf
53
- BgNVHSMEGDAWgBQD3lA1VtFMu2bwo+IbG8OXsj3RVTANBgkqhkiG9w0BAQUFAAOC
54
- AQEAMM7RlVEArgYLoQ4CwBestn+PIPZAdXQczHixpE/q9NDEnaLegQcmH0CIUfAf
55
- z7dMQJnQ9DxxmHOIlywZ126Ej6QfnFog41FcsMWemWpPyGn3EP9OrRnZyVizM64M
56
- 2ZYpnnGycGOjtpkWQh1l8/egHn3F1GUUsmKE1GxcCAzYbJMrtHZZitF//wPYwl24
57
- LyLWOPD2nGt9RuuZdPfrSg6ppgTre87wXGuYMVqYQOtpxAX0IKjKCDplbDgV9Vws
58
- slXkLGtB8L5cRspKKaBIXiDSRf8F3jSvcEuBOeLKB1d8tjHcISnivpcOd5AUUUDh
59
- v+PMGxmcJcqnBrJT3yOyzxIZow==
5
+ QTAeFw0xMzAzMDgxMjAwMDBaFw0yMzAzMDgxMjAwMDBaME0xCzAJBgNVBAYTAlVT
6
+ MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxJzAlBgNVBAMTHkRpZ2lDZXJ0IFNIQTIg
7
+ U2VjdXJlIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
8
+ ANyuWJBNwcQwFZA1W248ghX1LFy949v/cUP6ZCWA1O4Yok3wZtAKc24RmDYXZK83
9
+ nf36QYSvx6+M/hpzTc8zl5CilodTgyu5pnVILR1WN3vaMTIa16yrBvSqXUu3R0bd
10
+ KpPDkC55gIDvEwRqFDu1m5K+wgdlTvza/P96rtxcflUxDOg5B6TXvi/TC2rSsd9f
11
+ /ld0Uzs1gN2ujkSYs58O09rg1/RrKatEp0tYhG2SS4HD2nOLEpdIkARFdRrdNzGX
12
+ kujNVA075ME/OV4uuPNcfhCOhkEAjUVmR7ChZc6gqikJTvOX6+guqw9ypzAO+sf0
13
+ /RR3w6RbKFfCs/mC/bdFWJsCAwEAAaOCAVowggFWMBIGA1UdEwEB/wQIMAYBAf8C
14
+ AQAwDgYDVR0PAQH/BAQDAgGGMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYY
15
+ aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6
16
+ Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RDQS5jcmwwN6A1
17
+ oDOGMWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RD
18
+ QS5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8v
19
+ d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwHQYDVR0OBBYEFA+AYRyCMWHVLyjnjUY4tCzh
20
+ xtniMB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFVMA0GCSqGSIb3DQEB
21
+ CwUAA4IBAQAjPt9L0jFCpbZ+QlwaRMxp0Wi0XUvgBCFsS+JtzLHgl4+mUwnNqipl
22
+ 5TlPHoOlblyYoiQm5vuh7ZPHLgLGTUq/sELfeNqzqPlt/yGFUzZgTHbO7Djc1lGA
23
+ 8MXW5dRNJ2Srm8c+cftIl7gzbckTB+6WohsYFfZcTEDts8Ls/3HB40f/1LkAtDdC
24
+ 2iDJ6m6K7hQGrn2iWZiIqBtvLfTyyRRfJs8sjX7tN8Cp1Tm5gr8ZDOo0rwAhaPit
25
+ c+LJMto4JQtV05od8GiG7S5BNO98pVAdvzr508EIDObtHopYJeS4d60tbvVS3bR0
26
+ j6tJLp07kzQoH3jOlOrHvdPJbRzeXDLz
27
+ -----END CERTIFICATE-----
28
+ -----BEGIN CERTIFICATE-----
29
+ MIIFDTCCA/WgAwIBAgIQBZ8R1sZP2Lbc8x554UUQ2DANBgkqhkiG9w0BAQsFADBN
30
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMScwJQYDVQQDEx5E
31
+ aWdpQ2VydCBTSEEyIFNlY3VyZSBTZXJ2ZXIgQ0EwHhcNMTQxMTEwMDAwMDAwWhcN
32
+ MTcxMTE0MTIwMDAwWjBlMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
33
+ bjEQMA4GA1UEBxMHU2VhdHRsZTEbMBkGA1UEChMSQ2hlZiBTb2Z0d2FyZSwgSW5j
34
+ MRIwEAYDVQQDDAkqLmNoZWYuaW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
35
+ AoIBAQC3xCIczkV10O5jTDpbd4YlPLC6kfnVoOkno2N/OOlcLQu3ulj/Lj1j4r6e
36
+ 2XthJLcFgTO+y+1/IKnnpLKDfkx1YngWEBXEBP+MrrpDUKKs053s45/bI9QBPISA
37
+ tXgnYxMH9Glo6FWWd13TUq++OKGw1p1wazH64XK4MAf5y/lkmWXIWumNuO35ZqtB
38
+ ME3wJISwVHzHB2CQjlDklt+Mb0APEiIFIZflgu9JNBYzLdvUtxiz15FUZQI7SsYL
39
+ TfXOD1KBNMWqN8snG2e5gRAzB2D161DFvAZt8OiYUe+3QurNlTYVzeHv1ok6UqgM
40
+ ZcLzg8m801rRip0D7FCGvMCU/ktdAgMBAAGjggHPMIIByzAfBgNVHSMEGDAWgBQP
41
+ gGEcgjFh1S8o541GOLQs4cbZ4jAdBgNVHQ4EFgQUwldjw4Pb4HV+wxGZ7MSSRh+d
42
+ pm4wHQYDVR0RBBYwFIIJKi5jaGVmLmlvggdjaGVmLmlvMA4GA1UdDwEB/wQEAwIF
43
+ oDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwawYDVR0fBGQwYjAvoC2g
44
+ K4YpaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NzY2Etc2hhMi1nMy5jcmwwL6At
45
+ oCuGKWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zc2NhLXNoYTItZzMuY3JsMEIG
46
+ A1UdIAQ7MDkwNwYJYIZIAYb9bAEBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3
47
+ LmRpZ2ljZXJ0LmNvbS9DUFMwfAYIKwYBBQUHAQEEcDBuMCQGCCsGAQUFBzABhhho
48
+ dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wRgYIKwYBBQUHMAKGOmh0dHA6Ly9jYWNl
49
+ cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFNIQTJTZWN1cmVTZXJ2ZXJDQS5jcnQw
50
+ DAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAQEAvcTWenNuvvrhX2omm8LQ
51
+ zWOuu8jqpoflACwD4lOSZ4TgOe4pQGCjXq8aRBD5k+goqQrPVf9lHnelUHFQac0Q
52
+ 5WT4YUmisUbF0S4uY5OGQymM52MvUWG4ODL4gaWhFvN+HAXrDPP/9iitsjV0QOnl
53
+ CDq7Q4/XYRYW3opu5nLLbfW6v4QvF5yzZagEACGs7Vt32p6l391UcU8f6wiB3uMD
54
+ eioCvjpv/+2YOUNlDPCM3uBubjUhHOwO817wBxXkzdk1OSRe4jzcw/uX6wL7birt
55
+ fbaSkpilvVX529pSzB2Lvi9xWOoGMM578dpQ0h3PwhmmvKhhCWP+pI05k3oSkYCP
56
+ ng==
60
57
  -----END CERTIFICATE-----