braintree 1.1.3 → 1.2.0

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 (30) hide show
  1. data/lib/braintree.rb +2 -0
  2. data/lib/braintree/advanced_search.rb +69 -0
  3. data/lib/braintree/configuration.rb +2 -2
  4. data/lib/braintree/credit_card.rb +2 -1
  5. data/lib/braintree/subscription.rb +50 -1
  6. data/lib/braintree/subscription_search.rb +10 -0
  7. data/lib/braintree/transparent_redirect.rb +8 -5
  8. data/lib/braintree/version.rb +2 -2
  9. data/lib/braintree/xml/generator.rb +7 -2
  10. data/lib/ssl/{valicert_ca.crt → sandbox_braintreegateway_com.ca.crt} +1 -0
  11. data/lib/ssl/www_braintreegateway_com.ca.crt +202 -0
  12. data/spec/integration/braintree/credit_card_spec.rb +27 -35
  13. data/spec/integration/braintree/customer_spec.rb +37 -36
  14. data/spec/integration/braintree/http_spec.rb +17 -0
  15. data/spec/integration/braintree/subscription_spec.rb +244 -3
  16. data/spec/integration/braintree/transaction_spec.rb +9 -18
  17. data/spec/integration/braintree/transparent_redirect_spec.rb +21 -0
  18. data/spec/integration/spec_helper.rb +0 -23
  19. data/spec/spec_helper.rb +34 -0
  20. data/spec/support/matchers/include_on_any_page.rb +24 -0
  21. data/spec/unit/braintree/configuration_spec.rb +3 -3
  22. data/spec/unit/braintree/credit_card_spec.rb +1 -1
  23. data/spec/unit/braintree/customer_spec.rb +1 -1
  24. data/spec/unit/braintree/paged_collection_spec.rb +50 -0
  25. data/spec/unit/braintree/subscription_search_spec.rb +35 -0
  26. data/spec/unit/braintree/subscription_spec.rb +10 -0
  27. data/spec/unit/braintree/transaction_spec.rb +1 -1
  28. data/spec/unit/braintree/transparent_redirect_spec.rb +8 -2
  29. data/spec/unit/braintree/xml_spec.rb +5 -0
  30. metadata +11 -5
@@ -23,6 +23,7 @@ require "braintree/exceptions"
23
23
  require "braintree/base_module"
24
24
 
25
25
  require "braintree/address.rb"
26
+ require "braintree/advanced_search.rb"
26
27
  require "braintree/configuration.rb"
27
28
  require "braintree/credit_card.rb"
28
29
  require "braintree/credit_card_verification.rb"
@@ -35,6 +36,7 @@ require "braintree/http.rb"
35
36
  require "braintree/paged_collection.rb"
36
37
  require "braintree/ssl_expiration_check.rb"
37
38
  require "braintree/subscription"
39
+ require "braintree/subscription_search"
38
40
  require "braintree/successful_result.rb"
39
41
  require "braintree/test/credit_card_numbers.rb"
40
42
  require "braintree/test/transaction_amounts.rb"
