Merge join doesn't seem to break early when I (and planner) think it should - 10.4
Timothy Garnett <[email protected]> Thu, 26 Dec 2019 15:07:41 -0500
| Newsgroups | gmane.comp.db.postgresql.performance |
|---|---|
| Message-ID | <CAPcyiQ1we9wt+FzTQwkbEv9ZrckMhJ6bo0ECT3cod9g5mFh_Uw@mail.gmail.com> |
--00000000000085c0fd059aa0efff
Content-Type: text/plain; charset="UTF-8"
Hi all,
Query plan quick link: https://explain.depesz.com/s/JVxn
Version: PostgreSQL 10.4 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu
5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609, 64-bit
tbl: ~780 million rows, bigint primary key (keytbl), col1 is smallint and
there is an index on (col1, col2)
tmp_tbl: ~10 million rows; columns are identical to tbl, no indices or
primary key
Both tables are analyzed.
I'm doing an update of tbl from tmp_tbl joining on the primary key column
of tbl. The planner picks a merge join which takes about 4 hours. If I
force it to use a hash join instead (set local enable_mergejoin=false) it
takes about 2.5 minutes (see https://explain.depesz.com/s/vtLe for
resulting plan, it's my current workaround). The index scan done for the
merge join below [*] is what eats up the time and planner knows it's
expensive [*], but I think it expects it to stop early [**], however it
appears to index scan the entire table based on the rows removed by the
filter [***] and the time taken. I don't think the planner's wrong here,
the merge join should break early, the max value of keytbl in tmp_tbl is
less than all but a small portion of tbl (see **** below). So I think it
should have to only go ~12.5 million rows into the index scan before
stopping. Continued below...
explain analyze:
Update on schema.tbl t (cost=5831491.55..7428707.35 rows=120536 width=523)
(actual time=12422900.337..12422900.337 rows=0 loops=1)
-> Merge Join (cost=5831491.55..*7428707.35[**]* rows=120536 width=523)
(actual time=121944.122..12406202.383 rows=86663 loops=1)
Merge Cond: (t.keytbl = tt.keytbl)
Join Filter: <removed, see link>
Rows Removed by Join Filter: 9431176
-> Index Scan using tbl_pkey on schema.tbl t (cost=0.57..
*302404355.44[*]* rows=9680745 width=273) (actual
time=99112.377..12354593.205 rows=9517839 loops=1)
Filter: (t.col1 = ANY ('{13,14}'::integer[]))
Rows Removed by Filter: *769791484[***]*
-> Materialize (cost=2807219.47..2855692.46 rows=9694598
width=489) (actual time=19432.549..31462.007 rows=9616269 loops=1)
-> Sort (cost=2807219.47..2831455.96 rows=9694598
width=489) (actual time=19432.537..23493.665 rows=9616269 loops=1)
Sort Key: tt.keytbl
Sort Method: quicksort Memory: 3487473kB
-> Seq Scan on schema.tmp_tbl tt
(cost=0.00..389923.98 rows=9694598 width=489) (actual time=0.023..8791.086
rows=9692217 loops=1)
Planning time: 4.454 ms
Execution time: 12438992.607 ms
select max(keytbl) from tmp_tbl;
max 3940649685073901
select count(*) from tbl where keytbl <= 3940649685073901;
count *12454354 [*****]
select max(keytbl) from tbl;
max 147211412825225362
So far I've been unable to create a smaller / toy example that exhibits the
same behavior. Some things that may be unusual about the situation: keytbl
is bigint and the values are large (all are > 2^48) and sparse/dense (big
chunks where the id advances by 1 separated by large (> 2^48) regions with
no rows), the top 200k or so rows of tmp_table by keytbl don't have a
corresponding row in tbl, and this is a bit of an older dot release
(10.4). I have a workaround (disabling merge join for the query) so I'm
mostly trying to figure out what's going on and if I'm understanding the
situation correctly.
It's interesting that even if it worked as expected, the merge join plan
seems a lot riskier in that if the analyze didn't catch a single large
outlier value of keytbl in tmp_tbl or a row with a large value for keytbl
was inserted into tmp_tbl since the last analyze it could be forced to walk
the entire index of the tbl (which based on the filter count looks like it
involves touching each row of this large table for the filter even if it
doesn't have a corresponding row to merge to).
Additional info:
Table schema (for tbl and tmp_tbl)
Column | Type | Collation |
Nullable | Default
-------------------------------+-----------------------------+-----------+----------+-------------------
keytbl | bigint | |
not null |
| smallint | |
not null |
col1 | smallint | |
not null |
col2 | integer | |
not null |
| integer | |
|
| integer | |
|
| character varying(100) | |
|
| character varying(100) | |
|
| date | |
not null |
| integer | |
|
| smallint | |
|
| smallint | |
|
| integer | |
|
| smallint | |
|
| bigint | |
|
| smallint | |
|
| character varying(2) | |
|
| text | |
|
| character varying(3) | |
|
| numeric(14,2) | |
|
| smallint | |
|
| numeric(13,3) | |
|
| smallint | |
|
| boolean | |
|
| smallint | |
|
| character varying(2) | |
|
| smallint | |
|
| character varying(2) | |
|
| smallint | |
|
| integer | |
|
| integer | |
|
| bigint | |
|
| smallint | |
not null | 0
| timestamp without time zone | |
not null | CURRENT_TIMESTAMP
| timestamp without time zone | |
not null | CURRENT_TIMESTAMP
| timestamp without time zone | |
not null | CURRENT_TIMESTAMP
| timestamp without time zone | |
not null | CURRENT_TIMESTAMP
| integer | |
|
| integer | |
|
| integer | |
|
Indexes (tbl only, not on tmp_tbl):
"xxxx" PRIMARY KEY, btree (keytbl)
"index_1" UNIQUE, btree (col1, col2)
"index_2" btree (x, z DESC) WHERE x IS NOT NULL
"index_3" btree (y, z DESC) WHERE y IS NOT NULL
Query:
explain analyze verbose
UPDATE "tbl" t
SET xxxxx
FROM "tmp_tbl" tt
WHERE t."keytbl" = tt."keytbl" AND t.col1 IN (13,14) AND (xxx)
Thanks,
Tim
--00000000000085c0fd059aa0efff
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: base64
PGRpdiBkaXI9Imx0ciI+SGkgYWxsLDxkaXY+PGJyPjwvZGl2PjxkaXY+UXVlcnkgcGxhbiBxdWlj
ayBsaW5rOsKgPGEgaHJlZj0iaHR0cHM6Ly9leHBsYWluLmRlcGVzei5jb20vcy9KVnhuIj5odHRw
czovL2V4cGxhaW4uZGVwZXN6LmNvbS9zL0pWeG48L2E+PC9kaXY+PGRpdj5WZXJzaW9uOiBQb3N0
Z3JlU1FMIDEwLjQgb24geDg2XzY0LXBjLWxpbnV4LWdudSwgY29tcGlsZWQgYnkgZ2NjIChVYnVu
dHUgNS40LjAtNnVidW50dTF+MTYuMDQuMTApIDUuNC4wIDIwMTYwNjA5LCA2NC1iaXQ8L2Rpdj48
ZGl2Pjxicj48L2Rpdj48ZGl2PnRibDogfjc4MCBtaWxsaW9uIHJvd3MsIGJpZ2ludCBwcmltYXJ5
IGtleSAoa2V5dGJsKSwgY29sMSBpcyBzbWFsbGludCBhbmQgdGhlcmUgaXMgYW4gaW5kZXggb24g
KGNvbDEsIGNvbDIpPC9kaXY+PGRpdj50bXBfdGJsOiB+MTAgbWlsbGlvbiByb3dzOyBjb2x1bW5z
IGFyZSBpZGVudGljYWwgdG8gdGJsLCBubyBpbmRpY2VzIG9yIHByaW1hcnkga2V5PC9kaXY+PGRp
dj5Cb3RoIHRhYmxlcyBhcmUgYW5hbHl6ZWQuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JJiMz
OTttIGRvaW5nIGFuIHVwZGF0ZSBvZiB0YmwgZnJvbSB0bXBfdGJsIGpvaW5pbmcgb24gdGhlIHBy
aW1hcnkga2V5IGNvbHVtbiBvZiB0YmwuwqAgVGhlIHBsYW5uZXIgcGlja3MgYSBtZXJnZSBqb2lu
IHdoaWNoIHRha2VzIGFib3V0IDQgaG91cnMuIElmIEkgZm9yY2UgaXQgdG8gdXNlIGEgaGFzaCBq
b2luIGluc3RlYWQgKHNldCBsb2NhbCBlbmFibGVfbWVyZ2Vqb2luPWZhbHNlKSBpdCB0YWtlcyBh
Ym91dCAyLjUgbWludXRlcyAoc2VlwqA8YSBocmVmPSJodHRwczovL2V4cGxhaW4uZGVwZXN6LmNv
bS9zL3Z0TGUiPmh0dHBzOi8vZXhwbGFpbi5kZXBlc3ouY29tL3MvdnRMZTwvYT4gZm9yIHJlc3Vs
dGluZyBwbGFuLCBpdCYjMzk7cyBteSBjdXJyZW50IHdvcmthcm91bmQpLsKgIFRoZSBpbmRleCBz
Y2FuIGRvbmUgZm9yIHRoZSBtZXJnZSBqb2luIGJlbG93IFsqXSBpcyB3aGF0IGVhdHPCoCB1cCB0
aGUgdGltZSBhbmQgcGxhbm5lciBrbm93cyBpdCYjMzk7cyBleHBlbnNpdmUgWypdLCBidXQgSSB0
aGluayBpdCBleHBlY3RzIGl0IHRvIHN0b3AgZWFybHkgWyoqXSwgaG93ZXZlciBpdCBhcHBlYXJz
IHRvIGluZGV4IHNjYW4gdGhlIGVudGlyZSB0YWJsZSBiYXNlZCBvbiB0aGUgcm93cyByZW1vdmVk
IGJ5IHRoZSBmaWx0ZXIgWyoqKl0gYW5kIHRoZSB0aW1lIHRha2VuLsKgIEkgZG9uJiMzOTt0IHRo
aW5rIHRoZSBwbGFubmVyJiMzOTtzIHdyb25nIGhlcmUsIHRoZSBtZXJnZSBqb2luIHNob3VsZCBi
cmVhayBlYXJseSwgdGhlIG1heCB2YWx1ZSBvZiBrZXl0YmzCoGluIHRtcF90YmwgaXMgbGVzcyB0
aGFuIGFsbCBidXQgYSBzbWFsbCBwb3J0aW9uIG9mIHRibCAoc2VlICoqKiogYmVsb3cpLiBTbyBJ
IHRoaW5rIGl0IHNob3VsZCBoYXZlIHRvIG9ubHkgZ28gfjEyLjUgbWlsbGlvbiByb3dzIGludG8g
dGhlIGluZGV4IHNjYW4gYmVmb3JlIHN0b3BwaW5nLiBDb250aW51ZWQgYmVsb3cuLi48L2Rpdj48
ZGl2Pjxicj48L2Rpdj48ZGl2PmV4cGxhaW4gYW5hbHl6ZTo8L2Rpdj48ZGl2Pjxmb250IGZhY2U9
Im1vbm9zcGFjZSI+VXBkYXRlIG9uIHNjaGVtYS50YmwgdCDCoChjb3N0PTU4MzE0OTEuNTUuLjc0
Mjg3MDcuMzUgcm93cz0xMjA1MzYgd2lkdGg9NTIzKSAoYWN0dWFsIHRpbWU9MTI0MjI5MDAuMzM3
Li4xMjQyMjkwMC4zMzcgcm93cz0wIGxvb3BzPTEpPGJyPsKgIC0mZ3Q7IMKgTWVyZ2UgSm9pbiDC
oChjb3N0PTU4MzE0OTEuNTUuLjxiPjc0Mjg3MDcuMzVbKipdPC9iPiByb3dzPTEyMDUzNiB3aWR0
aD01MjMpIChhY3R1YWwgdGltZT0xMjE5NDQuMTIyLi4xMjQwNjIwMi4zODMgcm93cz04NjY2MyBs
b29wcz0xKTxicj7CoCDCoCDCoCDCoCBNZXJnZSBDb25kOiAodC5rZXl0YmwgPSB0dC5rZXl0Ymwp
PGJyPsKgIMKgIMKgIMKgIEpvaW4gRmlsdGVyOiAmbHQ7cmVtb3ZlZCwgc2VlIGxpbmsmZ3Q7PGJy
PsKgIMKgIMKgIMKgIFJvd3MgUmVtb3ZlZCBieSBKb2luIEZpbHRlcjogOTQzMTE3Njxicj7CoCDC
oCDCoCDCoCAtJmd0OyDCoEluZGV4IFNjYW4gdXNpbmcgdGJsX3BrZXkgb24gc2NoZW1hLnRibCB0
IMKgKGNvc3Q9MC41Ny4uPGI+MzAyNDA0MzU1LjQ0WypdPC9iPsKgcm93cz05NjgwNzQ1IHdpZHRo
PTI3MykgKGFjdHVhbCB0aW1lPTk5MTEyLjM3Ny4uMTIzNTQ1OTMuMjA1IHJvd3M9OTUxNzgzOSBs
b29wcz0xKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCBGaWx0ZXI6ICh0LmNvbDEgPSBBTlkgKCYj
Mzk7ezEzLDE0fSYjMzk7OjppbnRlZ2VyW10pKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCBSb3dz
IFJlbW92ZWQgYnkgRmlsdGVyOiA8Yj43Njk3OTE0ODRbKioqXTwvYj48YnI+wqAgwqAgwqAgwqAg
LSZndDsgwqBNYXRlcmlhbGl6ZSDCoChjb3N0PTI4MDcyMTkuNDcuLjI4NTU2OTIuNDYgcm93cz05
Njk0NTk4IHdpZHRoPTQ4OSkgKGFjdHVhbCB0aW1lPTE5NDMyLjU0OS4uMzE0NjIuMDA3IHJvd3M9
OTYxNjI2OSBsb29wcz0xKTxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCAtJmd0OyDCoFNvcnQgwqAo
Y29zdD0yODA3MjE5LjQ3Li4yODMxNDU1Ljk2IHJvd3M9OTY5NDU5OCB3aWR0aD00ODkpIChhY3R1
YWwgdGltZT0xOTQzMi41MzcuLjIzNDkzLjY2NSByb3dzPTk2MTYyNjkgbG9vcHM9MSk8YnI+wqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgU29ydCBLZXk6IHR0LmtleXRibDxicj7CoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBTb3J0IE1ldGhvZDogcXVpY2tzb3J0IMKgTWVtb3J5OiAz
NDg3NDcza0I8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLSZndDsgwqBTZXEgU2Nh
biBvbiBzY2hlbWEudG1wX3RibCB0dCDCoChjb3N0PTAuMDAuLjM4OTkyMy45OCByb3dzPTk2OTQ1
OTggd2lkdGg9NDg5KSAoYWN0dWFsIHRpbWU9MC4wMjMuLjg3OTEuMDg2IHJvd3M9OTY5MjIxNyBs
b29wcz0xKTxicj5QbGFubmluZyB0aW1lOiA0LjQ1NCBtczxicj5FeGVjdXRpb24gdGltZTogMTI0
Mzg5OTIuNjA3IG1zPC9mb250Pjxicj48L2Rpdj48ZGl2Pjxmb250IGZhY2U9Im1vbm9zcGFjZSI+
PGJyPjwvZm9udD48L2Rpdj48ZGl2Pjxmb250IGZhY2U9Im1vbm9zcGFjZSI+PC9mb250PjwvZGl2
PjxkaXY+PGZvbnQgZmFjZT0ibW9ub3NwYWNlIj48c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xv
cjpyZ2IoMjU1LDI1NSwyNTUpO2ZvbnQtc2l6ZTpzbWFsbDtmb250LXN0eWxlOm5vcm1hbDtmb250
LXZhcmlhbnQtbGlnYXR1cmVzOm5vcm1hbDtmb250LXZhcmlhbnQtY2Fwczpub3JtYWw7Zm9udC13
ZWlnaHQ6bm9ybWFsO2xldHRlci1zcGFjaW5nOm5vcm1hbDtjb2xvcjpyZ2IoMzQsMzQsMzQpO2Zs
b2F0Om5vbmU7ZGlzcGxheTppbmxpbmUhaW1wb3J0YW50Ij5zZWxlY3QgbWF4KDwvc3Bhbj5rZXl0
YmwpIGZyb20gdG1wX3RibDs8L2ZvbnQ+PC9kaXY+PGRpdj48Zm9udCBmYWNlPSJtb25vc3BhY2Ui
PsKgIG1heCDCoCDCoCDCoCDCoMKgMzk0MDY0OTY4NTA3MzkwMTxicj5zZWxlY3QgY291bnQoKikg
ZnJvbSB0Ymwgd2hlcmUga2V5dGJsICZsdDs9IDM5NDA2NDk2ODUwNzM5MDE7PGJyPsKgIGNvdW50
wqAgwqAgwqDCoMKgPGI+MTI0NTQzNTQgWzwvYj48L2ZvbnQ+KioqKl08Zm9udCBmYWNlPSJtb25v
c3BhY2UiPjxicj48L2ZvbnQ+PC9kaXY+PGRpdj48Zm9udCBmYWNlPSJtb25vc3BhY2UiPnNlbGVj
dCBtYXgoa2V5dGJsKSBmcm9tIHRibDs8YnI+wqAgbWF4IMKgIMKgIMKgIMKgIDE0NzIxMTQxMjgy
NTIyNTM2MjwvZm9udD48YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRp
dj5TbyBmYXIgSSYjMzk7dmUgYmVlbiB1bmFibGUgdG8gY3JlYXRlIGEgc21hbGxlciAvIHRveSBl
eGFtcGxlIHRoYXQgZXhoaWJpdHMgdGhlIHNhbWUgYmVoYXZpb3IuIFNvbWUgdGhpbmdzIHRoYXQg
bWF5IGJlIHVudXN1YWwgYWJvdXQgdGhlIHNpdHVhdGlvbjoga2V5dGJsIGlzIGJpZ2ludCBhbmQg
dGhlIHZhbHVlcyBhcmUgbGFyZ2UgKGFsbCBhcmUgJmd0OyAyXjQ4KSBhbmQgc3BhcnNlL2RlbnNl
IChiaWcgY2h1bmtzIHdoZXJlIHRoZSBpZCBhZHZhbmNlcyBieSAxIHNlcGFyYXRlZCBieSBsYXJn
ZSAoJmd0OyAyXjQ4KSByZWdpb25zIHdpdGggbm8gcm93cyksIHRoZSB0b3AgMjAwayBvciBzbyBy
b3dzIG9mIHRtcF90YWJsZSBieSBrZXl0YmwgZG9uJiMzOTt0IGhhdmUgYSBjb3JyZXNwb25kaW5n
IHJvdyBpbiB0YmwsIGFuZCB0aGlzIGlzIGEgYml0IG9mIGFuIG9sZGVyIGRvdCByZWxlYXNlICgx
MC40KS7CoCBJIGhhdmUgYSB3b3JrYXJvdW5kIChkaXNhYmxpbmcgbWVyZ2Ugam9pbiBmb3IgdGhl
IHF1ZXJ5KSBzbyBJJiMzOTttIG1vc3RseSB0cnlpbmcgdG8gZmlndXJlIG91dCB3aGF0JiMzOTtz
IGdvaW5nIG9uIGFuZCBpZiBJJiMzOTttIHVuZGVyc3RhbmRpbmcgdGhlIHNpdHVhdGlvbiBjb3Jy
ZWN0bHkuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5JdCYjMzk7cyBpbnRlcmVzdGluZyB0aGF0
IGV2ZW4gaWYgaXQgd29ya2VkIGFzIGV4cGVjdGVkLCB0aGUgbWVyZ2Ugam9pbiBwbGFuIHNlZW1z
IGEgbG90IHJpc2tpZXIgaW4gdGhhdCBpZiB0aGUgYW5hbHl6ZSBkaWRuJiMzOTt0IGNhdGNoIGEg
c2luZ2xlIGxhcmdlIG91dGxpZXIgdmFsdWUgb2Yga2V5dGJswqBpbiB0bXBfdGJsIG9yIGEgcm93
IHdpdGggYSBsYXJnZSB2YWx1ZSBmb3Iga2V5dGJsIHdhcyBpbnNlcnRlZCBpbnRvIHRtcF90Ymwg
c2luY2UgdGhlIGxhc3QgYW5hbHl6ZSBpdCBjb3VsZCBiZSBmb3JjZWQgdG8gd2FsayB0aGUgZW50
aXJlIGluZGV4IG9mIHRoZSB0YmwgKHdoaWNoIGJhc2VkIG9uIHRoZSBmaWx0ZXIgY291bnQgbG9v
a3MgbGlrZSBpdCBpbnZvbHZlcyB0b3VjaGluZyBlYWNoIHJvdyBvZiB0aGlzIGxhcmdlIHRhYmxl
IGZvciB0aGUgZmlsdGVyIGV2ZW4gaWYgaXQgZG9lc24mIzM5O3QgaGF2ZSBhIGNvcnJlc3BvbmRp
bmcgcm93IHRvIG1lcmdlIHRvKS48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkFkZGl0aW9uYWwg
aW5mbzo8L2Rpdj48ZGl2PlRhYmxlIHNjaGVtYSAoZm9yIHRibCBhbmQgdG1wX3RibCk8L2Rpdj48
ZGl2Pjxmb250IGZhY2U9Im1vbm9zcGFjZSI+wqAgwqAgwqAgwqAgwqAgwqAgQ29sdW1uIMKgIMKg
IMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqAgwqBUeXBlIMKgIMKgIMKgIMKgIMKgIMKgIHwg
Q29sbGF0aW9uIHwgTnVsbGFibGUgfCDCoCDCoCDCoERlZmF1bHQgwqAgwqAgwqA8YnI+LS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSst
LS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS08YnI+wqBrZXl0YmwgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8IGJpZ2ludCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoHwgwqAgwqAgwqAgwqAgwqAgfCBub3QgbnVsbCB8IDxicj7CoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgc21hbGxpbnQgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8IMKgIMKgIMKgIMKgIMKgIHwgbm90IG51bGwgfCA8YnI+
wqBjb2wxIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfCBzbWFsbGludCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgwqAgwqAgwqAgwqAgwqAgfCBub3QgbnVsbCB8
IDxicj7CoGNvbDIgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8IGludGVn
ZXIgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfCDCoCDCoCDCoCDCoCDCoCB8IG5vdCBu
dWxsIHwgPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
fCBpbnRlZ2VyIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqAg
fCDCoCDCoCDCoCDCoCDCoHwgPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgfCBpbnRlZ2VyIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHwgwqAg
wqAgwqAgwqAgwqAgfCDCoCDCoCDCoCDCoCDCoHwgPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfCBjaGFyYWN0ZXIgdmFyeWluZygxMDApIMKgIMKgIMKg
fCDCoCDCoCDCoCDCoCDCoCB8IMKgIMKgIMKgIMKgIMKgfCA8YnI+wqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8IGNoYXJhY3RlciB2YXJ5aW5nKDEwMCkgwqAg
wqAgwqB8IMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqB8IDxicj7CoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgZGF0ZSDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoHwgwqAgwqAgwqAgwqAgwqAgfCBub3QgbnVsbCB8IDxicj7CoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgaW50ZWdlciDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB8IMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAg
wqB8IDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwg
c21hbGxpbnQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8IMKgIMKgIMKgIMKgIMKgIHwg
wqAgwqAgwqAgwqAgwqB8IDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoHwgc21hbGxpbnQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8IMKgIMKg
IMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqB8IDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgaW50ZWdlciDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCB8IMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqB8IDxicj7CoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgc21hbGxpbnQgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqB8IMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqB8IDxicj7C
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgYmlnaW50IMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfCDCoCDCoCDCoCDCoCDCoCB8IMKgIMKgIMKg
IMKgIMKgfCA8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqB8IHNtYWxsaW50IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfCDCoCDCoCDCoCDCoCDC
oCB8IMKgIMKgIMKgIMKgIMKgfCA8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqB8IGNoYXJhY3RlciB2YXJ5aW5nKDIpIMKgIMKgIMKgIMKgfCDCoCDCoCDC
oCDCoCDCoCB8IMKgIMKgIMKgIMKgIMKgfCA8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqB8IHRleHQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqB8IMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqB8IDxicj7CoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgY2hhcmFjdGVyIHZhcnlpbmcoMykg
wqAgwqAgwqAgwqB8IMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqB8IDxicj7CoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgbnVtZXJpYygxNCwyKSDC
oCDCoCDCoCDCoCDCoCDCoCDCoCB8IMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqB8IDxi
cj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgc21hbGxp
bnQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8IMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAg
wqAgwqAgwqB8IDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoHwgbnVtZXJpYygxMywzKSDCoCDCoCDCoCDCoCDCoCDCoCDCoCB8IMKgIMKgIMKgIMKgIMKg
IHwgwqAgwqAgwqAgwqAgwqB8IDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoHwgc21hbGxpbnQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8IMKg
IMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqB8IDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgYm9vbGVhbiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCB8IMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqB8IDxicj7CoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgc21hbGxpbnQgwqAgwqAgwqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqB8IMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqB8IDxi
cj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgY2hhcmFj
dGVyIHZhcnlpbmcoMikgwqAgwqAgwqAgwqB8IMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAg
wqB8IDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwg
c21hbGxpbnQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8IMKgIMKgIMKgIMKgIMKgIHwg
wqAgwqAgwqAgwqAgwqB8IDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoHwgY2hhcmFjdGVyIHZhcnlpbmcoMikgwqAgwqAgwqAgwqB8IMKgIMKgIMKgIMKg
IMKgIHwgwqAgwqAgwqAgwqAgwqB8IDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoHwgc21hbGxpbnQgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8
IMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqB8IDxicj7CoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgaW50ZWdlciDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCB8IMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqB8IDxicj7CoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgaW50ZWdlciDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB8IMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqB8
IDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgYmln
aW50IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfCDCoCDCoCDCoCDCoCDCoCB8IMKg
IMKgIMKgIMKgIMKgfCA8YnI+wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg
wqAgwqAgwqB8IHNtYWxsaW50IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfCDCoCDCoCDC
oCDCoCDCoCB8IG5vdCBudWxsIHwgMDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oCDCoCDCoCDCoCDCoCDCoHwgdGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lIHwgwqAgwqAgwqAg
wqAgwqAgfCBub3QgbnVsbCB8IENVUlJFTlRfVElNRVNUQU1QPGJyPsKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfCB0aW1lc3RhbXAgd2l0aG91dCB0aW1lIHpv
bmUgfCDCoCDCoCDCoCDCoCDCoCB8IG5vdCBudWxsIHwgQ1VSUkVOVF9USU1FU1RBTVA8YnI+wqAg
wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8IHRpbWVzdGFtcCB3
aXRob3V0IHRpbWUgem9uZSB8IMKgIMKgIMKgIMKgIMKgIHwgbm90IG51bGwgfCBDVVJSRU5UX1RJ
TUVTVEFNUDxicj7CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC
oHwgdGltZXN0YW1wIHdpdGhvdXQgdGltZSB6b25lIHwgwqAgwqAgwqAgwqAgwqAgfCBub3QgbnVs
bCB8IENVUlJFTlRfVElNRVNUQU1QPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgfCBpbnRlZ2VyIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHwg
wqAgwqAgwqAgwqAgwqAgfCDCoCDCoCDCoCDCoCDCoHwgPGJyPsKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfCBpbnRlZ2VyIMKgIMKgIMKgIMKgIMKgIMKgIMKg
IMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqAgfCDCoCDCoCDCoCDCoCDCoHwgPGJyPsKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfCBpbnRlZ2VyIMKgIMKgIMKg
IMKgIMKgIMKgIMKgIMKgIMKgIMKgIHwgwqAgwqAgwqAgwqAgwqAgfCDCoCDCoCDCoCDCoCDCoHwg
PGJyPkluZGV4ZXMgKHRibCBvbmx5LCBub3Qgb24gdG1wX3RibCk6PGJyPsKgIMKgICZxdW90O3h4
eHgmcXVvdDsgUFJJTUFSWSBLRVksIGJ0cmVlIChrZXl0YmwpPGJyPsKgIMKgICZxdW90O2luZGV4
XzEmcXVvdDsgVU5JUVVFLCBidHJlZSAoY29sMSwgY29sMik8YnI+wqAgwqAgJnF1b3Q7aW5kZXhf
MiZxdW90OyBidHJlZSAoeCwgeiBERVNDKSBXSEVSRSB4IElTIE5PVCBOVUxMPGJyPsKgIMKgICZx
dW90O2luZGV4XzMmcXVvdDsgYnRyZWUgKHksIHogREVTQykgV0hFUkUgeSBJUyBOT1QgTlVMTDwv
Zm9udD48YnI+PC9kaXY+PGRpdj48Zm9udCBmYWNlPSJtb25vc3BhY2UiPjxicj48L2ZvbnQ+PC9k
aXY+PGRpdj48Zm9udCBmYWNlPSJtb25vc3BhY2UiPlF1ZXJ5OjwvZm9udD48L2Rpdj48ZGl2PsKg
ZXhwbGFpbiBhbmFseXplIHZlcmJvc2XCoDwvZGl2PjxkaXY+wqAgwqAgwqAgVVBEQVRFICZxdW90
O3RibCZxdW90OyB0PGJyPsKgIMKgIMKgIMKgIMKgU0VUIHh4eHh4PGJyPsKgIMKgIMKgIMKgIEZS
T00gJnF1b3Q7dG1wX3RibCZxdW90OyB0dDxicj7CoCDCoCDCoCDCoFdIRVJFIHQuJnF1b3Q7a2V5
dGJsJnF1b3Q7ID0gdHQuJnF1b3Q7a2V5dGJsJnF1b3Q7IEFORCB0LmNvbDEgSU4gKDEzLDE0KSBB
TkQgKHh4eCk8YnI+PGZvbnQgZmFjZT0ibW9ub3NwYWNlIj48YnI+PC9mb250PjwvZGl2PjxkaXY+
PGZvbnQgZmFjZT0ibW9ub3NwYWNlIj5UaGFua3MsPC9mb250PjwvZGl2PjxkaXY+PGZvbnQgZmFj
ZT0ibW9ub3NwYWNlIj5UaW08L2ZvbnQ+PC9kaXY+PC9kaXY+DQo=
--00000000000085c0fd059aa0efff--