ex_ua 0.1.1 → 0.1.2

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 (26) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/ex_ua.gemspec +3 -5
  4. data/lib/ex_ua/category.rb +3 -1
  5. data/lib/ex_ua/client.rb +15 -8
  6. data/lib/ex_ua/item.rb +20 -4
  7. data/lib/ex_ua/version.rb +1 -1
  8. data/spec/category_spec.rb +22 -11
  9. data/spec/item_spec.rb +36 -0
  10. metadata +6 -34
  11. data/fixtures/vcr_cassettes/ExUA_Category.yml +0 -151
  12. data/fixtures/vcr_cassettes/ExUA_Client.yml +0 -194
  13. data/spec/cassettes/ExUA_Category/general_1_page_category/_categories/has_current_category_as_a_parent_category_for_all_childs.yml +0 -366
  14. data/spec/cassettes/ExUA_Category/general_1_page_category/_categories/returns_list_of_child_categories.yml +0 -366
  15. data/spec/cassettes/ExUA_Category/general_1_page_category/canonical_url/.yml +0 -366
  16. data/spec/cassettes/ExUA_Category/general_1_page_category/description/.yml +0 -366
  17. data/spec/cassettes/ExUA_Category/general_1_page_category/items/.yml +0 -366
  18. data/spec/cassettes/ExUA_Category/general_1_page_category/name/.yml +0 -366
  19. data/spec/cassettes/ExUA_Category/general_1_page_category/next_/.yml +0 -366
  20. data/spec/cassettes/ExUA_Category/general_1_page_category/prev_/.yml +0 -366
  21. data/spec/cassettes/ExUA_Category/general_few_pages_category/_next/returns_a_category_with_same_url_but_different_page_number.yml +0 -555
  22. data/spec/cassettes/ExUA_Category/general_few_pages_category/_prev/raises_error_when_no_prev_url_found.yml +0 -555
  23. data/spec/cassettes/ExUA_Category/item_category/picture/.yml +0 -555
  24. data/spec/cassettes/ExUA_Client/_available_languages/returns_list_of_available_languages.yml +0 -194
  25. data/spec/cassettes/ExUA_Client/_search/returns_20_results_by_default.yml +0 -620
  26. data/spec/cassettes/ExUA_Client/_search/returns_list_of_categories.yml +0 -1233
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 38716e7eb3d61afd1b73ea1ac09bd9bf2f1f13c4
4
- data.tar.gz: 47ead9b6d1b28cc6f13bc6c0d6d563726342ca39
3
+ metadata.gz: acb906012343c1b591485c34e4f16c8d4d505038
4
+ data.tar.gz: 2d3d0f7f0068061c4c7a65690d5c5955ac6c55bb
5
5
  SHA512:
6
- metadata.gz: 1a57dcd9303152db33a67c12e1f484e8a0f9d0333b7232afd9f6a142c9eec9b86d1cdae133c23654572b8e7840ae997f898a28ffff26662a81769eda8bf4ecb8
7
- data.tar.gz: 23fb6bd56c351c2f55c3754ee4b405e2b9c5212b1f4e394206e8676d8df45220aceab7acc42f604dd23f08ebcf4ad2c6de8a294392be84ea4979645eb0d9df42
6
+ metadata.gz: f2ee3595dcf7d471b62ca53393dcb68da42b95c757a701b1312895d25857722cc0ae9c8e66a328ba128ad0ab2b07db6b2c017270c3e50feb68396dacd393258f
7
+ data.tar.gz: 6a191afbf4418a3edd3239a4ecf437c21b477449c25db68d82127402133360777858bf4db1e2b7a8e5bc3599aa1730cea56dc8ebe4b1a2d5736c12ac86a86fdc
data/README.md CHANGED
@@ -20,7 +20,7 @@ Example usage
20
20
  category = base_categories.first # Select first category (usually video)
21
21
  sub_categories = category.categories # Select sub-categories of a category
22
22
  example_video_category = sub_categories.first.categories.first
23
- download_items = example_video_category.items # Here you'll have an array of download items in a given category with #download_uri
23
+ download_items = example_video_category.items # Here you'll have an array of download items in a given category with #load_uri
24
24
 
25
25
 
26
26
  Search
data/ex_ua.gemspec CHANGED
@@ -7,14 +7,12 @@ Gem::Specification.new do |s|
7
7
  s.version = ExUa::VERSION
8
8
  s.authors = ["Andriy Dmytrenko"]
