Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

integrate nil value key deletion with safe_hash instead of having the relation part there and the deletion part in as_json since using parse-ruby-client with active_support can clobber Parse::Object#as_json. also raise on nested unsaved objects instead o #91

Merged
merged 20 commits into from

3 participants

Eric Jensen Ben Cherry Alan deLevie
Eric Jensen

also prefer the ruby to_h convention to the rails as_json one but support both.

also make sure bad query responses raise instead of slip through as strings

ericcj added some commits
Eric Jensen ericcj integrate nil value key deletion with safe_hash instead of having the…
… relation part there and the deletion part in as_json since using parse-ruby-client with active_support can clobber Parse::Object#as_json
ce1e916
Eric Jensen ericcj remove logging f7e04b0
Eric Jensen ericcj Merge remote-tracking branch 'adelevie/master' 735ac0b
Ben Cherry

nice, lgtm

Eric Jensen ericcj raise on nested new objects instead of silently just not saving them …
…since REST api doesn't support it, circular saves are impossible
653145a
Ben Cherry

new stuff looks good too

Ben Cherry

nice

lib/parse/query.rb
@@ -125,7 +125,12 @@ def get
[:count, :limit, :skip, :include].each {|a| merge_attribute(a, query)}
Parse.client.logger.info{"Parse query for #{uri} #{CGI.unescape(query.inspect)}"}
response = Parse.client.request uri, :get, nil, query
- Parse.parse_json class_name, response
+
+ if response.is_a?(Hash) && response.has_key?(Protocol::KEY_RESULTS) && response[Protocol::KEY_RESULTS].is_a?(Array)
+ response[Protocol::KEY_RESULTS].map{|o| Parse.parse_json(class_name, o)}
Ben Cherry
bcherry added a note

this breaks count queries.... will fix, but don't merge this in the meantime

Ben Cherry
bcherry added a note

fixed in 7aaed38

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Eric Jensen

looks good ben, thanks. this restores the previous behavior which makes it safe to merge. i also wrote a story to make count clearer: #93

Eric Jensen

@adelevie mind taking a look at this to merge? these are reasonably important bug fixes that we've been running in production

Ben Cherry

