Anti join confusion
Hi Richard Guo
I found this path https://commitfest.postgresql.org/patch/3235/ already
supports anti join , But I've found that in many cases it doesn't work.It
always uses SubPlan Here's my testing process.
###########
create table join1 (id integer,name varchar(300),k1 integer);
create table join2 (id integer,name varchar(300),score integer);
insert into join1 values (
generate_series(1,20000),'aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',10);
insert into join1 values (
generate_series(1,20000),'aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',10);
insert into join1 values (
generate_series(1,20000),'aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',10);
insert into join1 values (
generate_series(50201,50300),'aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAASSSSSAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',10);
insert into join1 values (
generate_series(50201,50300),'aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAASSSSSAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',10);
insert into join1 values (
generate_series(150201,1350300),'aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAASSSSSAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',10);
insert into join2 values (
generate_series(1,40000),'aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',1);
insert into join2 values (
generate_series(1,40000),'aaaaaaaaaaaaaaaaAAAAAAABBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',2);
insert into join2 values (
generate_series(20001,22000),'aaaaaaaaaaaaaaaaAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',3);
insert into join2 values (
generate_series(150201,950300),'aaaaaaaaaaaaaaaaAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',3);
create index idx_j1 on join1(id);
create index idx_j2 on join2(id);
VACUUM ANALYZE JOIN1;
VACUUM ANALYZE JOIN2;
test=# explain SELECT T1.id,T1.K1 FROM join1 t1 WHERE T1.id NOT IN
(SELECT T2.id FROM join2 t2 WHERE T2.ID>10000)
test-# ;
QUERY PLAN
---------------------------------------------------------------------------------------------------------
Gather (cost=1000.42..9016319078.86 rows=630150 width=8)
Workers Planned: 2
-> Parallel Seq Scan on join1 t1 (cost=0.42..9016255063.86 rows=262562
width=8)
Filter: (NOT (ANY (id = (SubPlan 1).col1)))
SubPlan 1
-> Materialize (cost=0.42..32181.54 rows=863294 width=4)
-> Index Only Scan using idx_j2 on join2 t2
(cost=0.42..24492.07 rows=863294 width=4)
Index Cond: (id > 10000)
(8 rows)
test=# explain SELECT T1.id,T1.K1 FROM join1 t1 WHERE T1.id NOT IN
(SELECT T2.id FROM join2 t2 );
QUERY PLAN
---------------------------------------------------------------------------------------------------------
Gather (cost=1000.42..8633476697.61 rows=630150 width=8)
Workers Planned: 2
-> Parallel Seq Scan on join1 t1 (cost=0.42..8633412682.61 rows=262562
width=8)
Filter: (NOT (ANY (id = (SubPlan 1).col1)))
SubPlan 1
-> Materialize (cost=0.42..30676.42 rows=882100 width=4)
-> Index Only Scan using idx_j2 on join2 t2
(cost=0.42..22819.92 rows=882100 width=4)
(7 rows)
test=# explain SELECT T1.id,T1.K1 FROM join1 t1 WHERE T1.id NOT IN
(SELECT T2.id FROM join2 t2 where T2.ID < 1000);
QUERY PLAN
----------------------------------------------------------------------------------------
Seq Scan on join1 t1 (cost=61.73..38730.47 rows=630150 width=8)
Filter: (NOT (ANY (id = (hashed SubPlan 1).col1)))
SubPlan 1
-> Index Only Scan using idx_j2 on join2 t2 (cost=0.42..57.06
rows=1865 width=4)
Index Cond: (id < 1000)
(5 rows)
test=# explain SELECT T1.id,T1.K1 FROM join1 t1 WHERE T1.id NOT IN
(SELECT T2.id FROM join2 t2 where T2.ID = 1000);
QUERY PLAN
------------------------------------------------------------------------------------
Seq Scan on join1 t1 (cost=4.45..38673.19 rows=630150 width=8)
Filter: (NOT (ANY (id = (hashed SubPlan 1).col1)))
SubPlan 1
-> Index Only Scan using idx_j2 on join2 t2 (cost=0.42..4.44 rows=1
width=4)
Index Cond: (id = 1000)
(5 rows)
Thanks
wenhui qiu <qiuwenhuifx@gmail.com> 于2025年2月24日周一 09:48写道:
Hi Richard Guo
I found this path https://commitfest.postgresql.org/patch/3235/
already supports anti join , But I've found that in many cases it doesn't
work.It always uses SubPlan Here's my testing process.###########
create table join1 (id integer,name varchar(300),k1 integer);
create table join2 (id integer,name varchar(300),score integer);
insert into join1 values (
generate_series(1,20000),'aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',10);
insert into join1 values (
generate_series(1,20000),'aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',10);
insert into join1 values (
generate_series(1,20000),'aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',10);
insert into join1 values (
generate_series(50201,50300),'aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAASSSSSAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',10);
insert into join1 values (
generate_series(50201,50300),'aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAASSSSSAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',10);
insert into join1 values (
generate_series(150201,1350300),'aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAASSSSSAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',10);
insert into join2 values (
generate_series(1,40000),'aaaaaaaaaaaaaaaaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',1);
insert into join2 values (
generate_series(1,40000),'aaaaaaaaaaaaaaaaAAAAAAABBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',2);
insert into join2 values (
generate_series(20001,22000),'aaaaaaaaaaaaaaaaAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',3);
insert into join2 values (
generate_series(150201,950300),'aaaaaaaaaaaaaaaaAACCCCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaaAAAAAAAAAAAAAAAAAAAAaaaaaaaAAAAAAAAAAAAAAAAAAAAA',3);
create index idx_j1 on join1(id);
create index idx_j2 on join2(id);
VACUUM ANALYZE JOIN1;
VACUUM ANALYZE JOIN2;test=# explain SELECT T1.id,T1.K1 FROM join1 t1 WHERE T1.id NOT IN
(SELECT T2.id FROM join2 t2 WHERE T2.ID>10000)
test-# ;
QUERY PLAN---------------------------------------------------------------------------------------------------------
Gather (cost=1000.42..9016319078.86 rows=630150 width=8)
Workers Planned: 2
-> Parallel Seq Scan on join1 t1 (cost=0.42..9016255063.86
rows=262562 width=8)
Filter: (NOT (ANY (id = (SubPlan 1).col1)))
SubPlan 1
-> Materialize (cost=0.42..32181.54 rows=863294 width=4)
-> Index Only Scan using idx_j2 on join2 t2
(cost=0.42..24492.07 rows=863294 width=4)
Index Cond: (id > 10000)
(8 rows)test=# explain SELECT T1.id,T1.K1 FROM join1 t1 WHERE T1.id NOT IN
(SELECT T2.id FROM join2 t2 );
QUERY PLAN---------------------------------------------------------------------------------------------------------
Gather (cost=1000.42..8633476697.61 rows=630150 width=8)
Workers Planned: 2
-> Parallel Seq Scan on join1 t1 (cost=0.42..8633412682.61
rows=262562 width=8)
Filter: (NOT (ANY (id = (SubPlan 1).col1)))
SubPlan 1
-> Materialize (cost=0.42..30676.42 rows=882100 width=4)
-> Index Only Scan using idx_j2 on join2 t2
(cost=0.42..22819.92 rows=882100 width=4)
(7 rows)test=# explain SELECT T1.id,T1.K1 FROM join1 t1 WHERE T1.id NOT IN
(SELECT T2.id FROM join2 t2 where T2.ID < 1000);
QUERY PLAN----------------------------------------------------------------------------------------
Seq Scan on join1 t1 (cost=61.73..38730.47 rows=630150 width=8)
Filter: (NOT (ANY (id = (hashed SubPlan 1).col1)))
SubPlan 1
-> Index Only Scan using idx_j2 on join2 t2 (cost=0.42..57.06
rows=1865 width=4)
Index Cond: (id < 1000)
(5 rows)test=# explain SELECT T1.id,T1.K1 FROM join1 t1 WHERE T1.id NOT IN
(SELECT T2.id FROM join2 t2 where T2.ID = 1000);
QUERY PLAN------------------------------------------------------------------------------------
Seq Scan on join1 t1 (cost=4.45..38673.19 rows=630150 width=8)
Filter: (NOT (ANY (id = (hashed SubPlan 1).col1)))
SubPlan 1
-> Index Only Scan using idx_j2 on join2 t2 (cost=0.42..4.44 rows=1
width=4)
Index Cond: (id = 1000)
(5 rows)
Planner now doesn't support pulling up the "NOT IN" sublink. The "NOT IN"
sublink will be transformed into SubPlan.
--
Thanks,
Tender Wang
wenhui qiu <qiuwenhuifx@gmail.com> writes:
I found this path https://commitfest.postgresql.org/patch/3235/ already
supports anti join , But I've found that in many cases it doesn't work.It
always uses SubPlan Here's my testing process.
NOT IN is not convertible to an anti-join: the semantics are wrong
because of the way it treats nulls in the sub-select's output.
In principle you could do it if you could prove that the sub-select's
output is never null, but we need to do this transformation long
before we have enough information to make such a deduction.
regards, tom lane
HI Tom , Tender Wang
But I saw the path test case are support ,
[image: image.png]
and my test case set the id is primary key also SubPlan
test=# explain analyze SELECT T1.id,T1.K1 FROM join1 t1 WHERE T1.id NOT IN
(SELECT T2.id FROM join2 t2 where T2.ID = 1000 );
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------
Seq Scan on join1 t1 (cost=8.45..37446.94 rows=610100 width=8) (actual
time=0.071..209.875 rows=1220199 loops=1)
Filter: (NOT (ANY (id = (hashed SubPlan 1).col1)))
Rows Removed by Filter: 1
Buffers: shared hit=22190
SubPlan 1
-> Index Only Scan using join2_pkey on join2 t2 (cost=0.42..8.44
rows=1 width=4) (actual time=0.027..0.029 rows=1 loops=1)
Index Cond: (id = 1000)
Heap Fetches: 0
Buffers: shared hit=4
Planning Time: 0.245 ms
Execution Time: 247.906 ms
(11 rows)
test=# explain SELECT T1.id,T1.K1 FROM join1 t1 WHERE T1.id NOT IN
(SELECT T2.id FROM join2 t2 where T2.ID > 10000 );
QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Gather (cost=1000.42..8414945643.30 rows=610100 width=8)
Workers Planned: 2
-> Parallel Seq Scan on join1 t1 (cost=0.42..8414883633.30 rows=254208
width=8)
Filter: (NOT (ANY (id = (SubPlan 1).col1)))
SubPlan 1
-> Materialize (cost=0.42..31028.21 rows=829768 width=4)
-> Index Only Scan using join2_pkey on join2 t2
(cost=0.42..23637.37 rows=829768 width=4)
Index Cond: (id > 10000)
(8 rows)
test=# explain SELECT T1.id,T1.K1 FROM join1 t1 WHERE T1.id NOT IN
(SELECT T2.id FROM join2 t2 where T2.ID < 10000 );
QUERY PLAN
----------------------------------------------------------------------------------------------
Seq Scan on join1 t1 (cost=327.05..37765.54 rows=610100 width=8)
Filter: (NOT (ANY (id = (hashed SubPlan 1).col1)))
SubPlan 1
-> Index Only Scan using join2_pkey on join2 t2 (cost=0.42..301.22
rows=10331 width=4)
Index Cond: (id < 10000)
(5 rows)
test=#
On Mon, Feb 24, 2025 at 11:26 AM Tom Lane <tgl@sss.pgh.pa.us> wrote:
Show quoted text
wenhui qiu <qiuwenhuifx@gmail.com> writes:
I found this path https://commitfest.postgresql.org/patch/3235/
already
supports anti join , But I've found that in many cases it doesn't work.It
always uses SubPlan Here's my testing process.NOT IN is not convertible to an anti-join: the semantics are wrong
because of the way it treats nulls in the sub-select's output.In principle you could do it if you could prove that the sub-select's
output is never null, but we need to do this transformation long
before we have enough information to make such a deduction.regards, tom lane
Attachments:
image.pngimage/png; name=image.pngDownload
�PNG
IHDR � T ��
�iCCPICC Profile H���T���������tBo�[ )!� J��� �B 4�!�
�������RdQ�EQ������.l��?p����;o�������3��7g~ �Zl�H +�!���{�b��i�a E������1BC�"�����6�����4����_E���� �"����d |��8 �!�o��#��u�U�H�?�r��r�$�I�1��L�i �Il�8 �l�O��� yH�l�\��"�=222�w l������'��'�o9�d9��O�2)x~�H�.�?��K�@2�� ��Tq@8b��3{��$ca���i�s'�'9U5��lf�4g"X��e����Os2�O��aEN3/�7b�����}��L�4��35H��d�TK��052f�s���d��G��0e~�$\�O��=����2�������I���{�~��1�3;VV���;%��x�� Be�<�����![��<�3kCeg���f��@���@0���^~��f��@�OI��1��������4;;G �ww��xG�������8 w�����_� �� ��L�����j�D�;�CK?0��u��)�v� �/�A�q`!��T��T���
P
���T�]`/8 ���t�3����>� ��!�
��`� D�(�:�A�D�< _(
���D(B�Z �CP5���~�N@g�KP/t������`X6��a:����Hx�g��p ���k�Cp|�����+xPr(*Je�����T<*%F-E��*Q��FT;�u��A}Fc�4
m�vC���tz)z-�} ��>���@���c�-�����bR0y�RL%���9���a>`�X*���
��a����k�;�M�Nl/v;����q8w\���������N�n��p��rx]����������S����q�"���J!p ���}�v�5�a��D4!�#�i��*b#�<�!��������\�_n�\����rr�I�$s��@������:I�H��d�1��O�!�#�����?�S���Y�\�e�5�-�7�_+�
*�)\SQ$(+2��KkO(�QS�(�*�(e(�U:�tI��2N�X�W��\��W��� E1�0)�J�>�y��
V�D����R�rX�GeTUY�A5Z5_�F��j?E5����z�Q�m��Y���x���j�uc�G5M5/5�Z�Z�Z��u���z��F�V�Gh
s�0�<���5F4U4�49�e�G5�k�Z�Z�Z���j]������io�>�=�C���I���sJgX��������{Z�%M��� hU�s�Q=-� =����q}�(�b�&�GD�A��f�.�QC]���E�
���Ft�T��F�F�M�c�W��0Q3a��4�<4%�z�f����2������v�]7���S�k��Y�N|���1�]fg���cI�dX�Z6XXQ�����Z�^[Z�[o����n�h#��g��V�6��������������=���~�}����N���������99;�����
���;����C�k�]0.�.�\:\>�:���u����-�����9&sxs��t�wg��q���y$z������d{�z>�2��z�y=g�1����m��������%�N���O�O���o�o��c?}���QG���������wX�,��5��$�\)("�:�I�y�8�}.<7p������k
!��M!�BMB�B������=�
/
���D,�8�!�;r}��(�(ITW�BtBt}�������X��%�W�4��qm�������������JpL(M���dA��K5
�\�����X"&1&�`�Wv��=��J��4�ar�r^q�����<w^�y�{rE����M)������#|&���&- mW��������AS>#1��PY�.<������+�����\��d����u�P����dH�*1��$��������w,_)_����`M��B��_�sw��(X�X�g)�4ii�2�e%����/?���"}���6���W��l/�.Y^2���O
�����;��V�Z�^�_���~��5���e��m�+����������U?O�K^���i��
�
�
�7zn<P�TQX1�i������e��oY��R�C��������U�Um��m���:������i���5�?������kg�.�]���������OK�qm�^������E�����K}�F]y���������w��?�up}� i>�p��a��m���{��M�G�����&�z�h���c�c����oo�4��@--�����mqm�'Ot���7�f��������'��"�*95q���X��s�L����E]����u.�\����/�]8���>}��b�%�K'.�/�^q��r��j����7�8��\s��v��z{���S7<o���s��-��+}��zoG��{'�N�]��������?�`�C���G��*k=������~���>W�D<y0�|�4�����g�g��u����{�1�7|����C�D��GJ�T�s�k��������h�������k�������}�X����?�}R�t�3�s���/������V}3���=������ [��P���� �� 9
2��O���M�L�O<5O� ����E�N � j�(� �H�`{{�N���3�T����nw)��E- ���y����i�4����^"
t�� 8eXIfMM * �i � �� T ���� @ IDATx��ipd���w��;2���Wj�"��(��(����4�3�������1����p���:��i����3����{��Mw���(�7k/
��@�����s/��B�D�*~WT��s����\$C���{��/���A� D�"@� D�"@� D�<��.��� D�"@� D�"@� D�F�w�� D�"@� D�"@� D��i��.� xr�Xgs]���]Wp9��l��y��o�h����y4hr�,�����������D��3y��y\u�b8�+p��=_Dr�al�#*��+�����a���Glx����?~r��;����5 D�"@� D���C���3 8P�!5Fl;aZqQ�
�.Q,�RMd��Q����8b����U�\#F�������f!� :N�v�� �u�~���}J=��/���,;���\����(��X�t�k� 7��mG�1M% /K����5����`��������� D�"@� D��#B@�v ���qDPD��B RP<[\������xZ���8�n��Rq2��^(�d�,���V�>)q~Q������R��i���*
UQ�L�q�
�v�2���P�z�[% ������Z�Xc_��q�=�0 �����d.g�J+�����)��
�I�G"��(���vM����ks�YQX���$>�b�����f��wuG� D�"@� D`O Ho���w�}���Is�S��8r���d����<c�)��l2� p����I&�| �����t��������JnHQ�}�������W-��:��7,��O*���w������m����=k�eT���}��{�-v�������C�o��h��O����6��m��`�&�����k���W~�8��
�}��a�5G���}��
D�"@� D���G@
C/���/���{�����C�=&��mH{��P�{�
��8��8��m�F��n�KS���������$��8�zs�����;�w��6��K���<��S�O{e�P^Y��r�~�8 ��aI��1�%|���
�9�!���#HV5��(m3>�/X����8���C' ����������T���!^��|`v��>o��d� a�[�GY:���=���nM�jz���6�)�Q��{��W]8v��T��Z=i�m�����ZD��z�>t6c 4���Q�YQ��:8�t6��
�>�N���� �5I-����M�W2�Ri��E����:%��'�Go�D+dF��7~���C�����1���"@� D�"@��Q&���Tk*��J��(�F�t����V��Q{4v\
&u}tn�����pN��q���]�lO/��(x�Z��d�E04;H��g��6�7(�~j�g
�274Yl���6���#���!aCBE�p ��
i��e�_�Bcy �+�m���s� -fPH�2����x/ �=�!w�l j��A�0W�X6Xa �S�`����72B
�R82
1'1�����)��D�����%��e���x�!,� ��88�h��qoG-�/#���V�T4�m���B�0�?v�D�T=���l�c@.G�O�G�,,0�{cx����0����1I�uA���;jc�n�D�;�/��'�����5]������|���W%�����U�,H�sp���`P���GF[�Ig� D�"@� D�1k��&�qT�����
��! �M���}���Y�@��n�4��)xOD�������%�Q�Ui ���dY�[�~C$Mp�P"�����T�9M+��f|5Jko00�u�f��)���Dg�9�\��kp���F��cWq�K������8���q5 ��z�6��:�kEI,J�u�q�U�D,���Ivm�R��*��|�"JY������m�/��b�PlikK��aS�U�����S��=`��\:~+P����*��xW(�|D�-�gr��(acL��|?FG����8���y�����Zc-�e�K����,��lBG^�^���P,
b8�N&{�Q����������dw4�� �Z|{<q>M��&�p���fs�mKXp�j�qcf�W���e��}���A��0��M�
=�8�c��H$bqsZ�2��7����{l��TfJE�h�d�B�x"�JF6��k�%^����S�H>�|�^�tj� �A�[�Y�c���^h���W[(.�6-�46��=�>fY�2G�������D�"@� D�"@��5��~���k��Hhx�@p?���B("����dn�s���*�YE���d��� �%�s\���!��i����G�.���T��p�{����*9������l�pt���6�*��!�������uvu��>�!�55=;���������r9TR#�&�o>N�C������������[���H�Nw����pa�V$�����_H�F�5X�`��\4*��J>����5[\PU��0�y��wX���Tk<K��p����J,����_��s��(�n2#��s���vvu�Rq�� ����B,���cWgQU�������K}}��pBgWX
1����1'����[�i���be���_����y��yah�8�����:R02�~4>��l=����:��9�`:Vd �^�������Z^�X����]<4 ����i�<L��]}��0��&gBA�{up��X<m���y5 ��33�ur�4{����W$Y�T�
������ OK���������,,ex�,��w��p�����W�@ ��kj�����s��S��,!�������2G�y�3�]���"@� D�"@��!X����
K�(��aY��D���x��c���nd���s>��=x��3}m��Z3K�$0h�C�=K�R���`��B3�8��������#o�:=\���>�je��
���iE}�������aBNE:���/v�+�Z}"�C"��������t�l�q�B��D��i>N��������?���Q��W�������--��@�f���@Cw�h��+������x�7{��������3�!P��p��d
/�W����
���&9�����+�CP����tJ��X������r5R������&�H�?SN�X�}�MU���Y����3}(GM�$U*B4����*+o�>���e��k���<����G�.����X���Z]V�T4�8a���f�4
�1�����\T���l0�Q(�:nc�:$o���� �E�����c��&bx���b*�Y����X�h)rg[[woo�Bhl!�duyY��JK��@���{�����{2�l3�`���R"����+�X����-�8n:�j���R ���6�?�z5���T��q(sJ��}�����"@� D�"@� 8���^(�k��'"4�$�\($"pt �O�n�?���������`(������m�R�<��\��fDaEa���+!d�y2���\_DOD#���������o�|�����I�j�'���w�f@���r�����Y�w�
�?s���_��3���J����!����^�H��R)d�>{�9�o5�G���8����R]V�}�����< �������,OU(�^g��L&�-g _B[G)1W�]4�otvGei$�b���`�L���bo���h%��o��\����h s�"Lr��c��<_����
Y��(���b�V_=1�j$��S��]���k{>�������?[�G�~��;i[o��&L�B*e�,ga��!%,��CaM�~21qK�p��"T�X"1��B�j!o��4����rw%�7��l@���+I�
Y����]6j~69I����T���]�P�n��u��������fV2+=�A�9�J�NM�j�**+��HL�'V3yYDF�BB�!����3���@�d2�,��Ri��W�,�5?�d6��m,�=��g�`�t�"@� D�"@��$���|��g���P�\��E����BD-!|�QA �\�pG.
��%�T(w�����_T�C�������v������d�C�[��g������l�z&3�iK�%\jxj�����rl,84S�6��Q��T��(.�j�W��e2������MWkr H���;c�r����~�W*�W
��p�xK��iB��b}�@L7�}�%:����S��c�iVC��m��� 5�XGgJ�������� �ch�t�T�~��,�.�����*�~Q3���������3���t>�����j&s_j������V����t.&+�JeWn����G
�h������-����V������/� �d:�8v"������}���r���S���t �%��Jf��G�D<"0�07�M3>����k�L( �_����{�*�?���(����C��2��������M��l��'����|l~.���AZR��:���P�4�hq��-����@k���]<
��v����4�����w�2���j�I��<��s�u^����?�;������49.�sp ��e�6�Wm��^"@� D�"@� 8��7n��#�]�k���r,��
���@������b9��(t��"�������v�`�6����?��FI8$0�L��|f�����X�D[���D��<�l}1�������,��<��}O�m���i�uS���\�2��>O�����&��t�^G�b��e(�-�P�rP�,G#�`?��T����nZ7���8�Xo8�@ �"����y��@x�k��ai����P�vh�qZ�f[w:�eO,/��[����#�����nm�T��UE��(s%H��U�j� /Dy�����,��Z�s�������V0#�*������^��_n�S�|Af���e�4f�z��$T�nC��������r�Rr9�^�?���R�#��.�A�o
��
�%@��z}�TZ����cw_�������9�^����_|�79��`�R������������B.Wl�����������#������X6L�`%�0M+�_���AuW��e����c�����gD�M7����2��p���?P�{4������n� D�"@� D��$ ������$��vKD���m�h�Z��%��6�����]xJ�������b����WM�{���
���Je-�Z�������t�]��Mf��(�+��������NA�D�Z'�����Sm&L�e1�tT��:;����v�Lo��
��}��j��a�m�q���M���} p��X��o4^�Y�q�x1��V���:�S��~m��"i��x�"�+##���e�3��Q��
WExy���MD���z����:,��-+q��?&��`W��-����_,K &��A�>�p�MSSa5 ��I�������WMz12�����Y���*I�%�1���z������g��N�
B�������
�s�Uw���?o�*����i�7L&��<7��������l��P�#
��KK0��b�#�7O<qOb��RW����d�������<|���C?>�������1���D�"@� D�"�E ��i�O��o>/�2�;O��:X�Tj1� ���T���Y"��n���L���� ������I��Ua��~E=��q1���X�C
�s���*�#<��=��^W����5��)�?,��s�d�n�hK�-.�9�,��p��''���
+g�;��
qvR�r�_��Tm3w�{��-j�y�?�f��wB q�k�6����p�7O��Hr������Zm������A�����r���u�W�IY��rb�������+����"N���
�[?xX� *|n6v���������Rh��Lf�C+����c- �W,F^
Iz�u�����X����������N���/p?��s�@(����Lcg��D+����]]-�������/}��M�����H��������z>�w��D(��(��>��k��et�SDD�"@� D�"p�<�����Q�������&�PU�0pwvh��
zK������������c���=�k�A��}8�>��� 2S��m�}�P���x�Ra�3�
3��������BB�Qq��S��\�V.XfH{={��uM���-IS�KK�0`7�M1��}D�����0���7�v��(CG�e%�q�qB$���Ta��#b�������u%�X�h����������PF�# |�c_2
�]��q)�N� ���q^h��vv4��P����eD�l�g�����N�
xcA�EV�����Jh�0�w� Z6�G X2�K�����������&+���4�k��$�*�i��~.S����q�UZZ�\�dK���b��}+L�n�r3���?�[[��?�^����/Fo�*2v!���nm�?�9B �%�#�Fj��"@� D�"@���$ �!��YT��@��>F�{V��D�Zm=}B� �t�+W]���vnJH�pN5�r.I0W��U��`u�vfe�uP��E����|io������o ^��� %C��jz4�A��x�$�X���B�������:� ���5d�D ,!k��b�P��!����l�|�����qs��E"AEm�dX����2�D�|S"��$�����C�\V�Y��$�0�7�_hC�!�G���� ��Ph���3�=�R�=[3�����Hs� X�c�Q�/rn���VM4��&N�6 ���UP��!zf���7�n{k�}��Y7f�/�zH�9�J��'n�4����
��L JC��P�6,J�e�]]�*�.>��d3�1:V>��������iZ������y����I,�5;�9����{�2�.S:O� D�"@� D�(���QaY#�Bdc�����#��H��� �qf�����?3�I_<sf�\���z���fod������`S����5b�E�����:%�������u����
Ax-j�j���R1�����������=.�L���9l�Q,��:�a��|�����%���a#�V��w�<��B-?��s���Hv~�|�i�\���5I:60pmn�u^�4��{;����8�a�[B�Z&��!s����P/�9��u�w�i�R)�B�(����VVR������E"}�1�L��pFx�H��P�#l3L��.� �?� },� �����d��-��-�b�0�,����t`��� ��u�9e�0_�q
~04��D6��o�7F3��-���z0�.���<����3�d����*v�p�N!�nM�N�����a�xw<�����w�|���!/;\4�����z�T~����&Yq���x�Fl���?��?��a����)��eL�"@� D�"@� 8dR{�!T+�j�����>rt4<x��(����������L��*�X���CJ3��U��-�{��������l��b[7�\<kc�Fs�����i��V�d�l[[[����L�"J�(v����a����H��i7�H$z�5u1�R.���jk{�%���F��n���8�60��O�W�e����m��ljj^6����O'�����Z��j�gz{�� ���I������H���mg�����wn_2��b$;�L|�������9y�`�������eE��
;��8�Be���O������k�@����G4-����(2\��h�e��3������h��"Z�:��F�I�Dc���j�iA��t�v���y�[��<w�Z�|�b�x����ba\���|������z
��
�?���Z������\]=���c ���1M<�P�# ��Rh�|:����c�������h8�+KX���x!7$�@�;V������C��}�h�L�< D�"@� D���@@z��W���������("��0L�����+�(_�|�u�d�gQ��$!��"���'Q ^�^����~*��Z�}0?����Bv�tz�#I�r�����}y���J ��^Q���dT��q����\�����<t�L��j�����4�`
n8�<�C�4'�|��|21>p���(==�����KUU�y�/W���E�����lgWH��;:���>hYn0�"<,5��)I%��{U���A�>�6�Eq�;
f
�gM`j����.����off�������c��86\�m�{��3�[KK������P�|t�6Xa:��������e��#��
s���]�.�����Xt�s�&�>���kla�|g���?��)f�����]���-�/�;w���&6d��'54���F�q��+���<��O��M�c}6;�>v<PO_��plS�����EG���bY��\���x��U�L���D;���=�"=� ��o�DB� ���)�� �b|
j��,.��6�ld�������}�h�|�S"@� D�"@� �H@r=[Z�va�B�8��ih"������r�jPU��B����� Y�U?�,����*2L6dx�s���5����|uaa&@�;j�!;V\�/�]]��9���r��(% ����:����BnNU}���Z��n�t���Q��G�Mo���u�9�����|�����������k_<O�? K��9�^��n��1 �_��)�� r�y)�PV*��n�������.+��
U�:*��l�J&����|QDE^���,���M&�����+�W��
�#Q��D�u�����$J���--+��=����7���8�b���>'�c�����G����`V�`W��R !+�EY�����������t{�(���'o�o �$n�6a �y�>��������h�Q6~Zkz6��4Y,�d��=4���lm���������?�,F���;��X��a�<?��:���?�0>�U3� F��14�>�<��cX�&�� ������O5?�����h�3�% jN� D�"@� D���_|��F��� 8<(�����C�d�E�9���Z^��� C���DR)�iQ���>A�!��^���� K�K�e �����nY
�j5W.�����_��\q|����OZ����d����"����[QQ�,�f�^��T��� ��������s�oUQ�p\h��IB!�W
y���g�C�R9����x4!���An2#���c������C}��a���@������������;�=?`;����&�g"Q)��FxB?�d .7rA�X8 �=o��� �h������X��R���!R7,eP-�!�K�v�f��lh��.���w�m�{���A
�7���M�p������(F�R�F�\����Q��Xo�8!��K�Y�~����n�F�_ 6'���^�u����&�� KA^��R5,W��C�b����?G@��w�>e�H�^"@� D�"@� 8j�^�t"�E ��]����Ww�4��2��=���i���|��
�Xw��z6/�� (��������~k��%N���l�@37�b}0�8;�����v':�((�h[p���E�~(�-
�bg�q���U�5GP�7��p���%h �8��FoE ��g�`�,r���Z�����1z67k�!Gr�75F���~��(�L\^�L�����pVY�q-S��IwQZc����7��!Wx Y�[���?��p��<��a����&��B�e��,lln��=��qv�]e�b<|6�K���f[�US9'�q��o�c�nT���1�0}*8�Q 4kh�P��^�'$���N���7�P� �?�xpg>����*f�q7n@�������W����+����FD�"@� D�"@� ��A��$�A�!���U3��Cm������0�s�7_�WA�����]�����)��N��[�nc��� ��z:Zn��s6�����75y�[��z�*�-��6�0�(A��"���L�1lw �B�5 [o��'��a�������%l��0Ml���@8������ss(�gK)M�&�B�����C��wo
�?0K�`������4[��H�L�}����ao���;M��&H�"@� D�"@� 8:Hp?:sA�"@�� V6/$��xMv��w�����f{��B�7�k�\p(i�6NV��lX�G���7}���k�6�Mo� D�"@� D�<��9�H�~��Y��������z�����e��(�6z-�2L���\Tu���/'L;fY���a�S0���}�F���n��3O�ya����m��5G�gD-� D�"@� D���4u��R�D�M ��o3U��`�mK�~��q/��\`KX��v��v9js!���:poG��^���Bj��|����}�}�d�q�Mq �#K�yL���������% D�"@� D��}"@����%_h�� `�.*�w'
��� ��\TD�_�A�Hc��Mn-�H#��EOJ�{����|�s���#D�"@� D�"�$�?}L��� �����UD�"@� D�"@� O.������� x� �.�$����0�c�*O�JLXX��f��|dM D�"@� D�"@�$�?)3Eq"�E$ �9l3�u��&��D�����;�
:��k���p��j?�|i,"@� D�"@� D�)#@��S6��8h~ 6Rq�v������T7b���aO�����n��Yp��'�{i"��Q���>���y��~��SS�t�����>ly�������/���`To�QT��Lf;by��}��X�U�<����}4{�������'r�����$���r�h,"@� D�"@� D�q���8��Z"�E'