9
9
  s.email = ["refresh.xss@gmail.com"]
10
- s.homepage = ""
10
+ s.homepage = "https://github.com/Antti/ex_ua"
11
11
  s.summary = %q{An http://ex.ua/ API}
12
12
  s.description = %q{Ruby API for ex.ua}
13
13
 
14
- s.rubyforge_project = "ex_ua"
15
-
16
- s.files = `git ls-files`.split("\n")
17
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ s.files = `git ls-files | grep -v spec/cassettes`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/* | grep -v spec/cassettes`.split("\n")
18
16
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
17
  s.require_paths = ["lib"]
20
18
  s.license = 'MIT'
@@ -93,6 +93,8 @@ module ExUA
93
93
  uri.query_values["p"].to_i
94
94
  end
95
95
 
96
+ # Category's path
97
+ # @return [String]
96
98
  def path
97
99
  uri.path
98
100
  end
@@ -104,7 +106,7 @@ module ExUA
104
106
  table_rows.map do |tr|
105
107
  tr.search("a[title!='']")
106
108
  end.reject(&:empty?).map do |links|
107
- Item.parse_links(links)
109
+ Item.parse(links)
108
110
  end
109
111
  end
110
112
 
data/lib/ex_ua/client.rb CHANGED
@@ -4,20 +4,21 @@ require 'singleton'
4
4
  require 'addressable/uri'
5
5
 
6
6
  module ExUA
7
- # Client for ExUA
8
- # @example Usage
9
- # client = ExUA::Client.new
10
- # categories = client.base_categories('ru')
11
- #
12
7
  class ExUAFetcher
13
8
  include HTTParty
14
9
  no_follow true
10
+ # Returns the redirect target for a given uri
15
11
  def self.get_redirect(uri)
16
12
  get Addressable::URI.parse(uri).normalize.to_s
17
13
  rescue HTTParty::RedirectionTooDeep => e
18
14
  e.response["location"]
19
15
  end
20
16
  end
17
+ # Client for ExUA
18
+ # @example Usage
19
+ # client = ExUA::Client.new
20
+ # categories = client.base_categories('ru')
21
+ #
21
22
  class Client
22
23
  include Singleton
23
24
  KNOWN_BASE_CATEGORIES = %w[video audio images texts games software]
@@ -40,9 +41,15 @@ module ExUA
40
41
  # client.base_categories('ru')
41
42
  # @return [Array<ExUA::Category>]
42
43
  def base_categories(lang)
43
- KNOWN_BASE_CATEGORIES.map{|cat| Category.new(url: "/#{lang}/#{cat}")}
44
+ base_categories_names.map{|cat| Category.new(url: "/#{lang}/#{cat}")}
44
45
  end
45
46
 
47
+ # Search for a given @text
48
+ # @param[String] text A term to search for
49
+ # @param[Integer] page Page number, starting from 0
50
+ # @param[Integer] per Items per page. Defaults to 20
51
+ # @return[Array<ExUA::Category>] list of categories
52
+
46
53
  def search(text, page=0, per=20)
47
54
  uri = Addressable::URI.parse("/search?#{Addressable::URI.form_encode(s: text, p: page, per: per)}")
48
55
  page = get(uri)
@@ -53,8 +60,8 @@ module ExUA
53
60
  end
54
61
  end
55
62
 
56
- def get(request_uri)
57
- Nokogiri.parse(HTTParty.get(Addressable::URI.join(ExUA::BASE_URL,request_uri).to_s).body)
63
+ def get(path)
64
+ Nokogiri.parse(HTTParty.get(Addressable::URI.join(ExUA::BASE_URL,path).to_s).body)
58
65
  end
59
66
 
60
67
  private
data/lib/ex_ua/item.rb CHANGED
@@ -3,7 +3,7 @@ require 'addressable/uri'
3
3
  module ExUA
4
4
  # Download item
5
5
  class Item < Struct.new(:id, :title, :additional_servers)
6
- def self.parse_links(links)
6
+ def self.parse(links)
7
7
  self.new.tap do |item|
8
8
  links.each { |link|
9
9
  case link.attributes["href"].value
@@ -19,14 +19,29 @@ module ExUA
19
19
  end
20
20
 
21
21
  # Queries ex.ua to get a real url to fetch data from (follows redirect)
22
+ # URI with content-disposition: attachment
22
23
  def retrieve_real_load_url
23
- retrieve_real_url(download_uri)
24
+ retrieve_real_url(load_uri)
24
25
  end
25
26
 
26
27
  def retrieve_real_get_url
27
28
  retrieve_real_url(get_uri)
28
29
  end
29
30
 
31
+ # @params[String, File] save_to Optional. File location to save content to
32
+ # @return[HTTParty::Response] Response
33
+ def download(save_to=nil)
34
+ response = HTTParty.get(retrieve_real_get_url)
35
+ File.write(save_to, response.body) if save_to
36
+ response
37
+ end
38
+
39
+ # Returns response with headers(includes content-type, content-lenght)
40
+ # @return[HTTParty::Response]
41
+ def head
42
+ @head ||= HTTParty.head(retrieve_real_get_url)
43
+ end
44
+
30
45
  # Actual download url with ex.ua included
31
46
  # You can add ?fs_id=server_id param to download form #additional_servers
32
47
  # @return[Addressable::URI]
@@ -35,8 +50,9 @@ module ExUA
35
50
  @get_url ||= Addressable::URI.join(ExUA::BASE_URL,"/get/#{self.id}")
36
51
  end
37
52
 
38
- def download_uri
39
- @downoadload_url ||= Addressable::URI.join(ExUA::BASE_URL, "/load/#{self.id}")
53
+ # URI with content-disposition: attachment
54
+ def load_uri
55
+ @load_url ||= Addressable::URI.join(ExUA::BASE_URL, "/load/#{self.id}")
40
56
  end
41
57
 
42
58
  private
data/lib/ex_ua/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module ExUa
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -19,24 +19,35 @@ describe ExUA::Category, :vcr => true do
19
19
  its(:uri){should eq(Addressable::URI.parse('http://www.ex.ua/ru/video'))}
20
20
  end
21
21
  context "general few pages category" do
22
- subject{ExUA::Category.new(url: '/ru/video/foreign')}
23
- describe '#next' do
24
- it 'returns a category with same url, but different page number' do
25
- subject.next.uri.request_uri.should eq('/ru/video/foreign?p=1')
22
+ context "on third page" do
23
+ subject{ExUA::Category.new(url: '/ru/video/foreign?p=2')}
24
+ describe '#prev' do
25
+ it 'returns a category with same url, but previous page number' do
26
+ expect(subject.prev.uri.request_uri).to eq('/ru/video/foreign?p=1')
27
+ end
26
28
  end
27
- end
28
- describe '#prev' do
29
- it 'returns a category with same url, but different page number' do
30
- pending 'find a page with prev'
31
- expect(subject.prev.uri).to eq('')
29
+ describe '#next' do
30
+ it 'returns a category with same url, but different page number' do
31
+ subject.next.uri.request_uri.should eq('/ru/video/foreign?p=3')
32
+ end
32
33
  end
33
- it 'raises error when no prev url found' do
34
- expect{subject.prev}.to raise_error(ExUA::Category::NotFound)
34
+ end
35
+ context "on a first page" do
36
+ subject{ExUA::Category.new(url: '/ru/video/foreign')}
37
+ describe '#prev' do
38
+ it 'raises error when no prev url found' do
39
+ expect{subject.prev}.to raise_error(ExUA::Category::NotFound)
40
+ end
35
41
  end
36
42
  end
37
43
  end
38
44
  context "item category" do
39
45
  subject{ExUA::Category.new(url: '/71902463')}
40
46
  its(:picture){should_not be_nil}
47
+ describe '#items' do
48
+ it 'has an array of items' do
49
+ subject.items.size.should_not eq(0)
50
+ end
51
+ end
41
52
  end
42
53
  end
data/spec/item_spec.rb ADDED
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ require 'tempfile'
3
+
4
+ describe ExUA::Item, vcr: true do
5
+ let(:id) {68579769}
6
+ subject{ExUA::Item.new(id)}
7
+ describe '#download' do
8
+ let(:tmp_file) { Tempfile.new('foo')}
9
+ let(:png_header) {[137, 80, 78, 71, 13, 10, 26, 10] }
10
+ after(:each) do
11
+ tmp_file.unlink
12
+ end
13
+ it 'returns response with content-type' do
14
+ subject.download.content_type.should eq('image/png')
15
+ end
16
+ it 'returns response with content of a file' do
17
+ subject.download.body[0..7].bytes.to_a.should eq png_header
18
+ end
19
+ it 'saves content to a file' do
20
+ subject.download(tmp_file)
21
+ tmp_file.read[0..7].bytes.to_a.should eq png_header
22
+ end
23
+ end
24
+ describe '#head' do
25
+ it 'has content-type' do
26
+ subject.head.content_type.should eq('image/png')
27
+ end
28
+ it 'has content-length' do
29
+ subject.head.content_length.should_not be_nil
30
+ end
31
+ end
32
+ its(:get_uri){should eq Addressable::URI.parse("http://www.ex.ua/get/#{id}")}
33
+ its(:load_uri){should eq Addressable::URI.parse("http://www.ex.ua/load/#{id}")}
34
+ describe '#retrieve_real_load_url'
35
+ describe '#retrieve_real_get_url'
36
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ex_ua
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andriy Dmytrenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-16 00:00:00.000000000 Z
11
+ date: 2013-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -121,31 +121,16 @@ files:
121
121
  - README.md
122
122
  - Rakefile
123
123
  - ex_ua.gemspec
124
- - fixtures/vcr_cassettes/ExUA_Category.yml
125
- - fixtures/vcr_cassettes/ExUA_Client.yml
126
124
  - lib/ex_ua.rb
127
125
  - lib/ex_ua/category.rb
128
126
  - lib/ex_ua/client.rb
129
127
  - lib/ex_ua/item.rb
130
128
  - lib/ex_ua/version.rb
131
- - spec/cassettes/ExUA_Category/general_1_page_category/_categories/has_current_category_as_a_parent_category_for_all_childs.yml
132
- - spec/cassettes/ExUA_Category/general_1_page_category/_categories/returns_list_of_child_categories.yml
133
- - spec/cassettes/ExUA_Category/general_1_page_category/canonical_url/.yml
134
- - spec/cassettes/ExUA_Category/general_1_page_category/description/.yml
135
- - spec/cassettes/ExUA_Category/general_1_page_category/items/.yml
136
- - spec/cassettes/ExUA_Category/general_1_page_category/name/.yml
137
- - spec/cassettes/ExUA_Category/general_1_page_category/next_/.yml
138
- - spec/cassettes/ExUA_Category/general_1_page_category/prev_/.yml
139
- - spec/cassettes/ExUA_Category/general_few_pages_category/_next/returns_a_category_with_same_url_but_different_page_number.yml
140
- - spec/cassettes/ExUA_Category/general_few_pages_category/_prev/raises_error_when_no_prev_url_found.yml
141
- - spec/cassettes/ExUA_Category/item_category/picture/.yml
142
- - spec/cassettes/ExUA_Client/_available_languages/returns_list_of_available_languages.yml
143
- - spec/cassettes/ExUA_Client/_search/returns_20_results_by_default.yml
144
- - spec/cassettes/ExUA_Client/_search/returns_list_of_categories.yml
145
129
  - spec/category_spec.rb
146
130
  - spec/client_spec.rb
131
+ - spec/item_spec.rb
147
132
  - spec/spec_helper.rb
148
- homepage: ''
133
+ homepage: https://github.com/Antti/ex_ua
149
134
  licenses:
150
135
  - MIT
151
136
  metadata: {}
@@ -164,26 +149,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
164
149
  - !ruby/object:Gem::Version
165
150
  version: '0'
166
151
  requirements: []
167
- rubyforge_project: ex_ua
152
+ rubyforge_project:
168
153
  rubygems_version: 2.0.3
169
154
  signing_key:
170
155
  specification_version: 4
171
156
  summary: An http://ex.ua/ API
172
157
  test_files:
173
- - spec/cassettes/ExUA_Category/general_1_page_category/_categories/has_current_category_as_a_parent_category_for_all_childs.yml
174
- - spec/cassettes/ExUA_Category/general_1_page_category/_categories/returns_list_of_child_categories.yml
175
- - spec/cassettes/ExUA_Category/general_1_page_category/canonical_url/.yml
176
- - spec/cassettes/ExUA_Category/general_1_page_category/description/.yml
177
- - spec/cassettes/ExUA_Category/general_1_page_category/items/.yml
178
- - spec/cassettes/ExUA_Category/general_1_page_category/name/.yml
179
- - spec/cassettes/ExUA_Category/general_1_page_category/next_/.yml
180
- - spec/cassettes/ExUA_Category/general_1_page_category/prev_/.yml
181
- - spec/cassettes/ExUA_Category/general_few_pages_category/_next/returns_a_category_with_same_url_but_different_page_number.yml
182
- - spec/cassettes/ExUA_Category/general_few_pages_category/_prev/raises_error_when_no_prev_url_found.yml
183
- - spec/cassettes/ExUA_Category/item_category/picture/.yml
184
- - spec/cassettes/ExUA_Client/_available_languages/returns_list_of_available_languages.yml
185
- - spec/cassettes/ExUA_Client/_search/returns_20_results_by_default.yml
186
- - spec/cassettes/ExUA_Client/_search/returns_list_of_categories.yml
187
158
  - spec/category_spec.rb
188
159
  - spec/client_spec.rb
160
+ - spec/item_spec.rb
189
161
  - spec/spec_helper.rb
@@ -1,151 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: http://www.ex.ua/ru_video.html
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers: {}
10
- response:
11
- status:
12
- code: 404
13
- message: Not Found
14
- headers:
15
- Server:
16
- - nginx/1.4.2
17
- Date:
18
- - Fri, 16 Aug 2013 09:24:25 GMT
19
- Content-Type:
20
- - text/html; charset=utf-8
21
- Content-Length:
22
- - '5010'
23
- Connection:
24
- - keep-alive
25
- Set-Cookie:
26
- - ccid=5912645536229401831; domain=www.ex.ua; path=/; expires=Mon, 14-Aug-2023
27
- 09:24:25 GMT
28
- Cache-Control:
29
- - no-cache, no-store, must-revalidate
30
- Expires:
31
- - '0'
32
- Pragma:
33
- - no-cache
34
- body:
35
- encoding: ASCII-8BIT
36
- string: !binary |-
37
- PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEv
38
- L0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+
39
- DQogDQo8aHRtbD4NCg0KPGhlYWQ+DQo8dGl0bGU+RVguVUE8L3RpdGxlPg0K
40
- PGxpbmsgaHJlZj0iL2luZGV4LmNzcz8wLjA0IiB0eXBlPSJ0ZXh0L2NzcyIg
41
- cmVsPSJzdHlsZXNoZWV0Ij4NCjxsaW5rIGhyZWY9Ii9mYXZpY29uLmljbyIg
42
- cmVsPSJzaG9ydGN1dCBpY29uIj4NCjxtZXRhIG5hbWU9InJvYm90cyIgY29u
43
- dGVudD0ibm9hcmNoaXZlIj4NCjxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQt
44
- dHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjxt
45
- ZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtbGFuZ3VhZ2UiIGNvbnRlbnQ9InJ1
46
- Ij4NCjxzY3JpcHQgc3JjPScvanMvbWFpbi5qcycgY2hhcnNldD0ndXRmLTgn
47
- IHR5cGU9J3RleHQvamF2YXNjcmlwdCc+PC9zY3JpcHQ+DQo8c2NyaXB0IHNy
48
- Yz0nL2pzL3JlcXVlc3QuanMnIGNoYXJzZXQ9J3V0Zi04JyB0eXBlPSd0ZXh0
49
- L2phdmFzY3JpcHQnPjwvc2NyaXB0Pg0KPHNjcmlwdCB0eXBlPSd0ZXh0L2ph
50
- dmFzY3JpcHQnPg0KaWYgKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSBkb2N1
51
- bWVudC5jb29raWUgPSAndWRwcj0nICsgd2luZG93LmRldmljZVBpeGVsUmF0
52
- aW8gKyAnO3BhdGg9Lyc7DQppZiAod2luZG93LnRvcCAhPSB3aW5kb3cuc2Vs
53
- Zikgd2luZG93LnRvcC5sb2NhdGlvbiA9IHdpbmRvdy5zZWxmLmxvY2F0aW9u
54
- Ow0KPC9zY3JpcHQ+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIg
55
- c3JjPSJodHRwczovL2FwaXMuZ29vZ2xlLmNvbS9qcy9wbHVzb25lLmpzIj4N
56
- CnsgbGFuZzogJ3J1JyB9DQo8L3NjcmlwdD4NCjwvaGVhZD4NCg0KPGJvZHkg
57
- b25sb2FkPSdpbml0Qm9keSgpJz4NCg0KPHRhYmxlIHdpZHRoPScxMDAlJyBo
58
- ZWlnaHQ9JzEwMCUnIGJvcmRlcj0wIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRp
59
- bmc9MD4NCjx0cj48dGQgdmFsaWduPXRvcCBzdHlsZT0naGVpZ2h0OiA2MHB4
60
- Oyc+DQo8ZGl2IHN0eWxlPSd3aWR0aDogMTAwJTsgaGVpZ2h0OiAzMHB4OyBv
61
- dmVyZmxvdzogaGlkZGVuOyBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI2Nj
62
- YzsgcGFkZGluZzogMDsnIGlkPSdhbm5vdW5jZSc+PGlmcmFtZSB3aWR0aD0n
63
- MTAwJScgaGVpZ2h0PSczMCcgZnJhbWVib3JkZXI9JzAnIG1hcmdpbmhlaWdo
64
- dD0nMCcgbWFyZ2lud2lkdGg9JzAnIHNjcm9sbGluZz0nbm8nIHNyYz0nL2Fk
65
- X2Fubm91bmNlLmh0bWwnPjwvaWZyYW1lPjwvZGl2Pg0KDQo8dGFibGUgd2lk
66
- dGg9JzEwMCUnIGJvcmRlcj0wIGNsYXNzPW1lbnUgaWQ9bWVudT4NCjx0cj48
67
- dGQgY2xhc3M9bWVudV90ZXh0PiZuYnNwOw0KPGEgaHJlZj0nLyc+PGltZyBz
68
- cmM9Jy9pL2V4LXNtYWxsLnBuZycgd2lkdGg9MjYgaGVpZ2h0PTEyIGJvcmRl
69
- cj0wIGFsdD0nRVgnPi3QpNCw0LnQu9GLPC9hPiZuYnNwO3wNCjxhIGhyZWY9
70
- Jy9ydS92aWRlbyc+0JLQuNC00LXQvjwvYT4mbmJzcDt8DQo8YSBocmVmPScv
71
- cnUvYXVkaW8nPtCQ0YPQtNC40L48L2E+Jm5ic3A7fA0KPGEgaHJlZj0nL3J1
72
- L2ltYWdlcyc+0JjQt9C+0LHRgNCw0LbQtdC90LjRjzwvYT4mbmJzcDt8DQo8
73
- YSBocmVmPScvcnUvdGV4dHMnPtCi0LXQutGB0YLRizwvYT4mbmJzcDt8DQo8
74
- YSBocmVmPScvcnUvZ2FtZXMnPtCY0LPRgNGLPC9hPiZuYnNwO3wNCjxhIGhy
75
- ZWY9Jy9ydS9zb2Z0d2FyZSc+0J/RgNC+0LPRgNCw0LzQvNGLPC9hPiZuYnNw
76
- O3wNCjxhIGhyZWY9Jy9ydS9hYm91dCc+0J4g0YHQtdGA0LLQuNGB0LU8L2E+
77
- Jm5ic3A7fA0KPGEgaHJlZj0nL3NlYXJjaCc+0J/QvtC40YHQujwvYT4NCiZu
78
- YnNwOzwvdGQ+PHRkIGFsaWduPXJpZ2h0IHZhbGlnbj1jZW50ZXIgY2xhc3M9
79
- bWVudV90ZXh0PiZuYnNwOw0KPGZvcm0gc3R5bGU9J2Rpc3BsYXk6IGlubGlu
80
- ZTsnIGFjdGlvbj0nL2xhbmd1YWdlJz48c2VsZWN0IG5hbWU9bGFuZyBvbmNo
81
- YW5nZT0naWYgKHRoaXMuZm9ybSkgdGhpcy5mb3JtLnN1Ym1pdCgpOyc+PG9w
82
- dGlvbiB2YWx1ZT1ydSBzZWxlY3RlZD7RgNGD0YHRgdC60LjQuTxvcHRpb24g
83
- dmFsdWU9dWs+0YPQutGA0LDRl9C90YHRjNC60LA8b3B0aW9uIHZhbHVlPWVu
84
- PmVuZ2xpc2g8b3B0aW9uIHZhbHVlPWVzPmVzcGFub2w8b3B0aW9uIHZhbHVl
85
- PWRlPmRldXRzY2g8b3B0aW9uIHZhbHVlPWZyPmZyYW7Dp2FpczxvcHRpb24g
86
- dmFsdWU9cGw+cG9sc2tpPG9wdGlvbiB2YWx1ZT1qYT7ml6XmnKzoqp48b3B0
87
- aW9uIHZhbHVlPWtrPtKb0LDQt9Cw0ps8L3NlbGVjdD48L2Zvcm0+Jm5ic3A7
88
- fA0KPGEgaHJlZj0nL2xvZ2luJz7QktGF0L7QtDwvYT4NCiZuYnNwOw0KPC90
89
- ZD48L3RyPg0KPC90YWJsZT4NCjwvdGQ+PC90cj4NCjx0cj48dGQgdmFsaWdu
90
- PXRvcCBzdHlsZT0ncGFkZGluZzogMTZweDsnIGlkPSdib2R5X2VsZW1lbnQn
91
- Pg0KPHA+PGltZyBzcmM9Jy9pL2lfZXJyb3IucG5nJyB3aWR0aD0zMiBoZWln
92
- aHQ9MzIgdnNwYWNlPTEgYWxpZ249YWJzbWlkZGxlPiZuYnNwOzxiaWcgaWQ9
93
- J21lc3NhZ2UnPtCh0YLRgNCw0L3QuNGG0LAg0L3QtSDQvdCw0LnQtNC10L3Q
94
- sC48L2JpZz4NCjxwPg0KJm5ic3A7DQo8cD4NCjxzcGFuIGNsYXNzPXJfYnV0
95
- dG9uPjxhIGhyZWY9Jy8nPtC90LAg0YLQuNGC0YPQuzwvYT48L3NwYW4+DQoN
96
- CjwvdGQ+PC90cj4NCjx0cj48dGQgdmFsaWduPWJvdHRvbSBzdHlsZT0naGVp
97
- Z2h0OiAzMnB4Oyc+DQo8dGFibGUgd2lkdGg9JzEwMCUnIGJvcmRlcj0wIGNs
98
- YXNzPWNvcHlyaWdodD48dHI+PHRkPg0KDQo8IS0tIGhpdC51YSAtLT4NCjxz
99
- Y3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0Jz48IS0tDQoNCmZ1bmN0aW9u
100
- IGxvYWRKcyhzcmMpDQp7DQoJdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVt
101
- ZW50KCdzY3JpcHQnKTsNCglhLnNldEF0dHJpYnV0ZSgnc3JjJywgc3JjKTsN
102
- CglhLmFzeW5jID0gJ3RydWUnOw0KCXZhciBiID0gZG9jdW1lbnQuZ2V0RWxl
103
- bWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdOw0KCWIucGFyZW50Tm9kZS5p
104
- bnNlcnRCZWZvcmUoYSwgYik7DQp9DQoNCmlmICghZG9jdW1lbnQuY29va2ll
105
- KSBkb2N1bWVudC5jb29raWUgPSAiYj1iIjsNCg0KbG9hZEpzKCdodHRwOi8v
106
- Yy5oaXQudWEvaGl0P2k9MTM1MDEnICsNCgknJmc9MCZ4PTMmcz0xJyArDQoJ
107
- JyZ0PScgKyAobmV3IERhdGUoKSkuZ2V0VGltZXpvbmVPZmZzZXQoKSArDQoJ
108
- KGRvY3VtZW50LmNvb2tpZSA/ICcmYz0xJyA6ICcnKSArDQoJKHNlbGYgIT0g
109
- dG9wID8gJyZmPTEnIDogJycpICsNCgkobmF2aWdhdG9yLmphdmFFbmFibGVk
110
- KCkgPyAnJmo9MScgOiAnJykgKw0KCSh0eXBlb2Yoc2NyZWVuKSAhPSAndW5k
111
- ZWZpbmVkJyA/ICcmdz0nICsgc2NyZWVuLndpZHRoICsgJyZoPScgKyBzY3Jl
112
- ZW4uaGVpZ2h0ICsgJyZkPScgKyAoc2NyZWVuLmNvbG9yRGVwdGggPyBzY3Jl
113
- ZW4uY29sb3JEZXB0aCA6IHNjcmVlbi5waXhlbERlcHRoKSA6ICcnKSArDQoJ
114
- JyZyPScgKyBlc2NhcGUoZG9jdW1lbnQucmVmZXJyZXIpICsNCgknJnU9JyAr
115
- IGVzY2FwZSh3aW5kb3cubG9jYXRpb24uaHJlZikgKw0KCScmJyArIE1hdGgu
116
- cmFuZG9tKCkNCik7DQppZiAoZG9jdW1lbnQuY29va2llKSBsb2FkSnMoJ2h0
117
- dHA6Ly9jLmhpdC51YS9wb2xsP2k9MTM1MDEmYz0xJicgKyBNYXRoLnJhbmRv
118
- bSgpKTsNCg0KLy8tLT48L3NjcmlwdD4NCg0KPG5vc2NyaXB0Pg0KPGltZyBz
119
- cmM9J2h0dHA6Ly9jLmhpdC51YS9oaXQ/aT0xMzUwMSZhbXA7Zz0wJmFtcDt4
120
- PTInIGJvcmRlcj0nMCcgd2lkdGg9JzEnIGhlaWdodD0nMScvPg0KPC9ub3Nj
121
- cmlwdD4NCjwhLS0gLyBoaXQudWEgLS0+DQoNCjwvdGQ+PHRkIGFsaWduPWNl
122
- bnRlcj4NCg0KPG5vc2NyaXB0Pg0KPGltZyBzcmM9Imh0dHA6Ly9qdWtlLm1t
123
- aS5iZW1vYmlsZS51YS9idWcvcGljLmdpZj9zaXRlaWQ9ZXgudWEiPg0KPC9u
124
- b3NjcmlwdD4NCjxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPg0KdmFy
125
- IHRuc19hbHJlYWR5OyBpZiAoInVuZGVmaW5lZCI9PXR5cGVvZih0bnNfYWxy
126
- ZWFkeSkgfHwgbnVsbD09dG5zX2FscmVhZHkgfHwgMD09dG5zX2FscmVhZHkp
127
- IHsgdG5zX2FscmVhZHk9MTsgdmFyIGk9bmV3IEltYWdlKCk7IGkuc3JjPSJo
128
- dHRwOi8vanVrZS5tbWkuYmVtb2JpbGUudWEvYnVnL3BpYy5naWY/c2l0ZWlk
129
- PWV4LnVhJmo9MSYiK01hdGgucmFuZG9tKCk7IChmdW5jdGlvbigpeyB2YXIg
130
- cD1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOyB2
131
- YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsgcy50eXBl
132
- PSJ0ZXh0L2phdmFzY3JpcHQiOyBzLnNyYz0iaHR0cDovL3NvdXJjZS5tbWku
133
- YmVtb2JpbGUudWEvY20vY20uanMiOyBzLmFzeW5jID0gdHJ1ZTsgcC5hcHBl
134
- bmRDaGlsZChzKTsgfSkoKTsgfTsNCjwvc2NyaXB0Pg0KDQo8L3RkPjx0ZCBh
135
- bGlnbj1yaWdodD4NCjxzcGFuIGNsYXNzPXNtYWxsIHRpdGxlPSdjb3B5cmln
136
- aHQnPiZjb3B5Ozwvc3Bhbj4mbmJzcDs8c3BhbiBjbGFzcz1zbWFsbD5leC51
137
- YSZuYnNwO3wmbmJzcDs8YSBocmVmPScvY29udGFjdCc+0LrQvtC90YLQsNC6
138
- 0YLQvdCw0Y8g0LjQvdGE0L7RgNC80LDRhtC40Y88L2E+Jm5ic3A7fCZuYnNw
139
- OzxhIGhyZWY9Jy9jb3B5cmlnaHQnPtC00LvRjyDQv9GA0LDQstC+0L7QsdC7
140
- 0LDQtNCw0YLQtdC70LXQuTwvYT48L3NwYW4+DQo8L3RkPjwvdHI+PC90YWJs
141
- ZT4NCg0KPC90ZD48L3RyPg0KPC90YWJsZT4NCg0KPHNjcmlwdCB0eXBlPSd0
142
- ZXh0L2phdmFzY3JpcHQnPg0Kc2V0VGltZW91dChmdW5jdGlvbigpIHsgdmFy
143
- IGUsIGlkID0gMDsgd2hpbGUoZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlk
144
- KCdhZF9ibG9ja18nICsgKytpZCkpIGlmIChlLnN0eWxlLmRpc3BsYXkgPT0g
145
- J25vbmUnKSBlLnN0eWxlLmRpc3BsYXkgPSAoZS50YWdOYW1lID09ICdUQUJM
146
- RScgPyAndGFibGUnIDogKGUudGFnTmFtZSA9PSAnVFInID8gJ3RhYmxlLXJv
147
- dycgOiAnYmxvY2snKSk7IH0sIDI1MDApOw0KPC9zY3JpcHQ+DQoNCjwvYm9k
148
- eT4NCg0KPC9odG1sPg0K
149
- http_version:
150
- recorded_at: Fri, 16 Aug 2013 09:24:25 GMT
151
- recorded_with: VCR 2.5.0