ruby-saml 0.9.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ruby-saml might be problematic. Click here for more details.

Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/LICENSE +1 -1
  4. data/README.md +71 -15
  5. data/changelog.md +15 -6
  6. data/lib/onelogin/ruby-saml.rb +1 -0
  7. data/lib/onelogin/ruby-saml/attribute_service.rb +25 -2
  8. data/lib/onelogin/ruby-saml/attributes.rb +42 -23
  9. data/lib/onelogin/ruby-saml/authrequest.rb +33 -8
  10. data/lib/onelogin/ruby-saml/http_error.rb +7 -0
  11. data/lib/onelogin/ruby-saml/idp_metadata_parser.rb +65 -10
  12. data/lib/onelogin/ruby-saml/logging.rb +14 -10
  13. data/lib/onelogin/ruby-saml/logoutrequest.rb +39 -14
  14. data/lib/onelogin/ruby-saml/logoutresponse.rb +166 -39
  15. data/lib/onelogin/ruby-saml/metadata.rb +40 -23
  16. data/lib/onelogin/ruby-saml/response.rb +562 -88
  17. data/lib/onelogin/ruby-saml/saml_message.rb +80 -14
  18. data/lib/onelogin/ruby-saml/settings.rb +62 -23
  19. data/lib/onelogin/ruby-saml/slo_logoutrequest.rb +210 -20
  20. data/lib/onelogin/ruby-saml/slo_logoutresponse.rb +44 -13
  21. data/lib/onelogin/ruby-saml/utils.rb +163 -40
  22. data/lib/onelogin/ruby-saml/version.rb +1 -1
  23. data/lib/schemas/saml-schema-metadata-2.0.xsd +0 -2
  24. data/lib/xml_security.rb +87 -29
  25. data/ruby-saml.gemspec +1 -0
  26. data/test/certificates/{r1_certificate2_base64 → certificate_without_head_foot} +0 -0
  27. data/test/certificates/formatted_certificate +14 -0
  28. data/test/certificates/formatted_private_key +12 -0
  29. data/test/certificates/formatted_rsa_private_key +12 -0
  30. data/test/certificates/invalid_certificate1 +1 -0
  31. data/test/certificates/invalid_certificate2 +1 -0
  32. data/test/certificates/invalid_certificate3 +12 -0
  33. data/test/certificates/invalid_private_key1 +1 -0
  34. data/test/certificates/invalid_private_key2 +1 -0
  35. data/test/certificates/invalid_private_key3 +10 -0
  36. data/test/certificates/invalid_rsa_private_key1 +1 -0
  37. data/test/certificates/invalid_rsa_private_key2 +1 -0
  38. data/test/certificates/invalid_rsa_private_key3 +10 -0
  39. data/test/idp_metadata_parser_test.rb +41 -4
  40. data/test/logging_test.rb +62 -0
  41. data/test/logout_requests/invalid_slo_request.xml +6 -0
  42. data/test/{responses → logout_requests}/slo_request.xml +0 -0
  43. data/test/logout_requests/slo_request.xml.base64 +1 -0
  44. data/test/logout_requests/slo_request_deflated.xml.base64 +1 -0
  45. data/test/logout_requests/slo_request_with_session_index.xml +5 -0
  46. data/test/{responses → logout_responses}/logoutresponse_fixtures.rb +6 -6
  47. data/test/logoutrequest_test.rb +79 -52
  48. data/test/logoutresponse_test.rb +206 -59
  49. data/test/metadata_test.rb +77 -7
  50. data/test/request_test.rb +80 -65
  51. data/test/response_test.rb +862 -189
  52. data/test/responses/attackxee.xml +13 -0
  53. data/test/responses/invalids/invalid_audience.xml.base64 +1 -0
  54. data/test/responses/invalids/invalid_issuer_assertion.xml.base64 +1 -0
  55. data/test/responses/invalids/invalid_issuer_message.xml.base64 +1 -0
  56. data/test/responses/invalids/invalid_signature_position.xml.base64 +1 -0
  57. data/test/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64 +1 -0
  58. data/test/responses/invalids/invalid_subjectconfirmation_nb.xml.base64 +1 -0
  59. data/test/responses/invalids/invalid_subjectconfirmation_noa.xml.base64 +1 -0
  60. data/test/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64 +1 -0
  61. data/test/responses/invalids/multiple_assertions.xml.base64 +2 -0
  62. data/test/responses/invalids/multiple_signed.xml.base64 +1 -0
  63. data/test/responses/invalids/no_id.xml.base64 +1 -0
  64. data/test/responses/invalids/no_saml2.xml.base64 +1 -0
  65. data/test/responses/invalids/no_signature.xml.base64 +1 -0
  66. data/test/responses/invalids/no_status.xml.base64 +1 -0
  67. data/test/responses/invalids/no_status_code.xml.base64 +1 -0
  68. data/test/responses/invalids/no_subjectconfirmation_data.xml.base64 +1 -0
  69. data/test/responses/invalids/no_subjectconfirmation_method.xml.base64 +1 -0
  70. data/test/responses/invalids/response_encrypted_attrs.xml.base64 +1 -0
  71. data/test/responses/invalids/response_invalid_signed_element.xml.base64 +1 -0
  72. data/test/responses/invalids/status_code_responder.xml.base64 +1 -0
  73. data/test/responses/invalids/status_code_responer_and_msg.xml.base64 +1 -0
  74. data/test/responses/{response4.xml.base64 → response_assertion_wrapped.xml.base64} +0 -0
  75. data/test/responses/response_encrypted_nameid.xml.base64 +1 -0
  76. data/test/responses/response_unsigned_xml_base64 +1 -0
  77. data/test/responses/{response5.xml.base64 → response_with_saml2_namespace.xml.base64} +0 -0
  78. data/test/responses/{response3.xml.base64 → response_with_signed_assertion.xml.base64} +0 -0
  79. data/test/responses/{r1_response6.xml.base64 → response_with_signed_assertion_2.xml.base64} +0 -0
  80. data/test/responses/{response1.xml.base64 → response_with_undefined_recipient.xml.base64} +0 -0
  81. data/test/responses/{response2.xml.base64 → response_without_attributes.xml.base64} +0 -0
  82. data/test/responses/{wrapped_response_2.xml.base64 → response_wrapped.xml.base64} +0 -0
  83. data/test/responses/signed_message_encrypted_signed_assertion.xml.base64 +1 -0
  84. data/test/responses/signed_message_encrypted_unsigned_assertion.xml.base64 +1 -0
  85. data/test/responses/unsigned_message_aes128_encrypted_signed_assertion.xml.base64 +1 -0
  86. data/test/responses/unsigned_message_aes192_encrypted_signed_assertion.xml.base64 +1 -0
  87. data/test/responses/unsigned_message_aes256_encrypted_signed_assertion.xml.base64 +1 -0
  88. data/test/responses/unsigned_message_des192_encrypted_signed_assertion.xml.base64 +1 -0
  89. data/test/responses/unsigned_message_encrypted_assertion_without_saml_namespace.xml.base64 +1 -0
  90. data/test/responses/unsigned_message_encrypted_signed_assertion.xml.base64 +1 -0
  91. data/test/responses/unsigned_message_encrypted_unsigned_assertion.xml.base64 +1 -0
  92. data/test/responses/valid_response.xml.base64 +1 -0
  93. data/test/saml_message_test.rb +56 -0
  94. data/test/settings_test.rb +138 -1
  95. data/test/slo_logoutrequest_test.rb +239 -28
  96. data/test/slo_logoutresponse_test.rb +93 -71
  97. data/test/test_helper.rb +138 -31
  98. data/test/utils_test.rb +129 -25
  99. data/test/xml_security_test.rb +140 -71
  100. metadata +142 -25
  101. data/test/responses/response_node_text_attack.xml.base64 +0 -1
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-saml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OneLogin LLC
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-05 00:00:00.000000000 Z
11
+ date: 2015-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: uuid
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '2.11'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.9.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.9.0
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: systemu
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -157,6 +171,7 @@ files:
157
171
  - lib/onelogin/ruby-saml/attribute_service.rb