@@ -0,0 +1,69 @@
1
+ module Braintree
2
+ class AdvancedSearch
3
+ class SearchNode
4
+ def self.operators(*operator_names)
5
+ operator_names.each do |operator|
6
+ define_method(operator) do |value|
7
+ @parent.add_criteria(@node_name, operator => value.to_s)
8
+ end
9
+ end
10
+ end
11
+
12
+ def initialize(name, parent)
13
+ @node_name, @parent = name, parent
14
+ end
15
+ end
16
+
17
+ class TextNode < SearchNode
18
+ operators :is, :is_not, :ends_with, :starts_with, :contains
19
+ end
20
+
21
+ class MultipleValueNode < SearchNode
22
+ def in(*values)
23
+ values.flatten!
24
+
25
+ unless allowed_values.nil?
26
+ bad_values = values - allowed_values
27
+ raise ArgumentError.new("Invalid argument(s) for #{@node_name}: #{bad_values.join(", ")}") if bad_values.any?
28
+ end
29
+
30
+ @parent.add_criteria(@node_name, values)
31
+ end
32
+
33
+ def initialize(name, parent, options)
34
+ super(name, parent)
35
+ @options = options
36
+ end
37
+
38
+ def allowed_values
39
+ @options[:allows]
40
+ end
41
+ end
42
+
43
+ def self.search_fields(*fields)
44
+ fields.each do |field|
45
+ define_method(field) do
46
+ TextNode.new(field, self)
47
+ end
48
+ end
49
+ end
50
+
51
+ def self.multiple_value_field(field, options={})
52
+ define_method(field) do
53
+ MultipleValueNode.new(field, self, options)
54
+ end
55
+ end
56
+
57
+ def initialize
58
+ @criteria = {}
59
+ end
60
+
61
+ def add_criteria(key, value)
62
+ @criteria[key] = value
63
+ end
64
+
65
+ def to_hash
66
+ @criteria
67
+ end
68
+ end
69
+ end
@@ -37,9 +37,9 @@ module Braintree
37
37
  def self.ca_file # :nodoc:
38
38
  case environment
39
39
  when :qa, :sandbox
40
- File.expand_path(File.join(File.dirname(__FILE__), "..", "ssl", "valicert_ca.crt"))
40
+ File.expand_path(File.join(File.dirname(__FILE__), "..", "ssl", "sandbox_braintreegateway_com.ca.crt"))
41
41
  when :production
42
- File.expand_path(File.join(File.dirname(__FILE__), "..", "ssl", "securetrust_ca.crt"))
42
+ File.expand_path(File.join(File.dirname(__FILE__), "..", "ssl", "www_braintreegateway_com.ca.crt"))
43
43
  end
44
44
  end
45
45
 
@@ -3,7 +3,7 @@ module Braintree
3
3
  include BaseModule # :nodoc:
4
4
 
5
5
  attr_reader :billing_address, :bin, :card_type, :cardholder_name, :created_at, :customer_id, :expiration_month,
6
- :expiration_year, :last_4, :token, :updated_at
6
+ :expiration_year, :last_4, :subscriptions, :token, :updated_at
7
7
 
8
8
  def self.create(attributes)
9
9
  if attributes.has_key?(:expiration_date) && (attributes.has_key?(:expiration_month) || attributes.has_key?(:expiration_year))
@@ -99,6 +99,7 @@ module Braintree
99
99
 
100
100
  def initialize(attributes) # :nodoc:
101
101
  _init attributes
102
+ @subscriptions = (@subscriptions || []).map { |subscription_hash| Subscription.new(subscription_hash) }
102
103
  end
103
104
 
104
105
  # Creates a credit transaction for this credit card.
@@ -1,4 +1,25 @@
1
1
  module Braintree
2
+ # == Creating a Subscription
3
+ #
4
+ # At minimum, a plan_id and payment_method_token are required. Any other values not
5
+ # provided will be defaulted to the plan's values:
6
+ #
7
+ # Braintree::Subscription.create(
8
+ # :payment_method_token => "my_token",
9
+ # :plan_id => "my_plan"
10
+ # )
11
+ #
12
+ # Full example:
13
+ #
14
+ # Braintree::Subscription.create(
15
+ # :id => "my_id",
16
+ # :payment_method_token => "my_token",
17
+ # :plan_id => "my_plan",
18
+ # :price => "1.00",
19
+ # :trial_period => true,
20
+ # :trial_duration => "2",
21
+ # :trial_duration_unit => Subscription::TrialDurationUnit::Day
22
+ # )
2
23
  class Subscription
3
24
  include BaseModule
4
25
 
@@ -13,7 +34,7 @@ module Braintree
13
34
  Month = "month"
14
35
  end
15
36
 