One more thing (ericcj#1) that just appeared in this pull: Now automatically converting HTTP GET into a POST with X-HTTP-Method-Override=GET when the query is large (e.g. very large $in query) to avoid URL-length limits.

Eric Jensen

@adelevie this pull request contains some significant bug fixes we should try to get into the gem

Alan deLevie adelevie merged commit 0eb452b into from
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on May 22, 2013
  1. Eric Jensen

    integrate nil value key deletion with safe_hash instead of having the…

    ericcj authored
    … relation part there and the deletion part in as_json since using parse-ruby-client with active_support can clobber Parse::Object#as_json
  2. Eric Jensen

    remove logging

    ericcj authored
  3. Eric Jensen
  4. Eric Jensen

    raise on nested new objects instead of silently just not saving them …

    ericcj authored
    …since REST api doesn't support it, circular saves are impossible
Commits on May 24, 2013
  1. Eric Jensen
  2. Ben Cherry

    Fix count queries, +tests

    bcherry authored
Commits on Jun 6, 2013
  1. Ben Cherry
  2. Ben Cherry
  3. Ben Cherry
  4. Ben Cherry

    Merge pull request #1 from ericcj/xget

    bcherry authored
    Support HTTP method override to GET with large query size
Commits on Jun 8, 2013
  1. Ben Cherry
Commits on Jun 12, 2013
  1. Ben Cherry

    Merge pull request #2 from ericcj/batch_client

    bcherry authored
    Support custom Parse::Client for batches
Commits on Jun 14, 2013
  1. Ben Cherry
  2. Ben Cherry

    Merge pull request #3 from ericcj/utc_dates

    bcherry authored
    Proper UTC date serialization same as Parse.com
Commits on Jun 21, 2013
  1. Eric Jensen
Commits on Jun 24, 2013
  1. Eric Jensen

    avoid infinite recursion

    ericcj authored
  2. Eric Jensen
  3. Eric Jensen

    Merge pull request #4 from ericcj/class_name_in_to_json

    ericcj authored
    fix to_h to include class name and safe_hash to not
Commits on Jul 1, 2013
  1. Eric Jensen
Commits on Jul 5, 2013
  1. Eric Jensen
This page is out of date. Refresh to see the latest.
7 Gemfile
View
@@ -1,16 +1,11 @@
source 'https://rubygems.org'
-# Add dependencies required to use your gem here.
-# Example:
-# gem 'activesupport', '>= 2.3.5'
-# Add dependencies to develop your gem here.
-# Include everything needed to run rake, tests, features, etc.
group :development do
gem 'bundler'
gem 'shoulda', '>= 0'
gem 'test-unit', '= 2.5.0'
gem 'mocha', '= 0.12.0', :require => false
- gem 'jeweler', :git => 'https://github.com/foxnewsnetwork/jeweler.git', :branch => 'ruby-2.0.0-ifying'
+ gem 'jeweler', '~> 1.8.5'
gem 'simplecov', :require => false
gem 'webmock'
gem 'vcr'
54 Gemfile.lock
View
@@ -1,33 +1,57 @@
-GIT
- remote: https://github.com/foxnewsnetwork/jeweler.git
- revision: f05c62e168cfc29bd82cebe06df8fd11e1ef09ee
- branch: ruby-2.0.0-ifying
- specs:
- jeweler (1.8.4)
- bundler (~> 1.3.0.pre)
- git (>= 1.2.5)
- rake
- rdoc
-
GEM
remote: https://rubygems.org/
specs:
- addressable (2.3.2)
+ addressable (2.3.5)
+ builder (3.2.2)
crack (0.3.1)
+ faraday (0.8.7)
+ multipart-post (~> 1.1)
git (1.2.5)
+ github_api (0.10.1)
+ addressable
+ faraday (~> 0.8.1)
+ hashie (>= 1.2)
+ multi_json (~> 1.4)
+ nokogiri (~> 1.5.2)
+ oauth2
+ hashie (2.0.5)
+ highline (1.6.19)
+ httpauth (0.2.0)
iron_core (0.5.1)
rest (>= 2.2.0)
iron_mq (2.1.3)
iron_core (>= 0.4.2)
+ jeweler (1.8.6)
+ builder
+ bundler (~> 1.0)
+ git (>= 1.2.5)
+ github_api (= 0.10.1)
+ highline (>= 1.6.15)
+ nokogiri (= 1.5.10)
+ rake
+ rdoc
json (1.8.0)
+ jwt (0.1.8)
+ multi_json (>= 1.5)
metaclass (0.0.1)
mime-types (1.20.1)
mocha (0.12.0)
metaclass (~> 0.0.1)
- multi_json (1.7.3)
+ multi_json (1.7.7)
+ multi_xml (0.5.4)
+ multipart-post (1.2.0)
net-http-persistent (2.8)
+ nokogiri (1.5.10)
+ oauth2 (0.9.2)
+ faraday (~> 0.8)
+ httpauth (~> 0.2)
+ jwt (~> 0.1.4)
+ multi_json (~> 1.0)
+ multi_xml (~> 0.5)
+ rack (~> 1.2)
patron (0.4.18)
- rake (10.0.4)
+ rack (1.5.2)
+ rake (10.1.0)
rdoc (4.0.1)
json (~> 1.4)
rest (2.2.0)
@@ -52,7 +76,7 @@ PLATFORMS
DEPENDENCIES
bundler
iron_mq
- jeweler!
+ jeweler (~> 1.8.5)
mocha (= 0.12.0)
patron
shoulda
239 fixtures/vcr_cassettes/test_batch_update_nils_delete_keys.yml
View
@@ -0,0 +1,239 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.parse.com/1/classes/BatchTestObject
+ body:
+ encoding: UTF-8
+ string: '{"foo":"1"}'
+ headers:
+ Content-Type:
+ - application/json
+ Accept:
+ - application/json
+ User-Agent:
+ - Parse for Ruby, 0.0
+ X-Parse-Master-Key:
+ - ''
+ X-Parse-Rest-Api-Key:
+ - <X-Parse-REST-API-Key>
+ X-Parse-Application-Id:
+ - <X-Parse-Application-Id>
+ X-Parse-Session-Token:
+ - ''
+ Expect:
+ - ''
+ response:
+ status:
+ code: 201
+ message: Created
+ headers:
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Request-Method:
+ - '*'
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Wed, 22 May 2013 16:29:53 GMT
+ Location:
+ - https://api.parse.com/1/classes/BatchTestObject/2ymFSQYHfE
+ Server:
+ - nginx/1.2.2
+ Set-Cookie:
+ - <COOKIE-KEY>
+ Status:
+ - 201 Created
+ X-Runtime:
+ - '0.036319'
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ Content-Length:
+ - '64'
+ Connection:
+ - keep-alive
+ body:
+ encoding: ASCII-8BIT
+ string: '{"createdAt":"2013-05-22T16:29:53.618Z","objectId":"2ymFSQYHfE"}'
+ http_version:
+ recorded_at: Wed, 22 May 2013 16:29:53 GMT
+- request:
+ method: post
+ uri: https://api.parse.com/1/batch
+ body:
+ encoding: UTF-8
+ string: '{"requests":[{"method":"PUT","path":"/1/classes/BatchTestObject/2ymFSQYHfE","body":{"foo":{"__op":"Delete"}}}]}'
+ headers:
+ Content-Type:
+ - application/json
+ Accept:
+ - application/json
+ User-Agent:
+ - Parse for Ruby, 0.0
+ X-Parse-Master-Key:
+ - ''
+ X-Parse-Rest-Api-Key:
+ - <X-Parse-REST-API-Key>
+ X-Parse-Application-Id:
+ - <X-Parse-Application-Id>
+ X-Parse-Session-Token:
+ - ''
+ Expect:
+ - ''
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Request-Method:
+ - '*'
+ Cache-Control:
+ - max-age=0, private, must-revalidate
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Wed, 22 May 2013 16:29:53 GMT
+ Etag:
+ - '"46d925ca6ec13b0f74a396e85f13e0d2"'
+ Server:
+ - nginx/1.2.2
+ Set-Cookie:
+ - <COOKIE-KEY>
+ Status:
+ - 200 OK
+ X-Runtime:
+ - '0.036707'
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ Content-Length:
+ - '54'
+ Connection:
+ - keep-alive
+ body:
+ encoding: ASCII-8BIT
+ string: '[{"success":{"updatedAt":"2013-05-22T16:29:53.704Z"}}]'
+ http_version:
+ recorded_at: Wed, 22 May 2013 16:29:53 GMT
+- request:
+ method: get
+ uri: https://api.parse.com/1/classes/BatchTestObject/2ymFSQYHfE
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept:
+ - application/json
+ User-Agent:
+ - Parse for Ruby, 0.0
+ X-Parse-Master-Key:
+ - ''
+ X-Parse-Rest-Api-Key:
+ - <X-Parse-REST-API-Key>
+ X-Parse-Application-Id:
+ - <X-Parse-Application-Id>
+ X-Parse-Session-Token:
+ - ''
+ Expect:
+ - ''
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Request-Method:
+ - '*'
+ Cache-Control:
+ - max-age=0, private, must-revalidate
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Wed, 22 May 2013 16:29:53 GMT
+ Etag:
+ - '"97322f30380a98755c73de04b24d660c"'
+ Server:
+ - nginx/1.2.2
+ Set-Cookie:
+ - <COOKIE-KEY>
+ Status:
+ - 200 OK
+ X-Runtime:
+ - '0.046347'
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ Content-Length:
+ - '103'
+ Connection:
+ - keep-alive
+ body:
+ encoding: ASCII-8BIT
+ string: '{"createdAt":"2013-05-22T16:29:53.618Z","updatedAt":"2013-05-22T16:29:53.704Z","objectId":"2ymFSQYHfE"}'
+ http_version:
+ recorded_at: Wed, 22 May 2013 16:29:53 GMT
+- request:
+ method: get
+ uri: https://api.parse.com/1/classes/BatchTestObject/2ymFSQYHfE
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept:
+ - application/json
+ User-Agent:
+ - Parse for Ruby, 0.0
+ X-Parse-Master-Key:
+ - ''
+ X-Parse-Rest-Api-Key:
+ - <X-Parse-REST-API-Key>
+ X-Parse-Application-Id:
+ - <X-Parse-Application-Id>
+ X-Parse-Session-Token:
+ - ''
+ Expect:
+ - ''
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Request-Method:
+ - '*'
+ Cache-Control:
+ - max-age=0, private, must-revalidate
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Wed, 22 May 2013 16:31:59 GMT
+ Etag:
+ - '"97322f30380a98755c73de04b24d660c"'
+ Server:
+ - nginx/1.2.2
+ Set-Cookie:
+ - <COOKIE-KEY>
+ Status:
+ - 200 OK
+ X-Runtime:
+ - '0.027746'
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ Content-Length:
+ - '103'
+ Connection:
+ - keep-alive
+ body:
+ encoding: ASCII-8BIT
+ string: '{"createdAt":"2013-05-22T16:29:53.618Z","updatedAt":"2013-05-22T16:29:53.704Z","objectId":"2ymFSQYHfE"}'
+ http_version:
+ recorded_at: Wed, 22 May 2013 16:31:59 GMT
+recorded_with: VCR 2.4.0
121 fixtures/vcr_cassettes/test_circular_save.yml
View
@@ -1,121 +0,0 @@
----
-http_interactions:
-- request:
- method: post
- uri: https://api.parse.com/1/classes/CircularBar
- body:
- encoding: UTF-8
- string: "{\"bar\":{\"__op\":\"Delete\"},\"text\":\"bar_2\"}"
- headers:
- Content-Type:
- - application/json
- Accept:
- - application/json
- User-Agent:
- - Parse for Ruby, 0.0
- X-Parse-Master-Key:
- - ""
- X-Parse-Rest-Api-Key:
- - <X-Parse-REST-API-Key>
- X-Parse-Application-Id:
- - <X-Parse-Application-Id>
- X-Parse-Session-Token:
- - ""
- Expect:
- - ""
- response:
- status:
- code: 201
- message: Created
- headers:
- Access-Control-Allow-Origin:
- - "*"
- Access-Control-Request-Method:
- - "*"
- Cache-Control:
- - no-cache
- Content-Type:
- - application/json; charset=utf-8
- Date:
- - Mon, 22 Apr 2013 16:03:17 GMT
- Location:
- - https://api.parse.com/1/classes/CircularBar/JyVRVNuOlB
- Server:
- - nginx/1.2.2
- Set-Cookie:
- - <COOKIE-KEY>
- Status:
- - 201 Created
- X-Runtime:
- - "0.026885"
- X-Ua-Compatible:
- - IE=Edge,chrome=1
- Content-Length:
- - "64"
- Connection:
- - keep-alive
- body:
- encoding: ASCII-8BIT
- string: "{\"createdAt\":\"2013-04-22T16:03:17.562Z\",\"objectId\":\"JyVRVNuOlB\"}"
- http_version:
- recorded_at: Mon, 22 Apr 2013 16:03:17 GMT
-- request:
- method: post
- uri: https://api.parse.com/1/classes/CircularBar
- body:
- encoding: UTF-8
- string: "{\"text\":\"bar\",\"bar\":{\"__type\":\"Pointer\",\"className\":\"CircularBar\",\"objectId\":\"JyVRVNuOlB\"}}"
- headers:
- Content-Type:
- - application/json
- Accept:
- - application/json
- User-Agent:
- - Parse for Ruby, 0.0
- X-Parse-Master-Key:
- - ""
- X-Parse-Rest-Api-Key:
- - <X-Parse-REST-API-Key>
- X-Parse-Application-Id:
- - <X-Parse-Application-Id>
- X-Parse-Session-Token:
- - ""
- Expect:
- - ""
- response:
- status:
- code: 201
- message: Created
- headers:
- Access-Control-Allow-Origin:
- - "*"
- Access-Control-Request-Method:
- - "*"
- Cache-Control:
- - no-cache
- Content-Type:
- - application/json; charset=utf-8
- Date:
- - Mon, 22 Apr 2013 16:03:17 GMT
- Location:
- - https://api.parse.com/1/classes/CircularBar/ozNdHHQrHP
- Server:
- - nginx/1.2.2
- Set-Cookie:
- - <COOKIE-KEY>
- Status:
- - 201 Created
- X-Runtime:
- - "0.033931"
- X-Ua-Compatible:
- - IE=Edge,chrome=1
- Content-Length:
- - "64"
- Connection:
- - keep-alive
- body:
- encoding: ASCII-8BIT
- string: "{\"createdAt\":\"2013-04-22T16:03:17.626Z\",\"objectId\":\"ozNdHHQrHP\"}"
- http_version:
- recorded_at: Mon, 22 Apr 2013 16:03:17 GMT
-recorded_with: VCR 2.4.0
62 fixtures/vcr_cassettes/test_saving_nested_objects.yml
View
@@ -0,0 +1,62 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.parse.com/1/classes/Post
+ body:
+ encoding: UTF-8
+ string: '{"comment":{"__op":"Delete"}}'
+ headers:
+ Content-Type:
+ - application/json
+ Accept:
+ - application/json
+ User-Agent:
+ - Parse for Ruby, 0.0
+ X-Parse-Master-Key:
+ - ''
+ X-Parse-Rest-Api-Key:
+ - <X-Parse-REST-API-Key>
+ X-Parse-Application-Id:
+ - <X-Parse-Application-Id>
+ X-Parse-Session-Token:
+ - ''
+ Expect:
+ - ''
+ response:
+ status:
+ code: 201
+ message: Created
+ headers:
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Request-Method:
+ - '*'
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Wed, 22 May 2013 22:24:06 GMT
+ Location:
+ - https://api.parse.com/1/classes/Post/lt1txKrs3x
+ Server:
+ - nginx/1.2.2
+ Set-Cookie:
+ - <COOKIE-KEY>
+ Status:
+ - 201 Created
+ X-Runtime:
+ - '0.035016'
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ body:
+ encoding: ASCII-8BIT
+ string: '{"createdAt":"2013-05-22T22:24:06.104Z","objectId":"lt1txKrs3x"}'
+ http_version:
+ recorded_at: Wed, 22 May 2013 22:24:06 GMT
+recorded_with: VCR 2.4.0
182 fixtures/vcr_cassettes/test_xget.yml
View
@@ -0,0 +1,182 @@
+---
+http_interactions:
+- request:
+ method: post
+ uri: https://api.parse.com/1/classes/Post
+ body:
+ encoding: UTF-8
+ string: '{}'
+ headers:
+ Content-Type:
+ - application/json
+ Accept:
+ - application/json
+ User-Agent:
+ - Parse for Ruby, 0.0
+ X-Parse-Master-Key:
+ - ''
+ X-Parse-Rest-Api-Key:
+ - <X-Parse-REST-API-Key>
+ X-Parse-Application-Id:
+ - <X-Parse-Application-Id>
+ X-Parse-Session-Token:
+ - ''
+ Expect:
+ - ''
+ response:
+ status:
+ code: 201
+ message: Created
+ headers:
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Request-Method:
+ - '*'
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Fri, 21 Jun 2013 16:16:14 GMT
+ Location:
+ - https://api.parse.com/1/classes/Post/aZ7tiNFNDZ
+ Server:
+ - nginx/1.2.2
+ Set-Cookie:
+ - <COOKIE-KEY>
+ Status:
+ - 201 Created
+ X-Runtime:
+ - '0.046350'
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ Content-Length:
+ - '64'
+ Connection:
+ - keep-alive
+ body:
+ encoding: ASCII-8BIT
+ string: '{"createdAt":"2013-06-21T16:16:14.217Z","objectId":"aZ7tiNFNDZ"}'
+ http_version:
+ recorded_at: Fri, 21 Jun 2013 16:16:14 GMT
+- request:
+ method: post
+ uri: https://api.parse.com/1/classes/Post
+ body:
+ encoding: UTF-8
+ string: '{}'
+ headers:
+ Content-Type:
+ - application/json
+ Accept:
+ - application/json
+ User-Agent:
+ - Parse for Ruby, 0.0
+ X-Parse-Master-Key:
+ - ''
+ X-Parse-Rest-Api-Key:
+ - <X-Parse-REST-API-Key>
+ X-Parse-Application-Id:
+ - <X-Parse-Application-Id>
+ X-Parse-Session-Token:
+ - ''
+ Expect:
+ - ''
+ response:
+ status:
+ code: 201
+ message: Created
+ headers:
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Request-Method:
+ - '*'
+ Cache-Control:
+ - no-cache
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Fri, 21 Jun 2013 16:16:14 GMT
+ Location:
+ - https://api.parse.com/1/classes/Post/4Mig89uYfw
+ Server:
+ - nginx/1.2.2
+ Set-Cookie:
+ - <COOKIE-KEY>
+ Status:
+ - 201 Created
+ X-Runtime:
+ - '0.041930'
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ Content-Length:
+ - '64'
+ Connection:
+ - keep-alive
+ body:
+ encoding: ASCII-8BIT
+ string: '{"createdAt":"2013-06-21T16:16:14.277Z","objectId":"4Mig89uYfw"}'
+ http_version:
+ recorded_at: Fri, 21 Jun 2013 16:16:14 GMT
+- request:
+ method: post
+ uri: https://api.parse.com/1/classes/Post
+ body:
+ encoding: UTF-8
+ string: where=%7B%22objectId%22%3A%7B%22%24in%22%3A%5B%22aZ7tiNFNDZ%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%2C%22x%22%5D%7D%7D
+ headers:
+ Content-Type:
+ - application/x-www-form-urlencoded
+ Accept:
+ - application/json
+ User-Agent:
+ - Parse for Ruby, 0.0
+ X-Parse-Master-Key:
+ - ''
+ X-Parse-Rest-Api-Key:
+ - <X-Parse-REST-API-Key>
+ X-Parse-Application-Id:
+ - <X-Parse-Application-Id>
+ X-Parse-Session-Token:
+ - ''
+ X-Http-Method-Override:
+ - GET
+ Expect:
+ - ''
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Access-Control-Allow-Origin:
+ - '*'
+ Access-Control-Request-Method:
+ - '*'
+ Cache-Control:
+ - max-age=0, private, must-revalidate
+ Content-Type:
+ - application/json; charset=utf-8
+ Date:
+ - Fri, 21 Jun 2013 16:16:14 GMT
+ Etag:
+ - '"e30c0e9048613659d675b1c9c4dd0d54"'
+ Server:
+ - nginx/1.2.2
+ Set-Cookie:
+ - <COOKIE-KEY>
+ Status:
+ - 200 OK
+ X-Runtime:
+ - '0.078987'
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ Content-Length:
+ - '117'
+ Connection:
+ - keep-alive
+ body:
+ encoding: ASCII-8BIT
+ string: '{"results":[{"createdAt":"2013-06-21T16:16:14.217Z","updatedAt":"2013-06-21T16:16:14.217Z","objectId":"aZ7tiNFNDZ"}]}'
+ http_version:
+ recorded_at: Fri, 21 Jun 2013 16:16:14 GMT
+recorded_with: VCR 2.4.0
7 lib/parse/batch.rb
View
@@ -3,8 +3,10 @@
module Parse
class Batch
attr_reader :requests
+ attr_reader :client
- def initialize
+ def initialize(client = Parse.client)
+ @client = client
@requests ||= []
end
@@ -44,10 +46,9 @@ def delete_object(object)
def run!
uri = Parse::Protocol.batch_request_uri
body = {:requests => @requests}.to_json
- Parse.client.request(uri, :post, body)
+ @client.request(uri, :post, body)
end
-
end
end
33 lib/parse/client.rb
View
@@ -60,21 +60,32 @@ def initialize(data = {})
# ParseProtocolError if the response has an error status code,
# and will return the parsed JSON body on success, if there is one.
def request(uri, method = :get, body = nil, query = nil, content_type = nil)
- @session.headers[Protocol::HEADER_MASTER_KEY] = @master_key
- @session.headers[Protocol::HEADER_API_KEY] = @api_key
- @session.headers[Protocol::HEADER_APP_ID] = @application_id
- @session.headers[Protocol::HEADER_SESSION_TOKEN] = @session_token
+ options = {}
+ headers = {}
- if content_type
- @session.headers["Content-Type"] = content_type
- end
+ headers[Protocol::HEADER_MASTER_KEY] = @master_key
+ headers[Protocol::HEADER_API_KEY] = @api_key
+ headers[Protocol::HEADER_APP_ID] = @application_id
+ headers[Protocol::HEADER_SESSION_TOKEN] = @session_token
- options = {}
if body
options[:data] = body
end
if query
- options[:query] = query
+ options[:query] = Patron::Util.build_query_pairs_from_hash(query).join('&')
+
+ # Avoid 502 or 414 when sending a large querystring. See https://parse.com/questions/502-error-when-query-with-huge-contains
+ if options[:query].size > 2000 && method == :get && !body && !content_type
+ options[:data] = options[:query]
+ options[:query] = nil
+ method = :post
+ headers['X-HTTP-Method-Override'] = 'GET'
+ content_type = 'application/x-www-form-urlencoded'
+ end
+ end
+
+ if content_type
+ headers["Content-Type"] = content_type
end
num_tries = 0
@@ -89,14 +100,14 @@ def request(uri, method = :get, body = nil, query = nil, content_type = nil)
# else
# add to queue before request
@queue.post("1")
- response = @session.request(method, uri, {}, options)
+ response = @session.request(method, uri, headers, options)
# delete from queue after request
msg = @queue.get()
msg.delete
# end
#end
else
- response = @session.request(method, uri, {}, options)
+ response = @session.request(method, uri, headers, options)
end
parsed = JSON.parse(response.body)
37 lib/parse/datatypes.rb
View
@@ -41,16 +41,17 @@ def new?
false
end
- def as_json(*a)
+ def to_h(*a)
{
Protocol::KEY_TYPE => Protocol::TYPE_POINTER,
Protocol::KEY_CLASS_NAME => @class_name,
Protocol::KEY_OBJECT_ID => @parse_object_id
}
end
+ alias :as_json :to_h
def to_json(*a)
- as_json.to_json(*a)
+ to_h.to_json(*a)
end
# Retrieve the Parse object referenced by this pointer.
@@ -106,15 +107,16 @@ def respond_to?(method, include_private = false)
super || value.respond_to?(method, include_private)
end
- def as_json(*a)
+ def to_h(*a)
{
Protocol::KEY_TYPE => Protocol::TYPE_DATE,
- "iso" => value.iso8601(3)
+ "iso" => value.to_time.utc.iso8601(3)
}
end
+ alias :as_json :to_h
def to_json(*a)
- as_json.to_json(*a)
+ to_h.to_json(*a)
end
end
@@ -156,15 +158,16 @@ def respond_to?(method, include_private = false)
super || value.respond_to?(method, include_private)
end
- def as_json(*a)
+ def to_h(*a)
{
Protocol::KEY_TYPE => Protocol::TYPE_BYTES,
"base64" => Base64.encode64(@value)
}
end
+ alias :as_json :to_h
def to_json(*a)
- as_json.to_json(*a)
+ to_h.to_json(*a)
end
end
@@ -190,15 +193,16 @@ def hash
amount.hash
end
- def as_json(*a)
+ def to_h(*a)
{
Protocol::KEY_OP => Protocol::KEY_INCREMENT,
Protocol::KEY_AMOUNT => @amount
}
end
+ alias :as_json :to_h
def to_json(*a)
- as_json.to_json(*a)
+ to_h.to_json(*a)
end
end
@@ -224,15 +228,16 @@ def hash
operation.hash ^ objects.hash
end
- def as_json(*a)
+ def to_h(*a)
{
Protocol::KEY_OP => operation,
Protocol::KEY_OBJECTS => @objects
}
end
+ alias :as_json :to_h
def to_json(*a)
- as_json.to_json(*a)
+ to_h.to_json(*a)
end
end
@@ -265,16 +270,17 @@ def hash
longitude.hash ^ latitude.hash
end
- def as_json(*a)
+ def to_h(*a)
{
Protocol::KEY_TYPE => Protocol::TYPE_GEOPOINT,
"latitude" => @latitude,
"longitude" => @longitude
}
end
+ alias :as_json :to_h
def to_json(*a)
- as_json.to_json(*a)
+ to_h.to_json(*a)
end
def to_s
@@ -323,16 +329,17 @@ def save
resp
end
- def as_json(*a)
+ def to_h(*a)
{
Protocol::KEY_TYPE => Protocol::TYPE_FILE,
"name" => @parse_filename,
"url" => @url
}
end
+ alias :as_json :to_h
def to_json(*a)
- as_json.to_json(*a)
+ to_h.to_json(*a)
end
end
122 lib/parse/object.rb
View
@@ -35,7 +35,7 @@ def uri
end
def pointer
- Parse::Pointer.new(self.merge(Parse::Protocol::KEY_CLASS_NAME => class_name)) unless new?
+ Parse::Pointer.new(rest_api_hash) unless new?
end
# make it easier to deal with the ambiguity of whether you're passed a pointer or object
@@ -43,68 +43,10 @@ def get
self
end
- # Merge a hash parsed from the JSON representation into
- # this instance. This will extract the reserved fields,
- # merge the hash keys, and then ensure that the reserved
- # fields do not occur in the underlying hash storage.
- def parse(data)
- if !data
- return
- end
-
- @parse_object_id ||= data[Protocol::KEY_OBJECT_ID]
-
- if data.has_key? Protocol::KEY_CREATED_AT
- @created_at = DateTime.parse data[Protocol::KEY_CREATED_AT]
- end
-
- if data.has_key? Protocol::KEY_UPDATED_AT
- @updated_at = DateTime.parse data[Protocol::KEY_UPDATED_AT]
- end
-
- data.each do |k,v|
- if k.is_a? Symbol
- k = k.to_s
- end
-
- if k != Parse::Protocol::KEY_TYPE
- self[k] = v
- end
- end
-
- self
- end
-
def new?
self["objectId"].nil?
end
- def safe_hash
- without_reserved = self.dup
- Protocol::RESERVED_KEYS.each { |k| without_reserved.delete(k) }
-
- without_relations = without_reserved
- without_relations.each do |k,v|
- if v.is_a? Hash
- if v[Protocol::KEY_TYPE] == Protocol::TYPE_RELATION
- without_relations.delete(k)
- end
- end
- end
-
- without_relations.each do |k, v|
- without_relations[k] = Parse.pointerize_value(v)
- end
-
- without_relations
- end
-
- def safe_json
- safe_hash.to_json
- end
-
- private :parse
-
# Write the current state of the local object to the API.
# If the object has never been saved before, this will create
# a new object, otherwise it will update the existing stored object.
@@ -116,7 +58,7 @@ def save
method = :post
end
- body = safe_json
+ body = safe_hash.to_json
data = Parse.client.request(self.uri, method, body)
if data
@@ -133,20 +75,36 @@ def save
self
end
- def as_json(*a)
+ # representation of object to send on saves
+ def safe_hash
Hash[self.map do |key, value|
- value = if !value.nil?
- value.respond_to?(:as_json) ? value.as_json : value
+ if Protocol::RESERVED_KEYS.include?(key)
+ nil
+ elsif value.is_a?(Hash) && value[Protocol::KEY_TYPE] == Protocol::TYPE_RELATION
+ nil
+ elsif value.nil?
+ [key, Protocol::DELETE_OP]
else
- Protocol::DELETE_OP
+ [key, Parse.pointerize_value(value)]
end
+ end.compact]
+ end
- [key, value]
+ # full REST api representation of object
+ def rest_api_hash
+ self.merge(Parse::Protocol::KEY_CLASS_NAME => class_name)
+ end
+
+ def to_h(*a)
+ Hash[rest_api_hash.map do |key, value|
+ [key, value.respond_to?(:to_h) ? value.to_h : value]
end]
end
+ alias :as_json :to_h
+ alias :to_hash :to_h
def to_json(*a)
- as_json.to_json(*a)
+ to_h.to_json(*a)
end
def to_s
@@ -220,6 +178,38 @@ def decrement(field, amount = 1)
private
+ # Merge a hash parsed from the JSON representation into
+ # this instance. This will extract the reserved fields,
+ # merge the hash keys, and then ensure that the reserved
+ # fields do not occur in the underlying hash storage.
+ def parse(data)
+ if !data
+ return
+ end
+
+ @parse_object_id ||= data[Protocol::KEY_OBJECT_ID]
+
+ if data.has_key? Protocol::KEY_CREATED_AT
+ @created_at = DateTime.parse data[Protocol::KEY_CREATED_AT]
+ end
+
+ if data.has_key? Protocol::KEY_UPDATED_AT
+ @updated_at = DateTime.parse data[Protocol::KEY_UPDATED_AT]
+ end
+
+ data.each do |k,v|
+ if k.is_a? Symbol
+ k = k.to_s
+ end
+
+ if k != Parse::Protocol::KEY_TYPE
+ self[k] = v
+ end
+ end
+
+ self
+ end
+
def array_op(field, operation, value)
raise "field #{field} not an array" if self[field] && !self[field].is_a?(Array)
12 lib/parse/query.rb
View
@@ -125,7 +125,17 @@ def get
[:count, :limit, :skip, :include].each {|a| merge_attribute(a, query)}
Parse.client.logger.info{"Parse query for #{uri} #{CGI.unescape(query.inspect)}"}
response = Parse.client.request uri, :get, nil, query
- Parse.parse_json class_name, response
+
+ if response.is_a?(Hash) && response.has_key?(Protocol::KEY_RESULTS) && response[Protocol::KEY_RESULTS].is_a?(Array)
+ parsed_results = response[Protocol::KEY_RESULTS].map{|o| Parse.parse_json(class_name, o)}
+ if response.keys.size == 1
+ parsed_results
+ else
+ response.dup.merge(Protocol::KEY_RESULTS => parsed_results)
+ end
+ else
+ raise ParseError.new("query response not a Hash with #{Protocol::KEY_RESULTS} key: #{response.class} #{response.inspect}")
+ end
end
private
8 lib/parse/util.rb
View
@@ -1,7 +1,7 @@
module Parse
# Parse a JSON representation into a fully instantiated
- # class. obj can be either a string or a Hash as parsed
+ # class. obj can be either a primitive or a Hash of primitives as parsed
# by JSON.parse
# @param class_name [Object]
# @param obj [Object]
@@ -19,8 +19,6 @@ def Parse.parse_json(class_name, obj)
# If it's a datatype hash
if obj.has_key?(Protocol::KEY_TYPE)
parse_datatype obj
- elsif obj.size == 1 && obj.has_key?(Protocol::KEY_RESULTS) && obj[Protocol::KEY_RESULTS].is_a?(Array)
- obj[Protocol::KEY_RESULTS].collect { |o| parse_json(class_name, o) }
elsif class_name # otherwise it must be a regular object, so deep parse it avoiding re-JSON.parsing raw Strings
Parse::Object.new class_name, Hash[obj.map{|k,v| [k, parse_json(nil, v)]}]
else # plain old hash
@@ -54,7 +52,9 @@ def Parse.parse_datatype(obj)
def Parse.pointerize_value(obj)
if obj.kind_of?(Parse::Object)
- obj.pointer
+ p = obj.pointer
+ raise ArgumentError.new("new object used in context requiring pointer #{obj}") unless p
+ p
elsif obj.is_a?(Array)
obj.map do |v|
Parse.pointerize_value(v)
16 parse-ruby-client.gemspec
View
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
s.authors = ["Alan deLevie", "Adam Alpern"]
- s.date = "2013-05-22"
+ s.date = "2013-07-01"
s.description = "A simple Ruby client for the parse.com REST API"
s.email = "adelevie@gmail.com"
s.extra_rdoc_files = [
@@ -34,8 +34,8 @@ Gem::Specification.new do |s|
"fixtures/vcr_cassettes/test_batch_create_object.yml",
"fixtures/vcr_cassettes/test_batch_delete_object.yml",
"fixtures/vcr_cassettes/test_batch_run.yml",
+ "fixtures/vcr_cassettes/test_batch_update_nils_delete_keys.yml",
"fixtures/vcr_cassettes/test_batch_update_object.yml",
- "fixtures/vcr_cassettes/test_circular_save.yml",
"fixtures/vcr_cassettes/test_created_at.yml",
"fixtures/vcr_cassettes/test_decrement.yml",
"fixtures/vcr_cassettes/test_deep_parse.yml",
@@ -52,12 +52,14 @@ Gem::Specification.new do |s|
"fixtures/vcr_cassettes/test_pointer.yml",
"fixtures/vcr_cassettes/test_save_with_sub_objects.yml",
"fixtures/vcr_cassettes/test_saving_boolean_values.yml",
+ "fixtures/vcr_cassettes/test_saving_nested_objects.yml",
"fixtures/vcr_cassettes/test_server_update.yml",
"fixtures/vcr_cassettes/test_simple_save.yml",
"fixtures/vcr_cassettes/test_text_file_save.yml",
"fixtures/vcr_cassettes/test_update.yml",
"fixtures/vcr_cassettes/test_updated_at.yml",
"fixtures/vcr_cassettes/test_user_save.yml",
+ "fixtures/vcr_cassettes/test_xget.yml",
"lib/parse-ruby-client.rb",
"lib/parse/batch.rb",
"lib/parse/client.rb",
@@ -93,11 +95,11 @@ Gem::Specification.new do |s|
s.homepage = "http://github.com/adelevie/parse-ruby-client"
s.licenses = ["MIT"]
s.require_paths = ["lib"]
- s.rubygems_version = "1.8.24"
+ s.rubygems_version = "2.0.3"
s.summary = "A simple Ruby client for the parse.com REST API"
if s.respond_to? :specification_version then
- s.specification_version = 3
+ s.specification_version = 4
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<patron>, [">= 0"])
@@ -106,7 +108,7 @@ Gem::Specification.new do |s|
s.add_development_dependency(%q<shoulda>, [">= 0"])
s.add_development_dependency(%q<test-unit>, ["= 2.5.0"])
s.add_development_dependency(%q<mocha>, ["= 0.12.0"])
- s.add_development_dependency(%q<jeweler>, [">= 0"])
+ s.add_development_dependency(%q<jeweler>, ["~> 1.8.5"])
s.add_development_dependency(%q<simplecov>, [">= 0"])
s.add_development_dependency(%q<webmock>, [">= 0"])
s.add_development_dependency(%q<vcr>, [">= 0"])
@@ -117,7 +119,7 @@ Gem::Specification.new do |s|
s.add_dependency(%q<shoulda>, [">= 0"])
s.add_dependency(%q<test-unit>, ["= 2.5.0"])
s.add_dependency(%q<mocha>, ["= 0.12.0"])
- s.add_dependency(%q<jeweler>, [">= 0"])
+ s.add_dependency(%q<jeweler>, ["~> 1.8.5"])
s.add_dependency(%q<simplecov>, [">= 0"])
s.add_dependency(%q<webmock>, [">= 0"])
s.add_dependency(%q<vcr>, [">= 0"])
@@ -129,7 +131,7 @@ Gem::Specification.new do |s|
s.add_dependency(%q<shoulda>, [">= 0"])
s.add_dependency(%q<test-unit>, ["= 2.5.0"])
s.add_dependency(%q<mocha>, ["= 0.12.0"])
- s.add_dependency(%q<jeweler>, [">= 0"])
+ s.add_dependency(%q<jeweler>, ["~> 1.8.5"])
s.add_dependency(%q<simplecov>, [">= 0"])
s.add_dependency(%q<webmock>, [">= 0"])
s.add_dependency(%q<vcr>, [">= 0"])
20 test/test_batch.rb
View
@@ -5,6 +5,11 @@ class TestBatch < ParseTestCase
def test_initialize
batch = Parse::Batch.new
assert_equal batch.class, Parse::Batch
+ assert_equal Parse.client, batch.client
+
+ batch = Parse::Batch.new(Parse::Client.new)
+ assert_equal batch.class, Parse::Batch
+ assert_not_equal Parse.client, batch.client
end
def test_add_request
@@ -91,6 +96,21 @@ def test_update_object
end
end
+ def test_update_nils_delete_keys
+ VCR.use_cassette('test_batch_update_nils_delete_keys', :record => :new_episodes) do
+ post = Parse::Object.new("BatchTestObject")
+ post["foo"] = "1"
+ post.save
+
+ post["foo"] = nil
+ batch = Parse::Batch.new
+ batch.update_object(post)
+ batch.run!
+
+ assert_false post.refresh.keys.include?("foo")
+ end
+ end
+
def test_delete_object
VCR.use_cassette('test_batch_delete_object', :record => :new_episodes) do
objects = [1, 2, 3, 4, 5].map do |i|
11 test/test_datatypes.rb
View
@@ -18,14 +18,13 @@ def test_pointer_make
end
def test_date
- date_time = DateTime.now
- data = date_time
- parse_date = Parse::Date.new data
+ date_time = Time.at(0).to_datetime
+ parse_date = Parse::Date.new(date_time)
- assert_equal parse_date.value, date_time
- assert_equal JSON.parse(parse_date.to_json)["iso"], date_time.iso8601(3)
+ assert_equal date_time, parse_date.value
+ assert_equal "1970-01-01T00:00:00.000Z", JSON.parse(parse_date.to_json)["iso"]
assert_equal 0, parse_date <=> parse_date
- assert_equal 0, Parse::Date.new(data) <=> Parse::Date.new(data)
+ assert_equal 0, Parse::Date.new(date_time) <=> Parse::Date.new(date_time)
post = Parse::Object.new("Post")
post["time"] = parse_date
23 test/test_object.rb
View
@@ -143,11 +143,19 @@ def test_nils_delete_keys
end
end
+ def test_saving_nested_objects
+ VCR.use_cassette('test_saving_nested_objects', :record => :new_episodes) do
+ post = Parse::Object.new "Post"
+ post["comment"] = Parse::Object.new("Comment", "text" => "testing")
+ assert_raise{post.save}
+ end
+ end
+
def test_boolean_values_as_json
post = Parse::Object.new "Post"
post["read"] = false
post["published"] = true
- safe_json_hash = JSON.parse post.safe_json
+ safe_json_hash = JSON.parse post.safe_hash.to_json
assert_equal false, safe_json_hash["read"]
assert_equal true, safe_json_hash["published"]
end
@@ -269,17 +277,4 @@ def test_save_with_sub_objects
assert_equal 'baz', bar['baz']
end
end
-
- def test_circular_save
- VCR.use_cassette('test_circular_save', :record => :new_episodes) do
- bar = Parse::Object.new("CircularBar", "text" => "bar")
- bar_2 = Parse::Object.new("CircularBar", "bar" => bar, "text" => "bar_2")
- bar_2.save
- bar['bar'] = bar_2
- assert bar.save
-
- assert_equal "bar_2", bar["bar"]["text"]
- assert_equal "bar", bar["bar"]["bar"]["text"]
- end
- end
end
30 test/test_query.rb
View
@@ -2,6 +2,8 @@
class TestQuery < ParseTestCase
+ EMPTY_QUERY_RESPONSE = {Parse::Protocol::KEY_RESULTS => []}
+
def test_get
VCR.use_cassette('test_get', :record => :new_episodes) do
post = Parse::Object.new "Post"
@@ -64,7 +66,7 @@ def test_limit_skip
q.limit = 2
q.skip = 3
query_matcher = has_entries(:limit => 2, :skip => 3)
- Parse::Client.any_instance.expects(:request).with(anything, :get, nil, query_matcher).returns({}.to_json)
+ Parse::Client.any_instance.expects(:request).with(anything, :get, nil, query_matcher).returns(EMPTY_QUERY_RESPONSE)
q.get
end
end
@@ -74,8 +76,9 @@ def test_count
q = Parse::Query.new "TestQuery"
q.count = true
query_matcher = has_entries(:count => true)
- Parse::Client.any_instance.expects(:request).with(anything, :get, nil, query_matcher).returns({}.to_json)
- q.get
+ Parse::Client.any_instance.expects(:request).with(anything, :get, nil, query_matcher).returns(EMPTY_QUERY_RESPONSE.merge("count" => 1000))
+ results = q.get
+ assert_equal 1000, results['count']
end
end
@@ -124,4 +127,25 @@ def test_in_query
outer_query.in_query("inner", inner_query)
assert_equal({"inner"=>{"$inQuery"=>{"className"=>"Inner", "where"=>{"foo"=>"bar"}}}}, outer_query.where)
end
+
+ def test_large_value_in_xget
+ VCR.use_cassette('test_xget', :record => :new_episodes) do
+ post = Parse::Object.new("Post")
+ post.save
+
+ other_post = Parse::Object.new("Post")
+ other_post.save
+
+ assert_equal [post], Parse::Query.new("Post").value_in("objectId", [post.id] + 5000.times.map { "x" }).get
+ end
+ end
+
+ def test_bad_response
+ VCR.use_cassette('test_bad_response', :record => :new_episodes) do
+ Parse::Client.any_instance.expects(:request).returns("crap")
+ assert_raises do
+ Parse::Query.new("Post").get
+ end
+ end
+ end
end
Something went wrong with that request. Please try again.