158
172
  - lib/onelogin/ruby-saml/attributes.rb
159
173
  - lib/onelogin/ruby-saml/authrequest.rb
174
+ - lib/onelogin/ruby-saml/http_error.rb
160
175
  - lib/onelogin/ruby-saml/idp_metadata_parser.rb
161
176
  - lib/onelogin/ruby-saml/logging.rb
162
177
  - lib/onelogin/ruby-saml/logoutrequest.rb
@@ -186,10 +201,29 @@ files:
186
201
  - lib/xml_security.rb
187
202
  - ruby-saml.gemspec
188
203
  - test/certificates/certificate1
189
- - test/certificates/r1_certificate2_base64
204
+ - test/certificates/certificate_without_head_foot
205
+ - test/certificates/formatted_certificate
206
+ - test/certificates/formatted_private_key
207
+ - test/certificates/formatted_rsa_private_key
208
+ - test/certificates/invalid_certificate1
209
+ - test/certificates/invalid_certificate2
210
+ - test/certificates/invalid_certificate3
211
+ - test/certificates/invalid_private_key1
212
+ - test/certificates/invalid_private_key2
213
+ - test/certificates/invalid_private_key3
214
+ - test/certificates/invalid_rsa_private_key1
215
+ - test/certificates/invalid_rsa_private_key2
216
+ - test/certificates/invalid_rsa_private_key3
190
217
  - test/certificates/ruby-saml.crt