16
- attr_reader :price, :plan_id, :id, :status, :payment_method_token
37
+ attr_reader :price, :plan_id, :id, :status, :payment_method_token, :merchant_account_id
17
38
  attr_reader :first_billing_date, :next_billing_date, :billing_period_start_date, :billing_period_end_date
18
39
  attr_reader :trial_period, :trial_duration, :trial_duration_unit
19
40
  attr_reader :failure_count
@@ -46,6 +67,32 @@ module Braintree
46
67
  raise NotFoundError, "subscription with id #{id.inspect} not found"
47
68
  end
48
69
 
70
+ # Allows searching on subscriptions. There are two types of fields that are searchable: text and
71
+ # multiple value fields. Searchable text fields are:
72
+ # - plan_id
73
+ # - days_past_due
74
+ #
75
+ # Searchable multiple value fields are:
76
+ # - status
77
+ #
78
+ # For text fields, you can search using the following operators: is, is_not, starts_with, ends_with
79
+ # and contains. For mutiple value fields, you can search using the in operator. An example:
80
+ #
81
+ # Subscription.search do |s|
82
+ # s.plan_id.starts_with "abc"
83
+ # s.days_past_due.is "30"
84
+ # s.status.in [Subscription::Status::PastDue]
85
+ # end
86
+ def self.search(page=1, &block)
87
+ search = SubscriptionSearch.new
88
+ block.call(search)
89
+
90
+ response = Http.post "/subscriptions/advanced_search?page=#{page}", {:search => search.to_hash}
91
+ attributes = response[:subscriptions]
92
+ attributes[:items] = Util.extract_attribute_as_array(attributes, :subscription).map { |attrs| new(attrs) }
93
+ PagedCollection.new(attributes) { |page_number| Subscription.search(page_number, &block) }
94
+ end
95
+
49
96
  def self.update(subscription_id, attributes)
50
97
  Util.verify_keys(_update_signature, attributes)
51
98
  response = Http.put "/subscriptions/#{subscription_id}", :subscription => attributes
@@ -61,6 +108,7 @@ module Braintree
61
108
  def self._create_signature # :nodoc:
