Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #3720 (closed defect: duplicate)

Opened 3 years ago

Last modified 3 years ago

[PATCH] build_query_string chokes on multidimensional hashes

Reported by: gabriel@gironda.org Assigned to: ulysses
Priority: normal Milestone:
Component: ActionPack Version: 1.0.0
Severity: normal Keywords:
Cc:

Description

If you've built a form using the ActiveRecord form helpers and as such have form elements called "some_object[some_attribute]" and make the form use GET rather than POST, you'll encounter trouble when trying to use the URL rewriter. This is because there's now another hash in the parameters hash, which it doesn't handle properly. It will make a mess of the query string and it will no longer work as expected.

It's 6:13 AM and I've been up hacking most of the night so that summary might not make as much sense, but I have attached a patch to fix the problem which also adds a unit test that illustrates how the issue is encountered.

Attachments

build_query_string_hash_patch.diff (1.9 kB) - added by gabriel@gironda.org on 02/03/06 19:16:38.
rails_url_rewriter.2.diff (2.9 kB) - added by redbeard@gmail.com on 03/04/06 12:40:54.
Patch from #3843

Change History

02/03/06 19:16:38 changed by gabriel@gironda.org

  • attachment build_query_string_hash_patch.diff added.

02/05/06 11:42:46 changed by gabriel@gironda.org

  • summary changed from build_query_string chokes on multidimensional hashes to [PATCH] build_query_string chokes on multidimensional hashes.

02/15/06 21:49:23 changed by redbeard@gmail.com

Some comments on your patch:

Performance:

You brute force the solution by iterating the hash at least once more before the elements are built, when the solution can be integrated into the current element building loop. As url_for(..) is a method that is called quite often (almost every link generated), every extra performance loss will be felt in your application.

Code style:

You should read the patch code-style guidlines.


Overall, I prefer my patch: http://dev.rubyonrails.org/ticket/3843

02/19/06 04:15:30 changed by david

  • owner changed from David to nseckar@gmail.com.
  • priority changed from high to normal.
  • severity changed from major to normal.

03/04/06 05:01:00 changed by ulysses

  • status changed from new to closed.
  • resolution set to duplicate.

Moving discussion to #3843

03/04/06 12:40:54 changed by redbeard@gmail.com

  • attachment rails_url_rewriter.2.diff added.

Patch from #3843

07/24/06 03:12:30 changed by anonymous

blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2 blog2

08/05/06 02:54:58 changed by anonymous

dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao dengpao