191
218
  - test/certificates/ruby-saml.key
192
219
  - test/idp_metadata_parser_test.rb
220
+ - test/logging_test.rb
221
+ - test/logout_requests/invalid_slo_request.xml
222
+ - test/logout_requests/slo_request.xml
223
+ - test/logout_requests/slo_request.xml.base64
224
+ - test/logout_requests/slo_request_deflated.xml.base64
225
+ - test/logout_requests/slo_request_with_session_index.xml
226
+ - test/logout_responses/logoutresponse_fixtures.rb
193
227
  - test/logoutrequest_test.rb
194
228
  - test/logoutresponse_test.rb
195
229
  - test/metadata_test.rb
@@ -200,27 +234,59 @@ files:
200
234
  - test/responses/adfs_response_sha384.xml
201
235
  - test/responses/adfs_response_sha512.xml
202
236
  - test/responses/adfs_response_xmlns.xml
237
+ - test/responses/attackxee.xml
203
238
  - test/responses/idp_descriptor.xml
204
- - test/responses/logoutresponse_fixtures.rb
239
+ - test/responses/invalids/invalid_audience.xml.base64
240
+ - test/responses/invalids/invalid_issuer_assertion.xml.base64
241
+ - test/responses/invalids/invalid_issuer_message.xml.base64
242
+ - test/responses/invalids/invalid_signature_position.xml.base64
243
+ - test/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64
244
+ - test/responses/invalids/invalid_subjectconfirmation_nb.xml.base64
245
+ - test/responses/invalids/invalid_subjectconfirmation_noa.xml.base64
246
+ - test/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64
247
+ - test/responses/invalids/multiple_assertions.xml.base64
248
+ - test/responses/invalids/multiple_signed.xml.base64
249
+ - test/responses/invalids/no_id.xml.base64
250
+ - test/responses/invalids/no_saml2.xml.base64
251
+ - test/responses/invalids/no_signature.xml.base64
252
+ - test/responses/invalids/no_status.xml.base64
253
+ - test/responses/invalids/no_status_code.xml.base64
254
+ - test/responses/invalids/no_subjectconfirmation_data.xml.base64
255
+ - test/responses/invalids/no_subjectconfirmation_method.xml.base64
256
+ - test/responses/invalids/response_encrypted_attrs.xml.base64
257
+ - test/responses/invalids/response_invalid_signed_element.xml.base64
258
+ - test/responses/invalids/status_code_responder.xml.base64
259
+ - test/responses/invalids/status_code_responer_and_msg.xml.base64
205
260
  - test/responses/no_signature_ns.xml