62
109
  [
63
110
  :id,
111
+ :merchant_account_id,
64
112
  :payment_method_token,
65
113
  :plan_id,
66
114
  :price,
@@ -100,6 +148,7 @@ module Braintree
100
148
  def self._update_signature # :nodoc:
101
149
  [
102
150
  :id,
151
+ :merchant_account_id,
103
152
  :plan_id,
104
153
  :price
105
154
  ]
@@ -0,0 +1,10 @@
1
+ module Braintree
2
+ class SubscriptionSearch < AdvancedSearch
3
+ search_fields :plan_id, :days_past_due
4
+ multiple_value_field :status, :allows => [
5
+ Subscription::Status::Active,
6
+ Subscription::Status::Canceled,
7
+ Subscription::Status::PastDue
8
+ ]
9
+ end
10
+ end
@@ -41,12 +41,15 @@ module Braintree
41
41
  def self.parse_and_validate_query_string(query_string) # :nodoc:
42
42
  params = Util.symbolize_keys(Util.parse_query_string(query_string))
43
43
  query_string_without_hash = query_string[/(.*)&hash=.*/, 1]
44
+
45
+ if params[:http_status] == nil
46
+ raise UnexpectedError, "expected query string to have an http_status param"
47
+ elsif params[:http_status] != '200'
48
+ Util.raise_exception_for_status_code(params[:http_status])
49
+ end
50
+
44
51
  if _hash(query_string_without_hash) == params[:hash]
45
- if params[:http_status] == '200'
46
- params
47
- else
48
- Util.raise_exception_for_status_code(params[:http_status])
49
- end
52
+ params
50
53
  else
51
54
  raise ForgedQueryString
52
55
  end
@@ -1,8 +1,8 @@
1
1
  module Braintree
2
2
  module Version
3
3
  Major = 1
4
- Minor = 1
5
- Tiny = 3
4
+ Minor = 2
5
+ Tiny = 0
6
6
 
7
7
  String = "#{Major}.#{Minor}.#{Tiny}"
8
8
  end
@@ -62,7 +62,6 @@ module Braintree
62
62
  end
63
63
 
64
64
  def self._array_to_xml(array, options = {})
65
- raise "expected all elements to be hashes" unless array.all? { |e| e.is_a?(Hash) }
66
65
  raise "expected options[:root]" unless options[:root]
67
66
  raise "expected options[:builder]" unless options[:builder]
68
67
  options[:indent] ||= 2
@@ -71,7 +70,13 @@ module Braintree
71
70
  options[:builder].tag!(root, :type => "array")
72
71
  else
73
72
  options[:builder].tag!(root, :type => "array") do
74
- array.each { |e| _convert_to_xml(e, options.merge(:root => "item", :skip_instruct => true)) }
73
+ array.each do |e|
74
+ if e.is_a?(Hash)
75
+ _convert_to_xml(e, options.merge(:root => "item", :skip_instruct => true))
76
+ else
77
+ options[:builder].tag!("item", e)
78
+ end
79
+ end
75
80
  end
76
81
  end
77
82
  end
@@ -1,3 +1,4 @@
1
+ Subject: L=ValiCert Validation Network, O=ValiCert, Inc., OU=ValiCert Class 2 Policy Validation Authority, CN=http://www.valicert.com//emailAddress=info@valicert.com
1
2
  -----BEGIN CERTIFICATE-----
2
3
  MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
3
4
  IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
@@ -0,0 +1,202 @@
1
+ Subject: O=Entrust.net, OU=www.entrust.net/GCCA_CPS incorp. by ref. (limits liab.), OU=(c) 2000 Entrust.net Limited, CN=Entrust.net Client Certification Authority
2
+ -----BEGIN CERTIFICATE-----
3
+ MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UE
4
+ ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NB
5
+ X0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT
6
+ HChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1
7
+ c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAy
8
+ MDcxNjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0
9
+ Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29y
10
+ cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg
11
+ RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xp
12
+ ZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
13
+ A4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTU
14
+ rcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB
15
+ 3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn5JVn1j+SgF7y
16
+ NH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNVHR8E
17
+ gdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAw
18
+ PgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy
19
+ ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0
20
+ Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2Vy
21
+ dGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
22
+ IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQD
23
+ AgEGMB8GA1UdIwQYMBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQW
24
+ BBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2
25
+ fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWA
26
+ O9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+L
27
+ a3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7l
28
+ TRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKdzmVml64mXg==
29
+ -----END CERTIFICATE-----
30
+
31
+ Subject: O=Entrust.net, OU=www.entrust.net/SSL_CPS incorp. by ref. (limits liab.), OU=(c) 2000 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority
32
+ -----BEGIN CERTIFICATE-----
33
+ MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UE
34
+ ChMLRW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xf
35
+ Q1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
36
+ KGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVz
37
+ dC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
38
+ Fw0wMDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtF
39
+ bnRydXN0Lm5ldDE/MD0GA1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMg
40
+ aW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykg
41
+ MjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5l
42
+ dCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0G
43
+ CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUw
44
+ tZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxK
45
+ wz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2dWcTC5/oVzbI
46
+ XQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEBBAQD
47
+ AgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0Vu
48
+ dHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp
49
+ bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAy
50
+ MDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0
51
+ IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV
52
+ BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIw
53
+ NDE3NTAwMFowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc
54
+ /vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNV
55
+ HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkq
56
+ hkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvv
57
+ yQbvH9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVp
58
+ bbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/
59
+ bIkz8OwVDw==
60
+ -----END CERTIFICATE-----
61
+
62
+ Subject: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)
63
+ -----BEGIN CERTIFICATE-----
64
+ MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UE
65
+ ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNf
66
+ MjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT
67
+ HChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1
68
+ c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEy
69
+ MjQxNzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0
70
+ Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29y
71
+ cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkg
72
+ RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2Vy
73
+ dGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEF
74
+ AAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4
75
+ QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/EC
76
+ DNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuXMlBvPci6Zgzj
77
+ /L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzWnLLP
78
+ KQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZd
79
+ enoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
80
+ 4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB
81
+ 0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJ
82
+ FrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
83
+ AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFh
84
+ fGPjK50xA3B20qMooPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVU
85
+ KcgF7bISKo30Axv/55IQh7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaoho
86
+ wXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2
87
+ +z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof888
88
+ 6ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
89
+ -----END CERTIFICATE-----
90
+
91
+ Subject: C=US, O=Entrust.net, OU=www.entrust.net/Client_CA_Info/CPS incorp. by ref. limits liab., OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Client Certification Authority
92
+ -----BEGIN CERTIFICATE-----
93
+ MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UE
94
+ BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50
95
+ cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBs
96
+ aW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExp
97
+ bWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0
98
+ aW9uIEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBa
99
+ MIHJMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNV
100
+ BAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3Jw
101
+ LiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50
102
+ cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50
103
+ IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GL
104
+ ADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSv
105
+ x1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux5zDeg7K6PvHV
106
+ iTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTmT173
107
+ iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkw
108
+ ggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50
109
+ cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0Ff
110
+ SW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UE
111
+ CxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50
112
+ cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYD
113
+ VQQDEwRDUkwxMCygKqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9D
114
+ bGllbnQxLmNybDArBgNVHRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkx
115
+ MDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW
116
+ /O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwG
117
+ A1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
118
+ hvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQ
119
+ OokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzzwy5E97BnRqqS5TvaHBkU
120
+ ODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYGJqibGapE
121
+ PHayXOw=
122
+ -----END CERTIFICATE-----
123
+
124
+ Subject: C=US, O=Entrust.net, OU=www.entrust.net/CPS incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Secure Server Certification Authority
125
+ -----BEGIN CERTIFICATE-----
126
+ MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UE
127
+ BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50
128
+ cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
129
+ MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE
130
+ AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1
131
+ dGhvcml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQsw
132
+ CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3
133
+ dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh
134
+ Yi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTow
135
+ OAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
136
+ b24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0
137
+ VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHIN
138
+ iC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3wkrYKZImZNHk
139
+ mGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcwggHT
140
+ MBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHY
141
+ pIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
142
+ BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChs
143
+ aW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBM
144
+ aW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
145
+ cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNo
146
+ dHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAi
147
+ gA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMC
148
+ AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYE
149
+ FPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9
150
+ B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKn
151
+ CqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2Zcgx
152
+ xufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd2cNgQ4xYDiKWL2KjLB+6
153
+ rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
154
+ -----END CERTIFICATE-----
155
+
156
+ Subject: C=US, O=SecureTrust Corporation, CN=SecureTrust CA
157
+ -----BEGIN CERTIFICATE-----
158
+ MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
159
+ MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
160
+ FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
161
+ MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
162
+ cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
163
+ AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
164
+ Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
165
+ 0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
166
+ wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
167
+ 7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
168
+ 8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
169
+ BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
170
+ /zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
171
+ JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
172
+ NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
173
+ 6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
174
+ 3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
175
+ D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
176
+ CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
177
+ 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
178
+ -----END CERTIFICATE-----
179
+
180
+ Subject: C=US, O=SecureTrust Corporation, CN=Secure Global CA
181
+ -----BEGIN CERTIFICATE-----
182
+ MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
183
+ MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
184
+ GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
185
+ MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
186
+ Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
187
+ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
188
+ iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
189
+ /FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
190
+ jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
191
+ HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
192
+ sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
193
+ gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
194
+ MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
195
+ KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
196
+ AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
197
+ URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
198
+ H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
199
+ I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
200
+ iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
201
+ f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
202
+ -----END CERTIFICATE-----