206
261
  - test/responses/open_saml_response.xml
207
- - test/responses/r1_response6.xml.base64
208
- - test/responses/response1.xml.base64
209
- - test/responses/response2.xml.base64
210
- - test/responses/response3.xml.base64
211
- - test/responses/response4.xml.base64
212
- - test/responses/response5.xml.base64
262
+ - test/responses/response_assertion_wrapped.xml.base64
263
+ - test/responses/response_encrypted_nameid.xml.base64
213
264
  - test/responses/response_eval.xml
214
265
  - test/responses/response_no_cert_and_encrypted_attrs.xml
215
- - test/responses/response_node_text_attack.xml.base64
266
+ - test/responses/response_unsigned_xml_base64
216
267
  - test/responses/response_with_ampersands.xml
217
268
  - test/responses/response_with_ampersands.xml.base64
218
269
  - test/responses/response_with_multiple_attribute_values.xml
270
+ - test/responses/response_with_saml2_namespace.xml.base64
271
+ - test/responses/response_with_signed_assertion.xml.base64
272
+ - test/responses/response_with_signed_assertion_2.xml.base64
273
+ - test/responses/response_with_undefined_recipient.xml.base64
274
+ - test/responses/response_without_attributes.xml.base64
275
+ - test/responses/response_wrapped.xml.base64
276
+ - test/responses/signed_message_encrypted_signed_assertion.xml.base64
277
+ - test/responses/signed_message_encrypted_unsigned_assertion.xml.base64
219
278
  - test/responses/simple_saml_php.xml
220
- - test/responses/slo_request.xml
221
279
  - test/responses/starfield_response.xml.base64
222
280
  - test/responses/test_sign.xml
223
- - test/responses/wrapped_response_2.xml.base64
281
+ - test/responses/unsigned_message_aes128_encrypted_signed_assertion.xml.base64
282
+ - test/responses/unsigned_message_aes192_encrypted_signed_assertion.xml.base64
283
+ - test/responses/unsigned_message_aes256_encrypted_signed_assertion.xml.base64
284
+ - test/responses/unsigned_message_des192_encrypted_signed_assertion.xml.base64
285
+ - test/responses/unsigned_message_encrypted_assertion_without_saml_namespace.xml.base64
286
+ - test/responses/unsigned_message_encrypted_signed_assertion.xml.base64
287
+ - test/responses/unsigned_message_encrypted_unsigned_assertion.xml.base64
288
+ - test/responses/valid_response.xml.base64
289
+ - test/saml_message_test.rb
224
290
  - test/settings_test.rb
225
291
  - test/slo_logoutrequest_test.rb
226
292
  - test/slo_logoutresponse_test.rb
@@ -248,16 +314,35 @@ required_rubygems_version: !ruby/object:Gem::Requirement
248
314
  version: '0'
249
315
  requirements: []
250
316
  rubyforge_project: http://www.rubygems.org/gems/ruby-saml
251
- rubygems_version: 2.5.1
317
+ rubygems_version: 2.4.5
252
318
  signing_key:
253
319
  specification_version: 4
254
320
  summary: SAML Ruby Tookit
255
321
  test_files:
256
322
  - test/certificates/certificate1
257
- - test/certificates/r1_certificate2_base64
323
+ - test/certificates/certificate_without_head_foot
324
+ - test/certificates/formatted_certificate
325
+ - test/certificates/formatted_private_key
326
+ - test/certificates/formatted_rsa_private_key
327
+ - test/certificates/invalid_certificate1
328
+ - test/certificates/invalid_certificate2
329
+ - test/certificates/invalid_certificate3
330
+ - test/certificates/invalid_private_key1
331
+ - test/certificates/invalid_private_key2
332
+ - test/certificates/invalid_private_key3
333
+ - test/certificates/invalid_rsa_private_key1
334
+ - test/certificates/invalid_rsa_private_key2
335
+ - test/certificates/invalid_rsa_private_key3
258
336
  - test/certificates/ruby-saml.crt
259
337
  - test/certificates/ruby-saml.key
260
338
  - test/idp_metadata_parser_test.rb
339
+ - test/logging_test.rb
340
+ - test/logout_requests/invalid_slo_request.xml
341
+ - test/logout_requests/slo_request.xml
342
+ - test/logout_requests/slo_request.xml.base64
343
+ - test/logout_requests/slo_request_deflated.xml.base64
344
+ - test/logout_requests/slo_request_with_session_index.xml
345
+ - test/logout_responses/logoutresponse_fixtures.rb
261
346
  - test/logoutrequest_test.rb
262
347
  - test/logoutresponse_test.rb
263
348
  - test/metadata_test.rb
@@ -268,27 +353,59 @@ test_files:
268
353
  - test/responses/adfs_response_sha384.xml
269
354
  - test/responses/adfs_response_sha512.xml
270
355
  - test/responses/adfs_response_xmlns.xml
356
+ - test/responses/attackxee.xml
271
357
  - test/responses/idp_descriptor.xml
272
- - test/responses/logoutresponse_fixtures.rb
358
+ - test/responses/invalids/invalid_audience.xml.base64
359
+ - test/responses/invalids/invalid_issuer_assertion.xml.base64
360
+ - test/responses/invalids/invalid_issuer_message.xml.base64
361
+ - test/responses/invalids/invalid_signature_position.xml.base64
362
+ - test/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64
363
+ - test/responses/invalids/invalid_subjectconfirmation_nb.xml.base64
364
+ - test/responses/invalids/invalid_subjectconfirmation_noa.xml.base64
365
+ - test/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64
366
+ - test/responses/invalids/multiple_assertions.xml.base64
367
+ - test/responses/invalids/multiple_signed.xml.base64
368
+ - test/responses/invalids/no_id.xml.base64
369
+ - test/responses/invalids/no_saml2.xml.base64
370
+ - test/responses/invalids/no_signature.xml.base64
371
+ - test/responses/invalids/no_status.xml.base64
372
+ - test/responses/invalids/no_status_code.xml.base64
373
+ - test/responses/invalids/no_subjectconfirmation_data.xml.base64
374
+ - test/responses/invalids/no_subjectconfirmation_method.xml.base64
375
+ - test/responses/invalids/response_encrypted_attrs.xml.base64
376
+ - test/responses/invalids/response_invalid_signed_element.xml.base64
377
+ - test/responses/invalids/status_code_responder.xml.base64
378
+ - test/responses/invalids/status_code_responer_and_msg.xml.base64
273
379
  - test/responses/no_signature_ns.xml
274
380
  - test/responses/open_saml_response.xml
275
- - test/responses/r1_response6.xml.base64
276
- - test/responses/response1.xml.base64
277
- - test/responses/response2.xml.base64
278
- - test/responses/response3.xml.base64
279
- - test/responses/response4.xml.base64
280
- - test/responses/response5.xml.base64
381
+ - test/responses/response_assertion_wrapped.xml.base64
382
+ - test/responses/response_encrypted_nameid.xml.base64
281
383
  - test/responses/response_eval.xml
282
384
  - test/responses/response_no_cert_and_encrypted_attrs.xml
283
- - test/responses/response_node_text_attack.xml.base64
385
+ - test/responses/response_unsigned_xml_base64
284
386
  - test/responses/response_with_ampersands.xml
285
387
  - test/responses/response_with_ampersands.xml.base64
286
388
  - test/responses/response_with_multiple_attribute_values.xml
389
+ - test/responses/response_with_saml2_namespace.xml.base64
390
+ - test/responses/response_with_signed_assertion.xml.base64
391
+ - test/responses/response_with_signed_assertion_2.xml.base64
392
+ - test/responses/response_with_undefined_recipient.xml.base64
393
+ - test/responses/response_without_attributes.xml.base64
394
+ - test/responses/response_wrapped.xml.base64
395
+ - test/responses/signed_message_encrypted_signed_assertion.xml.base64
396
+ - test/responses/signed_message_encrypted_unsigned_assertion.xml.base64
287
397
  - test/responses/simple_saml_php.xml
288
- - test/responses/slo_request.xml
289
398
  - test/responses/starfield_response.xml.base64
290
399
  - test/responses/test_sign.xml
291
- - test/responses/wrapped_response_2.xml.base64
400
+ - test/responses/unsigned_message_aes128_encrypted_signed_assertion.xml.base64
401
+ - test/responses/unsigned_message_aes192_encrypted_signed_assertion.xml.base64
402
+ - test/responses/unsigned_message_aes256_encrypted_signed_assertion.xml.base64
403
+ - test/responses/unsigned_message_des192_encrypted_signed_assertion.xml.base64
404
+ - test/responses/unsigned_message_encrypted_assertion_without_saml_namespace.xml.base64
405
+ - test/responses/unsigned_message_encrypted_signed_assertion.xml.base64
406
+ - test/responses/unsigned_message_encrypted_unsigned_assertion.xml.base64
407
+ - test/responses/valid_response.xml.base64
408
+ - test/saml_message_test.rb
292
409
  - test/settings_test.rb
293
410
  - test/slo_logoutrequest_test.rb
294
411
  - test/slo_logoutresponse_test.rb
@@ -1 +0,0 @@
1
- PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIElEPSJHT1NBTUxSMTI5MDExNzQ1NzE3OTQiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDEwLTExLTE4VDIxOjU3OjM3WiIgRGVzdGluYXRpb249IntyZWNpcGllbnR9Ij4NCiAgPHNhbWxwOlN0YXR1cz4NCiAgICA8c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+PC9zYW1scDpTdGF0dXM+DQogIDxzYW1sOkFzc2VydGlvbiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIFZlcnNpb249IjIuMCIgSUQ9InBmeGE0NjU3NGRmLWIzYjAtYTA2YS0yM2M4LTYzNjQxMzE5ODc3MiIgSXNzdWVJbnN0YW50PSIyMDEwLTExLTE4VDIxOjU3OjM3WiI+DQogICAgPHNhbWw6SXNzdWVyPmh0dHBzOi8vYXBwLm9uZWxvZ2luLmNvbS9zYW1sL21ldGFkYXRhLzEzNTkwPC9zYW1sOklzc3Vlcj4NCiAgICA8ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4NCiAgICAgIDxkczpTaWduZWRJbmZvPg0KICAgICAgICA8ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPg0KICAgICAgICA8ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIi8+DQogICAgICAgIDxkczpSZWZlcmVuY2UgVVJJPSIjcGZ4YTQ2NTc0ZGYtYjNiMC1hMDZhLTIzYzgtNjM2NDEzMTk4NzcyIj4NCiAgICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4NCiAgICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIvPg0KICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPg0KICAgICAgICAgIDwvZHM6VHJhbnNmb3Jtcz4NCiAgICAgICAgICA8ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz4NCiAgICAgICAgICA8ZHM6RGlnZXN0VmFsdWU+cEpRN01TL2VrNEtSUldHbXYvSDQzUmVIWU1zPTwvZHM6RGlnZXN0VmFsdWU+DQogICAgICAgIDwvZHM6UmVmZXJlbmNlPg0KICAgICAgPC9kczpTaWduZWRJbmZvPg0KICAgICAgPGRzOlNpZ25hdHVyZVZhbHVlPnlpdmVLY1BkRHB1RE5qNnNoclEzQUJ3ci9jQTNDcnlEMnBoRy94TFpzektXeFU1L21sYUt0OGV3YlpPZEtLdnRPczJwSEJ5NUR1YTNrOTRBRnp4R3llbDVnT293bW95WEpyQU9ya1BPMHZsaTFWOG8zaFBQVVp3UmdTWDZROXBTMUNxUWdoS2lFYXNSeXlscXFKVWFQWXptT3pPRTgvWGxNa3dpV21PMD08L2RzOlNpZ25hdHVyZVZhbHVlPg0KICAgICAgPGRzOktleUluZm8+DQogICAgICAgIDxkczpYNTA5RGF0YT4NCiAgICAgICAgICA8ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUJyVENDQWFHZ0F3SUJBZ0lCQVRBREJnRUFNR2N4Q3pBSkJnTlZCQVlUQWxWVE1STXdFUVlEVlFRSURBcERZV3hwWm05eWJtbGhNUlV3RXdZRFZRUUhEQXhUWVc1MFlTQk5iMjVwWTJFeEVUQVBCZ05WQkFvTUNFOXVaVXh2WjJsdU1Sa3dGd1lEVlFRRERCQmhjSEF1YjI1bGJHOW5hVzR1WTI5dE1CNFhEVEV3TURNd09UQTVOVGcwTlZvWERURTFNRE13T1RBNU5UZzBOVm93WnpFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ01Da05oYkdsbWIzSnVhV0V4RlRBVEJnTlZCQWNNREZOaGJuUmhJRTF2Ym1sallURVJNQThHQTFVRUNnd0lUMjVsVEc5bmFXNHhHVEFYQmdOVkJBTU1FR0Z3Y0M1dmJtVnNiMmRwYmk1amIyMHdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBT2pTdTFmalB5OGQ1dzRReUwxemQ0aEl3MU1ra2ZmNFdZL1RMRzhPWmtVNVlUU1dtbUhQRDVrdllINXVvWFMvNnFRODFxWHBSMndWOENUb3daSlVMZzA5ZGRSZFJuOFFzcWoxRnlPQzVzbEUzeTJiWjJvRnVhNzJvZi80OWZwdWpuRlQ2S25RNjFDQk1xbERvVFFxT1Q2MnZHSjhuUDZNWld2QTZzeHF1ZDVBZ01CQUFFd0F3WUJBQU1CQUE9PTwvZHM6WDUwOUNlcnRpZmljYXRlPg0KICAgICAgICA8L2RzOlg1MDlEYXRhPg0KICAgICAgPC9kczpLZXlJbmZvPg0KICAgIDwvZHM6U2lnbmF0dXJlPg0KICAgIDxzYW1sOlN1YmplY3Q+DQogICAgICA8c2FtbDpOYW1lSUQgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjE6bmFtZWlkLWZvcm1hdDplbWFpbEFkZHJlc3MiPnN1cHBvcnQ8IS0tIGF0dGFjayEgLS0+QG9uZWxvZ2luLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAxMC0xMS0xOFQyMjowMjozN1oiIFJlY2lwaWVudD0ie3JlY2lwaWVudH0iLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4NCiAgICA8L3NhbWw6U3ViamVjdD4NCiAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxMC0xMS0xOFQyMTo1MjozN1oiIE5vdE9uT3JBZnRlcj0iMjAxMC0xMS0xOFQyMjowMjozN1oiPg0KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgPHNhbWw6QXVkaWVuY2U+e2F1ZGllbmNlfTwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMC0xMS0xOFQyMTo1NzozN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMTAtMTEtMTlUMjE6NTc6MzdaIiBTZXNzaW9uSW5kZXg9Il81MzFjMzJkMjgzYmRmZjdlMDRlNDg3YmNkYmM0ZGQ4ZCI+DQogICAgICA8c2FtbDpBdXRobkNvbnRleHQ+DQogICAgICAgIDxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgPC9zYW1sOkF1dGhuQ29udGV4dD4NCiAgICA8L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+DQogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9InN1cm5hbWUiPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnM8IS0tIGF0dGFjayEgLS0+bWl0aDwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0iYW5vdGhlcl92YWx1ZSI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+dmFsdWUxPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnZhbHVlMjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0icm9sZSI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+cm9sZTE8L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICA8L3NhbWw6QXR0cmlidXRlPg0KICAgIDwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+DQogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9ImZpcnN0bmFtZSI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+Ym9iPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4gIA0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9ImF0dHJpYnV0ZV93aXRoX25pbF92YWx1ZSI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOm5pbD0idHJ1ZSIvPg0KICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJhdHRyaWJ1dGVfd2l0aF9uaWxzX2FuZF9lbXB0eV9zdHJpbmdzIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUvPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZT52YWx1ZVByZXNlbnQ8L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOm5pbD0idHJ1ZSIvPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpuaWw9IjEiLz4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+