Use merge-based matching for MCVs in eqjoinsel

Started by Ilia Evdokimov6 months ago38 messages
#1Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
2 attachment(s)

Hi hackers,

While analyzing planner performance on JOB with
default_statistics_target = 1000, I noticed that a significant portion
of planning time is spent inside the eqjoinsel() function. According to
perf, in most JOB queries at default_statistics_target = 1000,
eqjoinsel() is the most expensive function during planning, accounting
for approximately 8% of total CPU time. At default_statistics_target =
10000, the planner spend up to 75% of its time inside eqjoinsel(),
making it one of the primary bottlenecks.

Еhis overhead is caused by the O(N^2) nested-loop comparison of MCVs in
var1 = var2 clauses.

I propose an optimization: when the column datatype supports
ordering(i.e., has < and >), we can sort both MCV lists and apply
mege-style algorithm to detect matches. This reduces runtime from O(N^2)
to O(NlogN), where N is the number of MCV entries. The patch also
applies the same optimization to semi-join clauses, which show similar
performance behavior.

On JOB, this changes reduce planner time in most queries with complex
joins and large MCVs with no observable effect on plan quality. I’ve
also attached bar charts showing per-query planner time before and after
the patch for default_statistics_target = 100, 1000, 10000 along with
query numbers for reference.

Any feedback or suggestions are welcome!

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC.

Attachments:

JOB_results.zipapplication/zip; name=JOB_results.zipDownload
PK�i�Z8� dst_100.pngUT
~h�D~h�D~hux����wT��>���c��"������HQ��� UP@�IDE@C�
H	!�!��H'�"R�:�}�������[�������ug�����=g�g?�>{����g�7lX�j��������U�~���>�M���9�~��]���o�j�J�����������8kW�k�NG$d%�������������H8��J�O�L�E������j����j������V��>�#j��w��.�|�'rN��G�I��i������U�D��
V'�|���������s�W�����_s��7������R����w���U��v�z����]\_�>q�3�\e�k�v������������	���o����?���O�-qO:��������U�U�7J���yy����o�o������y�����m[��cG�I����nFj���.a�f�U���g6��2���a�bj�9��.�����_�����7~OY������*�9��������^��6���p�aqa��!��B�����1-a�������4b��)���X=�5`�x��F�����t�s����
�YXX�-,/W
wSU�v���i�b��������&(�����9B�%>4��d_��XMf����1���c�������-Ojm�?~�'*z�����}�*S��	�X��<U�-���GG�������g�z�P���ohe�t%�6��E�j~~��?���<i�7*,<��m��a����
7���q����*�)��U������G?��� \zFF)g�<N�����^�������{�k7w��g�������`u��DX�4�9v�f�������f:�k:;���\Q�����&��|���l����:{�9����l��i���6j��eC;+���Wg����-wv��s�!1�g~h���grt=-�$��������O�^��R�<^�x��D���fx�&OU�p�/���fP���U!�^�'N���8~��s9���g�E�\�
������6���z���I��WY1�]��������W!��"K����l*��h\�O��b�������[w+>�bV�oXY=�sf�
�Y�*���x���f�����xYA2��N��,d�<u����5r���� ��^����%�Ur�����h��`�!���~�~�.�ooZ���,=�R�{J����6�e�����F�'H��.��1$��%%&�&��
�i]Q����:������:����������N�~����E ?&��`l%u���q))�p`���W��HPG�6(��"�/If�V�Q������')c�t����	��,A0�O�#���k�<���1��/��>~�+�=�����;���=i�^�-���OMM�=~��<v8�����������`�������a���o��\�vm�����������$��A�&��5`b&&'�N���MY�Hf��O�@�Y��@��c���M���5��g5�J�DH���x/l��
\]]��6�j��|��z�j����y��Er,	p��C�������>U���?q��pC��Mo��()�l�0��U���u����y���m����S)��������x�b[3�U8�A�5:���C__XX�999��w�^�Zm��3��|PF��l�N07W77cc1__��\\i��;zc�\�.�������������``��o�����1����kF�d��f����*S�S�������0���5�<L��|�//����~�QR�����D���k^]��������!��x����
�j��+M�V���'����3e�+��Z��Q��/���Z�)�P���lv�[�|����^;�o��V][KK��I���WP���*�]#I&��K&VH�[��!m�X�7�!*)I�,�8���|�YK�f�������^��q�����I�lws�V����i��{?����]���	���R����O���������owu�zO��g�h$�/
I�}�rv���y|+hK�����91�m��g��y��My���roc3K-,|��R�9�E<<=�|W�Q���k�o[�k$K!B�:%����R`7D�����fa���W��U<9�s��3?��6�j:�<��������@���q������w��JEJ_y�/�������<����;����t�5��f���.�~��)�I�2���G��*78�.�����zk�#��Xqr��r�-t���s�baAA��u�C���7��9����m��/�G{{�q��_k���uB7��L��4�_TV@;R��%V�iLz��a�'��\���b�������@2�\B�d+Y��	B����#y���9g����8c��Z�:C����m�����C����3E�����+�����}X��8�3�N#bj�rc��
xvK]��V�>X�o�>��RU�����u��oHW8u�f��)O�8W}e��WLp^.��1 ����������*=��I�0Os?������.��)���P������jc������
*������Y�8����7���U<�f�q��w���H1�����3p���{����g�Oe�{0^���QB����f�.SXy��z��ha�=H4;Z�AZ�L���i�����
5'�c��8���c�t�tT��t���+Z<Q-���%U+��Q���w]?[��5�l�[�-
�}6h8��U=��a��|A��W{���������y�B�b�� WTT�r�}6
�g�@��
7������^��

��gwv�;�l
�T����j8�k�m|rf&<?F�U�t�����TWVV��>�UN�������N�E�?�FK3��#�_=�7$��[���3K:,'G���z�)^%}�W������L����<�gF������I��no�����$\��B;t�eS�Bh��Xe3&�F�d�����x�������	W7�,�� �xuF�?�B���`:Z��V,�k��)1]�y�����[����v�����s��}l5�U8C<���`H3���2�4�c�F��_8Y+�__On��VQ�p�3����Wydj��	%���TJ!4"�4�;��
�yx�w�n����^�o'����&c�_}]��W��7m��}
���^��S��=��x&i���� p
����)/����o�3+�Y���J����S��&����1�HD|�z_E*�l��:��?~<hF�g��3zz��%a��\�T�	�������]�>������V^^.��� e9�6&��������}��������i��}��-l�d��n��D#���1|W���&�!f;v�������8��')��
r6�&4��YO ���,s/��C�}��M������������;�G����]YL6����e>�9G0��KJ�K���8Cb��\��4�� ���k7�M6��0�E�����G��
��0���I��JG��+1@�a@�V�!�v�����u|��a&N��IJJ2\kR�����������r���UE�
`�25#1�4LG�2��I���f���
���k��������?o%���h������6#VW��r��x��������P������w�C8Sl��0P���X7)�g^-d�F���PS��K�-����'����L�V�#�#��lO�����4����_�X��z�������\��]�\=9��`�s�q������O��k��-*��y�[����^k{i	�/l��;x@B�\��+e�t����be>�sz���l?���w�|S��:0�k�B����\���(�^��F����������+*o��3
"#L�����7<|��eW��b��(����������#��i%a����r�s��:V�Dl9��������\b�����'l������M�j��X��'o�\"*�s���-ZV���w�B�;��)�3`�36 �`�W	�%�We��mT�4
����U����Cww85����s��5�;J}KO����u��1�q���q��d777=�J-d���GT'����2L�5�[Rtv:E�MP
l
�,1������Wy�G�h6R�\�S=hQ��$Zt���/��~��(����,��
��S0F�$N����FT�+��.�1>v���p����dh|d�����k	��!��zu_�J����+U��e;��yU���/!�iFqO�X�R���[]���j�y�����	�N+����j����:�=x����������������j�>u���� �T��0�Y3"0�~�`��t3|*�����^�H�.]3PKjZ�0^�T<�����,)A{M���3d�B��n��~w=�u ?�T+,Q�D����>,��u�`l�3������C~��.�K��dGF�@,�~��g\��{s�6��t{9�M���d�X_���?������,|��
�
�V��nU���4��<|��j]�1���i3u�D�����0�-����V�
�2P�$�����Ga(�����d�Q\��'O�J�F���0�	2@7�!�����s��%�������a,��sd�FW��E���M��8�6��1~	Y��d�C�9�m~@e���+r�MP���K�Z��.u�  D�p���W����%k�`�=Gv�D�0��=�s6Gw��7�b���SP�=E�����P�bb�j�Y�������z����G�j���G���zC�������<�&6�4�3��D�Y���F�
[���A!���Q���jD��8�U#A<T���<��f���-X/rG���^���i�d���p}�\4���7�8[s����W���f�����WR�`��i��4��^�!�O5km���^��4�-��o	��+S^^^����I�=p�����<p�=���!�z��NO5W��9S��R+�A����������@ c�������p����*��Z�O��L�\d�e$)���[X�A�xt����(�$0=�d����p�?�>V�"##C�Ri���a�sQ�{�qG��X�>���\0\Y�k���P3+hi�/��B2ZP����j�+�w���/b�g"}�JC����y�j�M@)�U�r!%O�6V�liD��	5�L���z�F���2���733�2��vAb03��}u����B�t;q���[��E1[(�f���4���+���
1�0v����+�u<lyqR�Z	���D�0��}�����at��#���GV��������U5|RMM��r?3����$6bh=��911�:�(��k�����������GX�����%�V���C���i���:�x��Z	�}���AA�(�$q�� Y�:��.�O�����>�"���R���	�VM�=\	X��>�<�B�J�9�n!!!�E��,r��V?�r���N�/�3��.�;1�6m0L���(_db,�|��m��]~��aub��Z>z���e��oNjPK���{�If���:�I�j�7~#����l�����n����%x���^}�h�<�:��6���V���8����0������6�����J�&��
�'�������-hhz����s�b�uI@nt�,���:�
?�UPp��VD�����@O��&e��s)/�t��D��Ozxx�ki�_�Y��3�lhTp���.�@�+�1J��y�������<�c��xoYu}}Dpp������u�$���3������K�H�a�M?�xh��f��TF�
��LA�K���d��1�}��@+�)(������4�\� \�`Xx��C�d���;DBe1YO�f���������r�)�O��
Q��Yu%��i��9�r�����vt:Y���R
.J��19�#'����(�iM��s� u�'h�~�z^^����D;3�z�6&������u�l@�2�������!/}a
~�=>�
Vj����\E/�'�UQQv��d�a���qK�e���]��G>�5@JJj�|�C��3���G$%��n���F�8�i+J%��k�e�K��S�d�y���Yw�\���e����7T��W|)J�9�y&`+v����d��<����#�L�[w�+���_s4������Rh����hoo������
xP+��������
�YYY�9:�^�z�d�M����5��yj���e��^�XI�>i:��I~1�8;��]��}�oRwu�1����6� �{w��5��������$�|�1���8,6���Q?V��JO�h�����]Ph���[��Y�]]��3����X��������s��#�x�)�)�9Y+g/3���s��[�����h�l_�7��{��M��OX�9=����hH�YR������oH���jp=�?���eC��x���V�R�So7k�+++���q>B�4�8���>U�Q=]���V#� ��^�u������������*����a�7����~���[���!3��}�a
`��>�hj���|����c��
������Q����+�)n��p�Dw�Z���W���eU?���p�J����z���;�x;���Bt<K2���������t95����w��&�k����-���]H�b�i			��E���~�:������~��ONL�ac��������l6R+�2*�_���"ZZ�K|ut3������K}7}s��2w�X��:���Zhz�F�^�n�n�rz7`�D5�Jex�-98u]477�.������h�����u4m�	RG2��^3�>��-�&�QP��`xIH*�F!���8�{����B
E�:��s�>5����-�����_���$��"i���pP+m����F>v��sj�<b;d���uK�Z�#�M���T��8q���m�e����7K��@�:����gC��)��o�o�H|�t���kSh A�su��i�a�(��s�2�a}j�r���5��������?��(nw�1��������'$�����-�;$d.W<|��n�uE-��q�`�2��6�B��}�
��L�{z.������~���8cE<��������ZVPyEEk'E���f���:�����;sn����,w�����/�c���������x��Mi����������XvW;��.�;����pdPhl�Xeo��OA'�|�W�Ew�.��fSmjP�g����r�5o���M��7�?��#,�#a��v�%�������/�$�
�l��?*��)L�w����3�Dw+�)q�Q"�Er�a���%���f��]}y�o�j�����*+�z�,:>>%�1\�B��w�Yl��|��S�������/z��Z(T��PCa���K	������#�]���(
\�����hbf&O��d������|g:P���L�Ve���
3���oz_'�{/��Cl=K��T5��kjj�v�&yL~���Pea�n��W'''\p}�����:hb&�Zw!R�L��B:#����c$����6}���Sb]h{��v�l)�{��+ad�%�(3_��\
�0D�m�2�7�O$%'��###����S��}�oiG���k{%a�H��*�9�+��@q����(+h�u���u����%3�JA��|����,���\��h�
����6c�
t�M���o��w�$ow`�����m�9*&���b��Q���.����)����W_����T�U�[j��I����D3�F�[��|�#`p�#'����&��\,s�(���z�����\�XZ1����|�����5|8)E���Ki0?
��h������x�K%����70�co���M����#�fD$�?�h���_Q<>���T��������q�������>�}�PN��S�/�{^���98O2��A^nn���b1��U��U������x-����k����S�L�xiy*��<������u?��5�����uZUu�������5�B�����0���(E�	�ap���1����f�ees�Mz���s��z�b���6G	��v��.�^���7�p�
(�
���XS��������ze='���M]T*���IY���0�Y*�F�6PGC{����������?���f��K^:(X{��������
�K��K����W�QB�3si�3n����W1�>�PX!x�����<H��'O�������O����;�������c2Z4��'�p���p
�������
�mU�]z(%1�tww7��V����T/K@��-���b/����X7�fxtq������|�6��E$@�2?L�1�k��:b$��o)�',L�V����gIs�*�(���;�t^r�Na,�s�d_�J+H/�N��k�E��\��~`4��_G�V��#X�� �5����5"�;d/�{c����
u����^\h������wE��*s���&�Z>�����oj���xVG����G�������"����XI5y����/�Lo8nb�������	��*}�$L���4��5���h{����9������i����������eo�^?��s�����A��������Sud^�O�^����U�U��J��^���N8�������t�H+5c�I���K�����>~�`��}s�������)1^v-���
����JsCpe��~=��S0����V$���gvyd�)(���x��q�jn��������bt`H�M^�W�_����J�v�O��
cE	�nK�
#Hg��_^\Z2��O|����A�6�s��r�PjrL���g���#��i�E
�?y�O��>������V������se���oNL����]t���K(ssb�|+s)�)44�M	w�l6��`����Xw���2H������F��W���aK�3'gfZK��%�g?��tH0:����G�c=�i��7N ��Z���`��2�?�U��<p �P=�La�S�b���Mz
��$<P���,��mbb"4:��u�~hO+m)�P�ZRt���1�Zz�`@��D�oc�����g��I���c<����'p�VT�j0_Tn�������,*�uT�2+�B�D{��ap�^|��,�n��p��;?��������� ����0���c�P���_u3��]����@�\yiJ�dQj��983���_e|�����B#��5'U	a$���i zr���X�����J.`��,SS�h�u��0�Q��4-�^�����^�:��x�.��Dm{��}u�~d ��e\��Y��ff�����������(5B����Z�v�nJ
��ND�pz��I���v p��"a�d�/;����~\<;S�u��G��(>Xn�� B���;;<�����?�S'��[U��$���Ng��C�i�I�.DH�I
F�����t���
�TUk�k��G"B#[�H��k����8���FZ����tp[����*�>�c!��h�������	@
o��C{��c�eS�S������o�B�D%�`>@��l���J2!zq�<����A��'���������v�<V�l^<�m?v���������o���e��D�#��f���s�s}W|�Qdnn_xll,�d��".-��^���b�Z���Km���c__*���l�t1��N�iia��Cu���b�������v�$�a���"2q:���&feg;5Rcx��4M�f����}_�'���n�� ��F���W���!6��	���s�v�SQ�_?[U�}n,���h��F�l�����g;V
~���=��z�_�\:
 ��e�������&y�v�z������6@5�w}w'����&Q�L+�������*89y����~����we����T���l��}���UmU�4��pE�aZ���i�M��u���y���������u!4�\y��f�����D���}�*��;�����������e��
`>9|9������$n��o~�����2��/��ko�����]����{]M�6q��#�6��=��6oH�T�>�H�pn��y����=���~Q��/���W�	f|w�n.���?���po;t���
mH�E+��;B����!*��������b�/��W|�Jy���/�8����$cN���������b@.�����+*�d���o�w���{(��e��.Wl��S(-!^nu�QF�C�Hye���`�2\t��RSSS�j�,,,.�#/����w�1������Hm����a15����_e�t������f-����W����>���I�K��i�������{C�d�3��n������94�,l�/�>��9�0����hy���]0�,`���F��~����_����p�������L>���#o��,c�:�1����IIIUW��C�N���#��+w��1���W�����
]@{8��w�FE��A
e ������|��D+{�v&$��\��u����{-����,D?��*H[Y�Y�<8r���gXXXh4
K>�� ���2�7"��cB��yB�"��N"M�?"�2��UVu+��i��_55K2$B���:~�pyy9����w�my�\~�7����������s�d�����W�${�H��(o��|�3X�z�����[�PNY���s��/���.J�%e�����#��%�`��yUW4;��=���0��?i��}@�,--;
���#���c	����q����&I))�#�u����2���:[���,�����%%@J		���q��|�g��G�w��N[(X{��r��@}����6"Q��; �;U|{���w)�6Z��W7Ee��'�������n]�����>���PQQQ��z�j1V�fk��c��=
BU�[%��=&?
��8�6k��f�n��7/=Ox�����Kp�n���
wy��d���(>A
l-�1q�z����#�9�d���+W����@�l�F6����_���!QH�s��Y��M��i�^FygI��u

���H�k�:��Au[J�6��Z��bk:Ey�bPx	
��������)Zh���	�K�_����Kv����j����'PC���(A-1��j��������F�����qS	�0�\l�n%=��7����}��i������������y�,�y $)
*y�t[��tr�2�4q.68h��H��������o'�q��e��I��Y�f�X��R�{���l��
B���Y���E��j������#��&��I����#-��800B+A����m��n���F��������^��g���'&V�c�U�7>?�A�A����_A��	����A�C��cW���������KKK���t{r�!���{���;�mB� F���	���y��U����<y[���zA�C6*e����6��	+^�,������o#��?���~�}�����������
��OH(C�\��������2��gY���<��@��w�
�h|�EVn�����v�H�f�A�V���KR�lY�����W��l^���.M�-<��������o������%�(�7��x
�3���5��2��W������i/�%�FF��:����b���}""�3��W��[pk@b����l��{��;|X����9��1JT����h����������X)Jm�{!eJ�����k���9�5V���������~��w�:�R�P�H���#�i6�Z�+�n����d,PX������o�V�	r�j����V���Q����J���W%��K3x*c����/����+&*zvo�*����_�:�GDdp�\jhj%���RM����a��{��A9�+CmY5!��xv�UXXX
��H{����:��U=gFS�P���<�ul�UY���v�P��0�l)�_{	7w�Hd�����=x��{��a!�GF��v��5%�kj���z� �`�`f��;r�P���R&�za��s���2n�.tS�c;��t������<��6X�$�w�O;�
C������ +�?H����Qw�����h����O��`N�8������_P��!�ff�MN��y���"C�#�tP�d���U��Z��j�S�$���E��ec.F������O���6Tk�1�HJ�^s������!��3��xy~����*�l{���P���w��������_��`��'OR����Tr;�_�Jlr���,+j&��]1���y- ���S]4qi�c_�����b�x:U�$Y��;��?~T��gW�v��cP]���2_������km��Eg�c�����no��YV�����OiY�5b���;J,��Q�8��/�pl�v�����qWiE���^��j(��w�A�6�aL�MM�y�[�oRu[��d�Q��U���(����\����",L!PXX�6!J�����M�������{���j)���M����l[�/�,9*v+�1�y�x7�?�D$�q�	�W����	�����R�j��G�;���/��M� NE�U�!P�B]��1�r�=j��
�f�m�^k~�F�b��/��4��J�Qv��TO���h<~�8�x
h�R����)o��4���7�|��u��#���2�k�8���s.��A�i����sB�������������rm���L
*'	��w���x\�u�����n�wi����dt`+����m=g{��{{-97�:6�>�}����#(�o��sh�9���oW�d;��6�"�>��oC��>��� �2���}J�RU��}V��j��HHp<$�F�za���,�� =���~K�^PO��"m��b�[=��� �m�;fW$�w���������������0+�g��w�d�w18v_����_(�6
,��4lp�,��!�
<�F�7Q���p�!p������u
Y��;v��Y�d.�(7������/�Ck%l�;03L;���L~�����h����{H�di>�g��=/���R��**C'd��h?��.��\\T�+��u:S��7�q���-h5�p�Y���bmM��nj�����03��*�F�|s����b�@�Hw��zMX�~$<l���u\�L���V��2<��1�C����@W����������No����l��vco�?)
�s��_�fnn��u�
8���d�
h�P�����f{��MN�cWn��-`��0�������m%uUU�����O��������5�y������d�c0����}��9�f����[���W�}%kuQ����_����
b��T9�)��P�2�m�+�-l�(;S� +.+k����UOMM�4�X�7�������(�A-$ u&ff���'lx�T���LXb+�8��b5�j�nN������]�hRu�7�g�DVuhqPn��>[R�T������."Qu��}��/U�h�;�p�=�=	�D��e��G`��E���j������%1<|�O����7�cS{�2��(����FG������QC-!�J��5u%Z������S��"g�`5';Z�:W�LNOLN�+��k	)����Sk��0l�n�W+'�����:�*�%�sa]-.�����Z,*.��L�_�3p��a���7v�p�s������qu�I8A�/A�J�B�����6��H����0X; e
8�bR�^�f�S�*���y�Z�v����V�,�����eJb���+;,�w��IE���vc}�u�Pc�w���������%�[�3�g!l]kJTu�����[�[������P	���D"��4��C)�����n|�����4,)*)�pnh�m�="]�VU����R�~��+�I��%E��<�/G��],DW�
�HK�g��=Y�I���a��Qr:n���V"!!�1Qt��O@�qq��>$:e�� �EB��@Xx��� ��)U��)g���!"���*D�@[;���mf�vk�<��+B���(���HsJA�r�~G}���A%|w)�������Nr0�]�~��#�`qY��d �1��^���'K�����!L��Ig `�D���T��V�\�n�O���������'j$i`�BJ��I^A���Dna��7n��J��N��a�6�Wv���]�������L�Xb�,�N@�/�95�N�;�x�A=}i��U�������TK�Z�@I��>6�u�9�#�k����t�Z��!_�<��*�6@�h�5����p��U���=t�Dg��WT4�w{$�`~��M�����`t�����B��I�����=�����RRyA��k�c� 	A��;����D����!#ULHD�|7'k������Av"�e�a3:^Z�quu�"�P[����T�di����6,C�
"_���><%c75������N�GX�IHh�=��/N�����au��G�%��oj��'>�iD����-�������8<����CF�P����������-emO���
�2&!�
>~`h�^H�b:�@x��"����K����~��
5�k�$n�!j�r0S �!����7@ 
7��"$�~D��{�FA��.
`�Jz�d���!��n���t�}j��s��[���������y3�m�D3~\uk�1�@|��?�?�	��������9@Qt���9W�v��yxZ�+��u�"���<�<��ND
�,��!"�#<���������(�n���?��F@3*IC���7�Py�2@�X=gz���F�����~=",,�\�N;j|��5�f{bQ0�L�'��Pom�f�X��iQ��D��[��^�+��+��{��
"1�"��j'���������o�U���C����2:�����0L�4��L����m��3������%K��:�d�[!�H?t�x�?����'jv���o��W��A(��.a������,h��w���g��bGZ5�GH��LoT7��yY��}m�G��a�����)��C@�n�9���Z9�UK�AUc���x`+:����C��d\�T���9W���%"��=?�������>��o%�����3e���-����^P\/CM�$�$P�(�� ��t��(���ql{yB_���BXd�~���mtB�]�f,�C���Mn���]�&W����:q���l�b�.��`2�3�vf���l�3v�< �G�zG1$�2Ws�:���"���������{��JW��dC��
��D-..���������sc1���5V��:�mt�s��o��u--M�1��sZ�������
��E��Q���Pb��`!���D�����~X�
�W)z�I,`��Jq��h�it�������K�t�����ZLL���p�!���'�f)�c���<gf���[��r�����b��]���+�Y�hc`X�6MN�������W��'/2!4"���K��w�)kP=�0�]�iU�G�+W�>��(��z��06S������R���3�r����|���!�������q���b�
CT�K�A����YYY ��)&�N�W��7
�
��u��\��S>���m$�.��m������j<}W^�O���`.��~j������Fx����M&��{R?�1�*_�4�q6X�6�k.��IGq����������Q��1fi���������_���1@�H���kI3 �_����}�|�[p���f`lFq�>��g�"��Q��?�V�
��i�Fsao���o��0��4�O��ZD3p���NQ����EE�$�B������B�$N�P��h:aFA�"�������x���k�s�����;�i�u�'�k�V���o�V�J�e2-P��;���7n�K�8��53��2������rNQ�Bp�������,Q���x�^���S���+��E
�e�*�C�4��������p2��a�E��B56b����i������[�\�,/�L�7��o5�o��a�_�������%�T�gfjzE�Yt�]7����e���=-�	��!M���L;N�<�^��1�z��:K*�nn�;�fl�����q<jL�W��y�-�6P�7�,u{��H]�j�@Q{���l�����%K��q�Q��������cG��~��OQ��Q*PV$�����R������gQC$�RQP0�Aa�k�6������������`�k��������T��r�G��7Z��3HP�q�;�K;������k�/x��4*������d�`4zL�hQ�c���~���������k	�H��V}�2��Vp=A����Whx���i:�Q��iE
@F���������/���U0JM0]��$������n9�*h�f0Qt@���?��j������BC�KTLL��~��������C��rl�� "�����W)VNnj�e�g����T��4D�65E�n�\����%k�"m�>5�cmkK���WVVFgml=�b=V�������l>�`���#G�`�{N�=����W���������OQ8~SVFt_y?�>r����UU�����w��A�����������66ho7>>�2�U�P��>>�b@�s�41yyc�����O@ 
�A���N��l]z�~$���P3�T#���5-�9�Q
��l���BIGI��g	������������'��
\����t�i��������X���LA��i�w�u���gAy�w�$������)X__������,�tJ^��z)N�"���#2���c� �7|����)�<���#��A�������>�< ������>~~q%%3�@��(i���u���{w=k���.F����������36~��v�{�Om��PF��]]��n�@���� �
�������������t����p*���]~>
P.v�Xa�R;i�w�.��'&���jQ�e�����"��c9�`�/��{�#d\���~����_U|�f����������13y��YT�4�����I��?������$*yE�l���tj,�f�k�n���Z�lx,���8���R����\��%�m`wT P�)���\�h�	��|B���������b7��� ���������ZR���������2� 9���gP��c�w��Y�G"��N>�t�Q(�!:O������d_��A���">~�r�b�it���g�Q�8���x��^pP���h����&�J����j!{]A������6����g\k�J��}j��:�^��p�:����s$��-�R�	X���P��o"�^��c}i��	G�@	��e������db��Q5Xm��-��x�����A����u�NU�B0�����2.=�Q>@G��AU��(���f�O����6����d5�6)�|�+�=�&��`��-j����,	��.�����^���_���i��I����-����@8bQ���L3*�v|E0�,-Q���_B�.��%�U��H�BPE�A�TpexL��
��LJJj
���<����B�x��G����&����|b|<�EXK��nyii�h(�������HA@p"5����{P�����y��EW����9������	V��u���f��:NN���pv�x��sI
,��Z|����?���Q�@p��*�~n�mI���/-��+'K���/))���?�g�c�:!X������e&�}`�;����z��1&@@��`N������(�C��D�C��d����}���#))I=���CR`X&�m�����������W���
�%�_�U(v	�R��3�]��0;�(FV�FZ��#TK��[����yP�VS|
�z1�5���$�v��3����h�'�N,-p��a��t2�{���G����n�d���9��v,x�z�M�:l��!m ��K���K��Pr<�g>U���i �v�=&�
`��(�k���`_�=�-��L��Q�&�Z%6$���#\�$#a4
���L�K�*/w�����D��	����:K{{��&�0�h�����O@�%��s6��b���D���oru�oYx�����y#��b.�t�:
����<3S�y��q���EEE�VoRk���Y��Q�v���K�h�=j����M�a}}�9�a$fM
�����cN����ae<���rH 
���>z��Z�tI����W�_P���������k_
�$����A�C=�g�
�%n\Xj~���_�d�#�_jQc�Y�<��Y�r�/Uukw[oD���Q�0?����X�z5*����'��,+k���K�	�t:����y4���������i�k�~Yk�y���w��h'n�����"���?�� +e��O�4@,3��[u�\X��z���h��0G@�@@E�LXJ�F����w\We�Yt���Z&7��~��@9`gj�]M���'��X<�L��85���$��X�Ao!���u�	:L����rr���/;8?��fD�����L���.O����U�d�
������;����������<�I��EV!�87����
��N���=�55:��������KI�V	q���]u�(�����S�X $����:C�4#�|OP��6�R�����]n���=j���;\;�1~
���,�x��v����>�/_��(�I�x�U�.�
��r�S����n�q/��,5���c�%g1U���3��\1gyW������T,,��+>T�P��#�j
x��g�x�|����]iD5^��������`T��aFm�S��a��E���$�j���k55��-����J�`���Y5z�����h;�a:\ex�F��2�����&pM^�����V��U*.�(���-("
*��*�N!	[@���"�e��$@ Q�d_�$,B��D���������?3�2_>|f���.���9�9�"����<M����j�����k?���X�0"���fI�;f�]j��.��S����rK�����9v�a����A0���"D>�[d��p��nSB�%�_�Q�������c�,x��I�����*���s,��O!y���S$�5��	��
C�J�Kz}������/a�P��$�������������C���4���hcj����j�IJh�-	�#NH�V��'X9�%���}������B��Gg��[[4N��}�
�U�����o�
��>c���Q�=[cv��8�����}�L?�%��� 1�|��M��S�::����)H��t��@T���+���%i"����.����y�]�,[5@5Mk��V������2�{A�H�belE��;��h�s�4�`������������!{����g�U��w��q^\011I����VW�i�����%ix��,�>;�����vv>:����t���;��Bj��jn����P^��
�������t{�r&�4_H�����r�Q�=[���@Z���x��v����
SL�������Xi�L��w�����,�|�%`Cb���<
�4<���X��a@�<���v�<
��<���H������u����>.%�V����*��~&,C,`����v`�P��6�h����'T�5�����7bw�iC%.�0/|
W*E���^�I�""6��P#�h9pF{������aq�P_��A�?x �Y�D�+��>_?��3��:h�@)�Z��s���:uu���S�n��(�v��It���|)D{�� ~���xL>����,==3�99����f$b���5���8�N���A�OWM������������2Z�iQ��N�K�haf��Y�^�����D�H[�l�
** ��%�dh���z���f�b(...rrr&����f[��q�X:��U�=�.c.����}~a��E�>��Z��Q�Y/J�j<�n��k,���G�[���)
J9�*�o����U��IS���AR~7)jXI5����/�5S�>(Hg�fu=i��;XM	L����L�}�z+T�����,i�lH����[��U��K�
=�y<m�/X�I�u�}��*�������`�����'C�����?J�=jl�Ql8sc(&f=�������(�����Q,��}q��`G~�h�N�s	,�#����#+��Ag�?&����������()�uQ���666�WNq������o��&+-;�����#�m����$����p���{�M�
����
�f�l@|3���@j�Ph�!G��;��m����e4]%.�-�QYSs|av�T
�N�ks�����;�U�l����"
WV�s�>y�<K�_��h��);;�T�G�W�jia��h4B�Y�pR�4B�`���{#SSq�����?{6�����'e���~���u��3�~%g���[	�j�������1nY�+/X�xlZZk�8��eH����#J����]��a�7� Uw���
����������gO(2-=����Z�<���W�-��;R���������M��������+OI�rvv����Su����r���P����U��U�\��K	x��{`5\�mc;��*LUx����NSv~~~h��Z��`zF�)([{�SC�4�T� *��z������=�jI/��]`�����
j �N�	�v�����@
/��m�kvO{
�-��HM��[���NP]�����Q��^d�>���P=�^]��m����p�����<��OW>�w��iuY��g#���4nlO��x}���.�U-l�R�a�5=h���p����^7�������1k�� �����J��-/?�!i��z�t�`�`D�P�nll*�^�D���7�<��zu��9�����CQ:���ccy������K����k�F*$&��b�8N�L2��
�:���vZ����3�]d������8�,�sS�>u�p��Mx�%]yyy�Pq�&={�,�����w@PlV(l83Bx��Q�g�[����!YHJ��]��?N&(�b(*X�U����<�,�~�]]�����t�,���ig��`��2@���&^J������pa�=H��:;��p�y)i���F|j�U�%�D����(���A@�&$d�vo'����|��wO��'W�zaC�`n8Y�qr��IKK������w|I��AMl���������	��_*&��{�v��v���>���X�_�n�;`�T-^�����_�N�Dk���&S��>L���c�I���J:e�Yi{����3[��\��w���)A�vKF��6=1�����#��#�l�@�V������A��y�E������I1���`�������&�������:~���M������49���W�UB�<d{P�k���05������	
��wm|b3`���ug�&�X .88U�j�M�4���%w��{(���k(Uv'���T�����L'/L�|:���*�B�j�w�vr���*�5���������:IM��M�`V>d�[����h�	��`���[�������Xk��q���BC@]�RYI)��)�3x��q5��PDII	��0��-�Gz+��m��T2���a�?������X]b�l1�d��B3�m�c ��P?u��Fr;����f��*L�wv�-�G����qjG���fz�����c_������,�����w%�\d�R.��-������D�����z/�Wx���*g^��9+T������\�e;PZ�����_����d�l��1iJD�xE�0���* �g�n�jsm�F''-]]�A�"<��P����`U��t����%5���<n�����Sg����4��w���9�kX#,5�1��Gg*>a��lQ���Z��N<S�����o��;222X,�����Q��Yj�[,,��[�+hkC���]|��0z���)t�|8���o�q����x�i�
�aL�����Dv�x��^�N��H�8���p\�j
O�H���l�	��������KO���+W�@b��V���F�B@��j&}�r��$���=��]��7�877������vqI	����l�(�m��_AP����AD�x5�V,���������y��T����@B
<j�[�S��<�������
69���Y���������tW�l[3�xMEH���W>&��=:X8Ob���T^���;]9��������
l�@1!�x-l��7�?K�ryD��*w��%$����m��E!�a��c�&76��?s9�����g�^�6+\k^�)�t�P�W����T@���-
R�H���n�������kL��~Q�f���f�&��95�|��!V����a�w�>�,J�
f�m���v��'�B�%v�Gk������T��RA��A������;�R��������iz������twOo�;zK�(?8���T��Vk��;�����r�z�6bQ-�-|n71x��������v�D!�U����b���O��t�lC�G\�-:��)~'�.�0U�����a��NX�	
�K��z�eMx
Od���1	U��(���W+�,�B�1\:sR4����ms��,3P�(�������`[dX��
�d��EUf��:%c$����V?��ag���y�����G��QY���VV4>�U����r���G
��U'�����+x�q`�vO���"�@R�Gc�U�����B�\N����E��q��6EVpE���_����)	���Sd�c��*N��Z!?�l���^���\���U���������	���px���+���-������;*��{�� ��X?q��-�8�3-3�U<���Ky^�$g�w�Sp���?����0l�ta�g-�0������IN�=��i}�-'�U@	>a�YS����T�T�RK����;�0���hX�	c4�q:,��4�Nd������p�c��gY��V��HV�2��}��RHtddd}�r������/]�h�u/��N�������
+�3��UT*Q��|
�����?�9>������d&�����s,z�n���ajq������g���nB9?�N+�h�%��^��mla�ma@�>l����;�>��X�OyUk`i����>?C
���d�l;dntf�^X�@����. ��#��y���A����]��b
^xq6�j����w�DtRf�����Nl�w���O�l���R:�����8���������+��$��&��B�;Ja
���'V����/�C5$<��{%�_�Q��%�	��!����r�}@��{K�w�!��:1���x7�������>�[x79!����qo���v#�}W�$7���+n;�	���X+@�!&���_:*<r�^�r�������L��x�`*`�{C�a5�M��?�'�����=#).������V�U�?����L&��kwi8��C���p^,�!%�B�T)�`C X��F���h��M�����/N����
L�h�?����,�p��q�����t�>�t����j��@��UK��.F��)qL��~��������~�:��S_N�C�Oh����>W%��|�(��������S

%�]�zu��
�����HN�
7ZY�I/jQ��ct�U76D������.@z�2!^e���0�-�����������@���������2����ooo�����\;���m5`)\hw+���uN<>��2��^:��/8M����u���W���;������xy=B3��r��:��
pI�V�X����`A��G�D�5r����q����W���I���DSGCYU��_�F�<���||��q��a�jedt�p��u@P������=,	m�Us�y|n�+�__�
������4ys.����qo�����pG�J_UW���r��J.���^!����j�������p��I��A~5<�A�p��k��<��
+<<Q2a	��r	@KX7`�E�z��tO[s�Z�={N���f�*��]�^`8������ �������y�^�O������������FG�C�r������vi�`a!<�v�������Y�����5��Q���*/���=vU[)�h3�����C��M.�B���8p*/#�e�� ������3I4�8���"���K�h^AQ1��m�Rhx0�0sQ�����d��l�=aE�v�=>	kz�V��eT���I�&-����o�m�����L�b�|�eooZk���I�^+���Y��r��~����fo%� �Ku4fq������3`����`�H��3�(�o4.�{Cbrk��mp� ��I]8~��������Fv����w��*O�U�����n:C��YEeS��O��f��M|e4/�����~p�)�!����_^5!��
M��I9~<�����Zr~���:f��TV\�0^H�W����1�dm7�V���|-�������zJ1����~\8&��#�����v�(����}D����s�I,��<^=�UI��.x���Z���]O�?����g�wvn*�Mb�����'h}�n`(��'y"���EE��!�N�8������s������.U�gM`����R�����C���|����:vCJx����Q#T#���XX8��v���g�v�P�:�����qEVP�u������:�W������l����e<�W�TS�JP������������0A�� $c~����7J��9�I�>pI>	���"G������t����Tm(��w���u���0`U4�-[���h@�O��D[��/������FVw g�Z�~�����S�����;;�C������S��wWCV��o#���������R��Q���\���X�.�������'.�������2m�&���B`�?q�������^�A-���?wL���y�f��r
x\�TV���F
�v��DX�hU�[)�^��v>�� �(yq��7�D�-i����J'��V����^x*10�J�*#��>[����{���!1����~�45��������c;��� ��y��2����r�<��`^xr^��������l�z6������zv�P���+nR���O�`S=f'F'&b�D�:;�jU�o]�:;�H�W;����Z�_-���^��1~	<��S�I>>	c[s���J* {%��w������������hL5�(����\+.)��h��K+{��1M��`�n��9R�*B+9..��X6����z�-�\�^�eg��
������l�pU�^���#�r�M���l-�b�/*���X����l���Tj�\ff�#{����$*���{�P��?�1P��������W�x�������^�"<�*k�l>7����c2aK&�W�@d�K��o�y ���9 �O�68|+�w�����^4K��N>��3+(P�^��)��Q��$VO�)������fZGGx7j:l��$����:_zNy�ullO���Wp�$���MM��R����ul����������^���l�x9 `�n�l{x'�<���W�\��kW=�@x]8,.����	�a\^��<<�=&F�����8U�QV6|,�<(�f�	��E���4��V�L<��
/�����0�`��,A4
��(���
Hx�7�s�WxS��q���=gU6JH����E&�^���8�X���TJ�����z�a��zX����]���a��� @��2ek��0w�����l����7�}�>��/����/:UF��L*;�K���C]���-��8E�CeM��P6��l2��[�v������������"$0�k���G���/��Y�b��W5�J��@31��
��IIY���
�Bx�g����J������l�|��;519���f��B���a?��Yk�m }�I����AqB����DLG+��VTT��P� ����a;Jc���;����*UU��?��c/�[�>�+��J���y����w�<�����bF��;��.3N�f�:DL�"=��f\~����������mbV��^�������=?d��$�p���)�_3>�>���a�����1��K
N�zde�������X�R`�*�G=2���V���2^�D�(4y,)�li�Y^��~�MQP��]4���2W^�J��RI����A�J�|
s����� �n�M����Z-|������pF������SX�����E�I��[�Q���=��(��eB{2�5���zR���	�?�L�L�/��ez�J�����8���f��5f�oq�$/""�JY�aL��d���+
4%�
6N��Q��������b��4�R_UA�M�s���9���B�KTW|z<a�o��`�4f�*�����K����V,-"��1*�Du��9Z/ <�;���[��Yz�����	=W�"V����q_��!�zZ�����+��F��3|�g{���h�c�����V'$���y�p�H�T��6�t����;Fh�ZqN��E�;���U�]����F��N��1Q�0�=�!�-��Vc��\h����n��S�r@����RA�[��>9>��#��-U�qJx�D�d;)�a�2�y�#nF|V}���so�}���!GGf��B�Hd�Z�����:������{u��-U�qB�O��z'Mw�b�i�lS�t/�����Q9E�/LW��W�f��w}��Sv�g�\���q��M:h8g�����HQ����H��]&}w�'���1������(h��>�������X�
�;��*=��"��� �	L=]\\����������X���(N�/���T\{�/����3MjAy�����w@K�����'�>/����o2.���I��Z<��%����ag+(����v�$Xa���CR:����b��NV���kju����<�/->�M�$)���Q71x�M%O��<������P��V�$o�>�����tw����d��W��[g���eh����I(z{^5��=�i�C{L��`S��"����9FDfx�fn��^�f���j;��Tq�d2�qa��	@5E���������G��>X^��(X���)��%*����1���[Z^���#���}-�.d�/(w�2D�wy+E�4��NN�
�,O<[}a�)�L���@�$�$�TD���:��V�����ir�]7����:�y�z�>�)��[Z��������N���A���q�QQj�Q��o���Oz������7Z�
�����'�hf	��u:Z%���m�����q���-�5IT����s$����Q�i�XP]��������G�=���6�������v�����j���!|��#����"#�����'2�a
��^6;$��1K���~s:�`
v�9h�$:��w��������������I���;�M<9�A����(<��!������<e~�^��q�����%���"�Y�W� �}(����i>i(�	>���a4��W�}���*y��Y82��k���.�`+m���u���6gY�	i
�((���7>����,�u�"^�l}w���E"
���^������J�k�����`�R�V�VtL����1;�'3�LGh���[DD�LDL1�X�Q���������=�D�7�#�R:4�@{�����-{Z������M�u�{������O�P�����s:s�L����}���22��x�5�������d��j����^�_R�x������w��;i�<�x����P^Cp�v���	��r��$_���r���6�x��!~q@NW�T�T��=��p��V��8
#���)
mg���&�)I������;�d��5����\�+��
sVP�����n��J,�M�2Hagw����^����P�^`��J��c����2���5�^ �J�`��^[��n�)���tF2B�h�"M�6I���W�����	)M:�����1��N�����-���%��.����������I�Om��S�fgg?R�X��/�
����2S9*i+R��>>1Q������>/���WW��<�x�D�?a"����H8�_1����CCC3m��GCS���O��p���c��f��4��EI�;�Zqc��w�[j���3^�zU��e��e�E�C�k���=��s,�������c���d*g�}��?K�����(J?Hug��ZFt����xAC��i�	�">�����{���"$;l���?�?�
By:��2h��:�����������q����%�GnD�y;'MT�x�V����/T�s%���ZZ�T���&	&X��xq?���T�</�9Os����S�p�:��|H���}�s������*����;���������c���`�� �O�3}kTFl)��Lf ;k���|i`�=���|�U����;8����������c��s!�|�[k�@�7{%��8BJ��y��%]�2�%L�l�v/�:��F[����W���;��%�������P
�=�y���;sh	_�sG��L�dd�ERE�x^��j��m7��3b�{BX���$���b�������!:���?b�CLM@�5�u��mC�+X���P��P�����y�>=�����~����a���9:���0��'���C��N��)lD��j����d��/����!S��C$��&�����:]x���j���
}!��$���x��t��p�c��ry�/�R�����C��u?����1���L��V��T@Y��W��w���l�������y.�$�#������p0��AD��9���y���������*/�y������w]ipU��('da�:��!���������D�  77����Weq��+�l�b:o�5�%Z��u ����b5��e����j=5
2k���pK;���������aiw_��4)��,`���~��h��,����_��'q��C�������v�E���������B����2m������S��v|'N�AU<�h`Q�����R^��+���!B{$�/����]l+_4��`�'r�LO��iT�%�(E���n���$�
�eNP��1V�v�����h�Lv�d�?:�������7�>�sZ�/�P�U���������n��������
\�!S�����_C��J��#��;P����'��=�U�r�_�_�G�h[����X���q�g]���v�#�K��X����M5�H�V	��?�(,8��P�$4}�@�P��R ,����Z�[�9�6�?�G����{+�V�C�s�g�vp�iPGS�}�� ��o�j���L��k�yU���$3���4d�[�p]�(��(��x��]z�8;�����?����pP��OP-O��x^0Z%��U��*3���V�2�+#0?��;\Z���;GY��(������VT~��b��i��y��3�B��L`a��m��[k��;�
����������{-"bl��9�������I@�<3+v�-v���NDb��6�:t2����1������������?N����O����.���{�ys�������g��13 #4�����(abon��� �_	wC.�@�Ds����g�D��|XIh!:��B��b�=��Dz�������t�U&�m4*�Q�P�s`8���8�����'�#5�!��,��*�B�$��Z
V��|��p�&s�<U�J��%#O@�m�,��-Z��|<�+�g."[�$�����U�������.]��
	�t���E��y���=��Q��b�������}�y���������}r������B&|�������u�t�E��G�m�"�_�[������Q�
��C� �h��� �x���kE�-�e�x�U�~q�N�E
A4V�%'����(Vr��[76����]'������)���D��L����A��"���A�z���#$l�5�<��D)N���S�a�e7H*�ya�w������&�P����Um�(��U�$�l��h����yI�N].7���"!i��N�k^����No��Clv$��K�r�U�@����3:c�V/i-,r�n����6�]e��o���]����/�N���E�������>P��W������
����>w�)��^I[b��K�D��������3��>�*��^���h�6K>�6�!]�1ogM:8�a���m�Y�A��������(^���~m�&r�����n��t��}2g�Z����������k0������'�|>m�����x�|G�z��������;=��):��ItD����l��oYfl���i��l5>{��\�����|x���S�Gb��x��3�\.{�UCU`�[��������\�M��y��U�8+�[2?�-�!~�Q���t���U�.������O��_>q��OD���7����n"zV._	X)������2%'u9�9��qzi�Lu.sm�	/��44i%��'
��_�����>W(��2_�~�v�}����$.��3L������=�^7�pXX��Ox����,TDuV���������E\���JzT����;.V�}�����2�z���2�U4jj,��|j�)�4F���PMh���&d���O�����Q���5T<��3��s�����};�oMI���}���������sZ|9�6&x�I�E���&\��2�������+�����H�5	�����������Nx�rB��mw$��w�Id�Km���:�^��7�3�(�v���f�Y��r���P��*\a�u��:��$���5��[�*gM�|�h\�]�vS�/�6��r x��A$Eg}2�%;������Rn������0�����RW\~���o-�{���/7�$���$��'p�y��z�X��S�0*����M
��B/�G�~l����c��k�y��oJQQ����4�!����*�<�Y|�:/q�a�U�WT������KTke���C#�����eokVS�����D�Nb0�*5m%����"�%���!���������5���&��5�u�e��1c������o=��Og��Z���G�>w��z�E)���'u��n�
�[W�����4�<��L��=�{������=K��c��`�D�gV�{�����E�F�y}z�e+����*	�[F"=P��K��A�M���pP�y��H�=n(�H��!d�����di��eF�
Z"os��x�����&^���������e�`$���D�Ht��o*�r������D���W����Al�)��%H�a��E�E)q9Zx����
�x���8��Q�w�\���y_��^�=~������d�<���b�\�L�<���#�m��}���6��[������T�"�{��c�[�[��?:�i��x�����]�w����k
���T�cf��	b������h�.M�A�di�����)��
%������<�o�����x�|v��v��/��rX�q1Z|��K��������k_.Gv�N�5_?����S���$st��*M�?�'���n��������b�/�_�����,p�������D��
�M�:Wht&4/e���d�l/vn�
���r_#
�R�	���{����eq��U�*"��A�
�����+�8��D����*�)P�]Z��>s�G���<Nx�r�.������	n�����<q��?��5	^�*95r��,������+��OO/P����!w�,����}��v@~a�]������z=���H��Avh'w���$������\!�<����������i��<W������m���_rW���@#+��x%�7�J�*�M2���=��>�"�����A�V������p��?y�������dS�������D�(A�Np���@��0�������F�G�������}u��m_.����aMt�b��yF�A�����y7@�;?�b�}>t�k&1������~q2�<������!+�4����,�IZ�#��p�~�@��-�J+��0�w��wy��d�'�y����������'5��]�1*�6�,��e�A��|������
���G�KTV,_���E(�5�P�d��p1���Q
�Z��mL��3���!�+�>!R��]L�����+���0���I�e�^�rS(���
��
K��b_�����OQ��:j�1U_P���-RG�W]��911q���Ry��)��6^�4��~�.'z��~��a��1����_��i���w�%(}��|���S�9}6Y	/�IHAG�a��05��UN�q\�F+;���y�(��� �������T;J�����?���LwP����>��L�i��->�����P��Yl��i����l������9��M��"$�G�2}h~���{Pw�X�p���H�.���j��H���(���6z�p���)�Q�.2��ib:�iPLY�8���a8
��4>�V���|,��K����7�FD8������o�'
���^����eGBy����+��%��Y���[6@i(�u@yre
VW���krKBMjj����������������)
S`�#�D������~8I�cw���0�
�����=+	�<Eb�}�D��2��n�s�bv��%_��`S+�����%�?�x���>~5D�+�a�O���i%l�����g��~J�}�f�x%�Su���Y�:$N����x���N�E�23""�X���,R���d�"�/�v�^��Es��\]4#�n�.."����oRxg�����%V���*S�����W��U��d���C�h�k�z)�oc�N�:�N58���&v0"N"�����/xr�����t&�B$a��G_Q"*8�GG�(�`5~�P���+A�o�(w��_�����QDtL���*7���Q6C���$���N~��8�=��T������&�d(��#��u��Dx����P\Ff��''��y�,-}&���K��������,"bK�l��XX<O��%d6>E�t�@2e#Ato���{��I�� >y	���vv��|���A;�F��(�������&����h�J��t��#�������y�:���_�����t0
�����znY�9!��_;�6>�-�]�	J������?>��S�49�N����L��`�����tkB��b�6�G"R��q9���u8(�d?l<EW
3�P�!��A�<M����>����Q��M0��u�;C�{�

��5�:�����>�����c� �����e����P�~���|����1��^�]�����T��o�Y�k�\!D���4��I��^���������jt�&^E�����x6\Ru|��\oE,�J+�(bKDD�qI�es�p����!_�3��7\�&�S��x������0����)����/;���9>Qvc:c�����@J��b����H���:��r�o�7""�\�!sp��
""Y�r�Y6�����+�����X\\k��� ��G�����k��@���)^��!��9�&j(����m�r��$k��T��u"
T*�J|��k�Y�K�3��PS}o-��2c�e�X�����[U��;��4���d�e)j������.MV��6���T�:\����rCu�������z,�;c�jG�L����b�*��DS�y�����d����4�=*��q�������n�&�0���U�M��j"p���T.&�m�������=�/I6�������h
��(�m�?����d:S��4X^���#�T<��Y�����3����=u�w(c�����ZU��
D7^P�iam������o�~�����B�G_���������~����f>�zmH^M]J{�24��j�������������Ig���\�4:,��xL����3���M������Zv���Q��������6e������������A���W���#=�d2s�>���W4�fpu����
~;�,�3����*���_%���B�<m�K������FT��������	��i����J���n ��4q�X��;x[���,�-R���N?4��V48n+�]���75%#,&f_B?��������t�,�;�P����Ig��e���/;IG�1������/J{�m0��r�� `����A��C��3z�{���w_W���$��'�������B�\���_��RS>^��	���Y��%,�
�i��)Zp�ICN��!���)�7,3��\'��
�.X�Q��f�@�ZP�t�*C��[����3��6�����'k������hj�����_	c��Sa�C�\!6���m����_}0
���������
?I|��tu\:[��L��9tOw�O��f��
B5m��Hd'�#���p��2^�$�1#�4�j��������%'-����CJ�C��\j����t�Kg�\��&��]|���_v�rj�:�����S�J8s�L��z�%���U_z���xS���v�v��w�U���>��8o��-�����.,���������H�0W��
����%��w�XBJ[M�@���(�2��W5�-��E�U(�Hb�v	���G��ED�5�Fz�I�L�}$&����
A���$����^��(������L`�,�3��c�a�	����n�BJ(�[�"����[����������UR�ko6��7�W�_��*�!b���7����c�4�((������'
���\����aJH��S���h$�������J���� �=�k:�"��mK����������g_����8�c��K��mK����<�l�Od����-���������Z�m2�@�V]�������U�����P2��A��\��@�31���h��{���/l�4�O"|n2bb�P�d����e[��^���y���9���F�|j��Ol��x���_J�/��1X��$*=!&�3;�&�Y��k��.Yg|�*V�!hZ�<i(�o�]�����AZg�������Q�yn�&�Yx�
���m��;����Y�4o��YX���?v}@���gO�
}G�u��[�Z3O+�O��.�{�9��d'x`Nz�c8)�,�`���_����i�*nm�wd�5'M���g���;��FouU����^?g�j����l,�
,�����7��n���Jr���px^!+�`~������
������)Ir�`�jETP0��c2���/�+��em9�%�ac��Ko�l�gq�~p����s�qd���q�.�����R+<=���|gBl^(��WC)�N��*�����P��t$%��ed�H�^_��]"��M��w���^Gw��=�i,?bV{t���r���g)�Qo��	�oN��w%yR�H��$�S���i�%�QvU�J��M�9-��������%�_�|,IS�5�^R�y�y�o����yo"0/#��a)p
�?`�7��m�L�)Zc'����l���7���������������_D��(�-���	p����)�lJ����O��R�� .�����n�e��>�x�B�>G���3�i4V����m��r� ,-��[B9K:{���Y}��J�&>�>PC:&w�eT�8����#�mSi�#F!�p��9�T�s��.��?lQ`��X�Y�c��0�Ng1g����6�b'
��>�����S�|�j��~���Y���J�e�c=������+������SA=<�_�������s���|�����L���VVV�=���8`:��,��t�?:���N�[�9��l�l������9]1�x���KEN)��'����m�VJz�Y���X@C�w������}����y���r�j	
���'���-3���`��:P�=;wmC���&���lWL�pw��J��<��q)	�2Un/i������W�JMMJJJR�>�~��?�2�#���T�=���17��f��1���MIx������e����le2�VJF�����*4c
A��(�udY��r�� p������?\�����@@|�I���{���>����/$�A���x�����l��4T��������+&,UPD�P�8�I�}�T;f��\E��R_~�pTF������if��0��=��ci5�?����0A!����M/������/E�L`�~:�Ef�������i�\j�W���S�w/=si�5�+Uh�E�O�:���r"��� 6��T�~��'}�x�S�D�0\�_�$�R����(g�.o��H�������s/T���+X�6��������2�e��g����K}1g��<�
��)�1��9�
��?7\�������'Y�#�����:s����z��;��N��l�Vz�xT7�NW\����Hg�x��������@)�kx���*K*�������6|>��Z�EQ�m�1�'����h�������?4k���]I �3���S)�.�����A�����)�:g)�L�3��E�%Q�-���j�d������.F��o��aZ��d"��u�;��1������3v���+�L.��fm/:��~��YAcL`�xon�|$$$#)��B�S��a��������/����Su�sK_�W�w357ne�cP)��8�T�l��{ �`\�O����SB6���H�m���%��Qfj��C���	���L"�������]��&����^b��S�8\���A����VX��hO>5|�=;���#j�cj#0=�#ht]^������Y����sC�����8�VCXg���s\�=0C���(�(t	�~��i��Z
V�t��|���xP���6�>��K��C�K��2(�-�D�0�<����2;���S��<�@�G��):������x��{��(�$e�O�w8�.�Ah�����[����e��|t�e+��_`b��pPZ`0=Q��N�\$>P���1�(�
@���������9n$�!#}
�\
2�^��.�0]���=`rG���]x�	;���(��#����\��
z�����#�o�z��3���=;�R"���<]��T\-�2���d�`��	�������?S���_�aE���YzhU��]�R��[b������c��#���RGz+%>./��Aa��8k��5�{8��<}�����E�����"����A:�K:6����C�a���;��L
Eoe$at=o��Z�������q�����;Zj���A���Xg*�F��w��O�R��ek�-p��A�p�u]����L4��.����n��(j�������~�C0��o������stcf�Gp|~L����fb`��C�e.r�=��)t/#���^������
�`XZ�������VI���v�S�~��	��D�����������c��~����{�i4	��>eL;�'�x`S+`�0I��J������v�tG������%#I�`Y���8�|��n �����}�R%�w~�fI�;h����=��%S	Y\�%�IM�s1��1��:��A�,p`s
��r�3U`H#�FMC�n������Z��=���F��h���3�b�*������H��M/��:�a���?��o	r��x��aeh����&�7�H���2�����Jii��x&"e�����%������4LPDD1`�Cc�W��.#�����P����TD��B��{��&�������|�X.�m����T��~���l�l�z^A�2�n3p�&�3�tC��/�M��hI��qo�����B6�{�-~?O��Y��&��%�A=�x��%P{?I�Kp�����`�{I4��+���zQC�����=&����Y<��}�p���	XSg�>��3�L�2�*
S�REATd�.��(TP!DEED@�$@ �Z+�V��%*Ud"B ��%l%�B$���lK�m��}��]s��1&'�<�����,R�����][GK�z�Z�X<�E�����cc�;�5��A	F�|�Sj-
RU��R ��U��;�A�I��Sn��|j��5~@��>s��J��j����/�s}/�9;@�����������D��G�(F��/���f�<	�����P
a�*���e�`#��>���mo�����3����_6�#
3��U����~u������b��}JF;w0����V�n���,����4@B?��;}��m����}ch����
�=b����fC�I���� }��(�F�N�����s��j�,��[|SP�s$Sy�[%����qp��~���hM�}���:�.�&��t%��
�+���91�����p3&���d��'r�
+�6�zq��T��/�l@�~��W,x8]<�V����d\(��^��^jX���S	I�d������p�A�-����8V$���nI �r��=�Yy�V�����e���
ki�3^SP�E���V��B��K(�����T�Dy>���>��a��X��B�Vq4��=�r� 	���_�p9#c@e��{�����I������3W��A�_nQ�7��A��V=2	�r{<�����<�8��"q<�i
<0�dr�&a{��9j�\{���kSj�$g�����A>��J���E��9I�L�:�[
+�7�U,��q�e���%W9qCp�3��������.XH��J�1�`KKK�+JE���������A�������,��7#�",���B������&�l'7Mc��i	%����|*����U�g�,������"L]~������U&&�����l�i�d���8�>�����J�O��)�)�x��������~j��W}fx�T�:nR��5�5����Q���`%�q���4R7��
���}��/��HT<���m��:j�G>��v��\���Ro�P'BK�J��0A��#���
"w;��(0%�	Y�6H#�=������"��/89���yGo��y�
�&Qk�\@���dR�|������v_~l�`�,��
JBqg|�
s[���^�Y�7{;����j(��l�1op�oD���S���P��������v��F�J y����7�&��k��L��3:���k��d����k+�)��5~������>2I�"w��-<5�$��s�>�zS�K���U�������+Gp���_����|@����c5���7=����+\�W��D[+��N���t~�����kE[O?*[����`�2���������P�m�Y�$V�]�v���_��R(lm@5/:��I�0�1o�[(�O�)2I^��BU���'31�o�pK�B����_KK�o(�s�IM]��;v��]�$^l�����Jm�c�Y�?�=���g�J��N��g�k��L�,*�=�
�
[�-�O����Ssu�1ar~������J�!]fI<rd���R���SWz�O�G���X��TI+�	��Q�H��-��������.'�L��P�`���Y#��|.�Y\`�O*�����%sN�X��;+����r���DK��#9�@��|t�cY��B�����|vG��{j����Iti;�z�SC�1�;z��MSg��0FP�Q`E����@R�h�)��[g2�\{���uU�:���Fg$����1R�������`�
| ���J�.m�������~[/��K��g��������
5�jWq��u3�>nMqW�u��W����l���7�)�C�Y���A��x�u�r��:�)L�������	��� ����-!w:��LB��t9�P5j�	6��
����3W9�����8��w��e��1�������}O!(N�U:�]F%�sr��%�0���'S�.p�|�"[���>����P���[R��#J
��W�����^%X�Q�����C�~!���������fT��[�9�����	���mz�����3��i�d�.�~�q���o�)��~��W����h7k�����,�������������z�k������{��|�r��S����_mpO
�������y-��1Y��Q�r�I���
V�F?�1K�1^��"r�c���p��q������ �K�x�$TYJKAJ�6����&����u/���YU%�I���qc�&K�����4>n4?S�-�V�������$�>��?w�[��R,��6Q�F+I��F*���R�������	I��*����J�4Sn����s�����x���m�C�U�������Vc�s�F����|����v���R��Gq%��"|x8��yR�2���L��n���3�;rg6��������C��?��R��S�����G����zK��-��������QVa����5�]���u$G��BGK�?a��O�=T�'�
KHP���b3&]����zz����W��V�~:�/��jl{�[m���p�� 0��������GP�<���U�B����Z����U�,-���vL���2`��?f��e��s9�L����[P8
l�����bQ����K�(B�+T��K6y��
��l2O�n�������F��7��w�F�Vz��!'�D�p��K��<�e���Q��Av�&@����Z�����l�R�7����)6D70@I����U/����:�w���5�SN��`%xt;�q�A�M[�B�a���p��:om.�vH��9�q���r�=c?@�����$�.�r���`�|g��#�Us&�8AG-�{�c<,�
=*��y��)������)�4��c�i����;� ����~r�b���]��R��4>�.%�K�����z?m��Gt�,��*��;C��Z�oy�����m�S�i��i��l�IioM��x��o���t�.����1%��r�_V��_�MRW��!�GS���J��������{�
c5t/�����'�>��"��?�:�2��i����/a41�.-�l�4��h=��'I���[��U���j/���?#��b������UOI���X�e
'&���1�.=�(_�3����~���3r=8}�r?��������������7>&F����7�/6{��.���c�&B~U]|��?���/��S�F5PN��%wZ[�hG��Jq�w��� ��(� �%x7�c�&Q����_�b5�;�����}m`�F����Xz&u�����4F�U��v�����fo�b������M9Xk����-���X���5��.c�N��Q��Xcu����x�@?�����9���]����������U�����x��u��b8�I��m��t�������J�����i�:���S�mq��+XK�(�9[K��|�;�d�9�i�2m�l�7>�u�Q�&w���g���-����
��GZ�%j,)�e����v.-��1�V������%oH��gF)��cY�����	��b�g���|�����0��(�_#1&��Q�j��w�D�E��>���9���oB��0yi��G�����h��HGV1���"����(��s���26nk�EA�����_�d����*�@����]���@O�9�F9>������0L����-��^�vh���)�����]�#/a�h�\��/�G�g���7�O�1a�74�-��`�������C���s���������X��K���hT���Y��|8+�-�6�!U�nB����k�
n$��q�/G������w�����I��$#=����������,oQao�����(�i!pq���,�2�1�;!d	���K�za��R��6�v�A��X?=��p��UC�s�ca��c��o&�����$��8;v;f;�X(�B���$������I*��������@��;�����V�
��dU�=!����Z��'���<�,?����Q���"�����>g�n��V����<��P��|�6������Y0�7v������bXc���+��*�	
 z�AU�Q���Y|X5w�6�G*�%"�|����J�'������
���\�cS��e����������#��:1h?�6`�*��0^
��]��5?��������(��7	���A���&�����Zp���}�5�r�m���[NC�u�F��e:�0
7�[Zl�@��&��cM(���u�tF�����y� �o���X������:|n���n��})���b���a��2!�����A������3����xJ������`���=o��,�H"5
�Kx�$�nk����Ul�lu�A/�V���?������a��v���/������=wJ��g�M����f8�/���S��Z�"�z�|�K
��>�v��(���=~6*�U�v��S��,��gg��X(:��>O�����fu��Zs�s�u��S�!:���~��k@�z�����8���S����y�Q*�ja�`��e�$���35i>���$m~�5��.�b�S��]��QcD�'�}�S����^������({b,�]�^�j,���T=������V���&r	6#��?�����Q���=W�*�����)�!�9:��xm�
�?0L��D��o�pO$�c]�l_%5�2��'-���X�K�����cI�Ys������%�/�n����G���������&��>���&��P������!��K0���qR�(7�����iY`����������Z6!����Yipy��]�����F������
��1y|,}�������g�$���O1����f�}l�\ ����/�8{�mt�������J'G�S�}FM�^�V�,5��������J�e�W�K(�^oS����|X���O����Xu�����6p��\�YDxC��8��A�gJ[[{�X�
��1J�����G���*����/p����(0��	�����6�N6��5���2�:�IIa����c 9�0!����Xjc,)%ej��p*����`H������X=g6�B`�����P�W��r����wx�yr��
l���#
��
q#s{j���qLTh���-l��{k�d����������IF���>d�Q����A��v���#(E3ri��:{d�
��?�WQ��`[%��0����uM�:��A�GIIUP�?��&da����za�����Oo�l���&�
��`�:��zz0#�[.8��7yg�U��5t�r���`���� ���c����c�}��N��0X)JN	@�K��(��PvX���U{R��!������,�|b��0&��\X����r3hT��^��k-�'}^zv�mo��z���	�?�������q�t?�����Z��m�F�MOh<FGi;��j���3�=��&[&��5�D��S �
�/�*�<��=�6��<����8����K'���P�����s�}�%7�4'rH�=���K���W}����Y�qt������~�w��cn��	s�_tr�9���w�f��������k������g������l����9:s8g|M�~���}�m��|����^�O�3�+���<�*(�W�D������Sr��z��*�Ypr��fdG�ey�x�����.��|�XKNye��m9��!��?�mj�*�.>�f
mm��������'��+�*���r���f|e�K��_l��.2eV��b4 7>���+��,f' T5W�������Z��'�4TU�T`%�&�B����\��,m�1}
9��F�;�1")�9M���t�P�8{qB���W��x��e��5V]��}�|y#X�����$J@�gRX��<���;�����w�7�.]:X9��,�L' ko:����LKkxt�*�5{��.\�xq�UW�\���x"����w�i�����f;�~qbRsw����3��%y��Y�V�a~��X�n/�`���6IB7���������&�{o���C�!���W�=$�8!M���^U���b��Ae*���g������$=���H�U�	]M(Oe�3��D����S�J<��B
k������kx�x���;��y����>V�>;;;�����~H:��r�}JejO��/�|��m	�2��b���U��hg������I,O��x��������k�Y��J�2G������\��_��x2dZ�e����f�d�>+P��p����Z�
���xu��ZU�����7)��q�nG��hv�[�o��GN�������H��������7M������D�f�~y�S�p5��ss��Z�`^-C�U����L��zZ��[�n�6��:7>n���DXH���m"uZ�s^����Vs�!��**"YU������Tj��j���U�j*���d��5���'����x�fR����|�_KU�����-)�Ts��~(����z��fl(g�����(�E5��e9rqZ�2�H3FQ6nh���YL��z�A�����p��d���!qL�b��{�����a%�1��K��W���>
9��W�������\��r��}����2��50h��n��*�[Q��my�f�%��_v:|d�M����(���j_u�����?>��Gn���*�Q*
����	�d�Yo������3��}"��� �j!-��)�iJu���L��W�s�
���}������Jn�>�.q���4�E��Hh����o������1��,�T
��HB����A��6��
��m����������f��gc�5�8�%#�@`��i�8g
��s��Dk��!iL,s�Y'J�b�Gq�F���Xf��M�Q��w���'EO�A|v�]�G��������}s���q';�x�T��I��~�J#�e}�-s;�E� t=Z���4��7tk��d�M�����AXazO�^V�����Gq����^gVp�\9P�!@-
���@b������y^\��}�]���fh��E@7
=�Rh.���t|�QVP�Q)�n��*.�X�������		��3y�M���������FA'�a�u��J��,�|�N�r�_gI��l�bv�]0����2&�e��W�����OH^���C�CV�h���d=TE�j	�L�M�7���^��:>�����2�E�an�n����������V3S���yS��Zt�����X�����
���v���j�0���5��Z'��K�n���,Z�R]]��C���=|qt����J���u���.�Ml|��-��k.�&@����3E
��r������wl�MfW2l�'�P�-l/"�(ty��t^������f8g'O@�N�r}DSK����25''g��F��4��i��:��0 0aW*����(����~s��y%�e��
�\o�Z����h5p��m�5!�8ZA���x�"T*:�I����Y=4��@#�0��e��o��*��>6Z���=�x
��[�t��a!k�J���P��t��A(�Y\_��mE~. �H���<%[���Q����WU���b������~�����FgE`{�.7��V���������y��.��7k�~��}#d�L�G����C�V�*�:����]�c
%��AAU9Y�q-)ZC�F��F��Dx�=�e����:G�2��_d�������V����#w������8l��W���_�����:?O�mKB����,SX�R�����&b�m�7�ni�xSv��[�2��&�^��4Ad�p[������$� ,�W�<Qkd����C�$$�HZ,���b(v�5q��������s��x5d����Nc����.e��W��`eS�����{�'0�NgJj�|cI�|o�����i��1��F��#�(��)\3�%d��D����eM�1��GW�P�Nt}���r���|*/:A]I��T��.��m���NB��
X��*�G�&���n��E�?�������{��A*����/s����r_���s�%^�~�2����p��D#7/J����y}��K��L���]����[��\��j[e6
�r����e�7���+���0iQ�%�}*��z$����������)Xc[E�I�>N]*"�a�(����
Y�O��s����i�f�G~
,w�r�]�d����P��o���Hp��4���
jnu����:��T�}JJ��*J���6��� ��{���J�o�O�����:�C�������M�;o���l���{��x�L7�7��9
��%���pL�[PdV���l����s�$���������y��C�_���
�X�x�tG��!����?=]^��A��5|����*�Z��cdO2���������W�\�u^��D��Yc��u�8HB���(?��W\/1G�?��^����e'>���=�O�����=Qz��$S]%h1}��f}�[�=��||M���L^k��
TT�^}y�3��0F���S��$���nj��94�5
�,B���]�2Y��1u��� \�(l

~W�.�tS]o��yec}��@���v*��F�; t�O���XSJ��s��������t�(6Q�g��9O��]�~�`���[��q��E�� �����N���a`�D�������A8�.W�M}*�-���|�d����h������3�mDE��L|N��,:�_��&}e����:/B)^|a�}���J�GV��T*dD��
-5[$%8��]���?��,��VWz}�����Bi�� ���yzN0l�����+>lel�_���k���4������~��po
��x'7
7�}[��5#�d�n���6�V���S�l����#m��Q~1����:1}PY�<C��H5"I_��f�a�Jw���|2������U��b����Z���N3U�F�pF��z� ���B�V�;;�����$�O��f��$��_�q�O��<�k��E>����Q�"U�E��|�|R�q�`�����`���q�Z{��z����@�����O��?u����9��fg��F�"����`S
�&s���homig��~V�m[�$��(���"����\[���?c�T�U���V�-a��^1�Q���8��.O�m��MX���*�3�=�M4���Z:p��I�1����,X~���G�_�i{��P{�"��8:�,�|�(��{u�V_e=r"����k�O�%e�*d1��5"��!�iv*��f�|�������fdb����.}��]�2����}-_Ly=oW^p6������S�vDFEM��s�����|�*������� ���</�'p����7n�f-�J4�'��[wz���!8v�@�MOt��x�0�����J�"����j	C����y���vm����
{0X�	��6zP5�����L�J��N��-PU��{�+��[�S}p-���zt����~�lX���h=�c��e��DV�(��'�|2�b�n<:� ��[+������7k�������uO���%�����5��1�	����G�=��]Tm��t�\p�)\s`����}\69���*�P����zB�
������1u���zfv�n�������O�d�H��C�B���������$�M�k�^��$QHW"�u6�Z1-��z������`��2��arNX���l�t�jr��X]I��nu��J���l�~��l7Yj�X*T�PX�_3-�9�B6�\*4�|e���S���2�6r��rt�����0%�sTy<��U!��@��E[�yk��r���Q��[�&�PA�o�.���.��.����D0�*V�/�n�6g��h�SU�;w���7�c���w�����&�b!i���������v�>�%�o&6W�`�S(�_Z�wt�.%!A��Fz�Yf�O��C��d�.46�>��G�����xe��w���Q��������`!t���]ll2qLb�`*k�A&�o"Z	e����.R���_�_��������1��������f���������p���gz��{��i
��tt�����h��$nmy��M�e0�/�8k{�� F��I��?��p�
Vo��]b�����Aa�P@�U��������9;3O�������>u;���z���iW�q���bx���i8��I.W���6�;?t�\�}&nk\kfE���e}�|����o
��vPWw.��APP�����G[�o������jK�=�	��%�����(��-����TJ����{�m�Mz�+��c1�f�4,�+��k�U2����K.��whq��'����S��m��Z���L(X����Lr�a������`��3g,\X=m���"o?}Y-`�"�%�?#�y���=_g������������A@@)7������t�^������{_|���q�Lt�Z�z����I��B�S������*���k0�n��}����:Gzyj�]�H��6mIB���y~e��;S������a~d�v�L���
:j -������`���j�R�����zs�~g\�P�<>6#�i����|p�@��9���Rd������t���@;����O�����m)��^�e@����e9����)��^��
�hb��W�u�c���F��k�QZ
W-�Y��7��3m�gj/RU�1c��eW���Wt&&d��MdL����d����H����0{�rX�����7K�.m���0�5���b����J�l7sS��������#�O���
7���Y������b�&����6��t�7�3��S��^�@���/�����'�6/0��wE&���Y�Kg����/�c�����>�ae`�����pGk>��3�;|~*"m�[~B�|C��K�k/<tg|(����b��a?X!��?yn��ZQ�w�>$z�R����7z:�O/�n�h?o��b�?[+������+-$��\Z�#��� ��O��s�<j(�]T*��H6Po���N<�j������67j����&_��H�������j�R�^k7�����#}���������3�+������G�J��E���U���_���"e�[�I�J�����#���M8���m�-������fA�m ���n���AE1!/L��heL|���7<n�YT#��{�Qn���������&{(���/�gLIN�s�S@cQ5��=(�L�ax6q�9��m}5P��k�j:�'%������wO� m�g�@���$��TV:"������/�Zo\���w_n�0��.x�S9Jq1�����������4�
K��,����{�A�����C����6U.��?��Vb	s�\|�K��G��5�����=s_�k��{o�>""u�T�fB)�m����z�L0n���999����V�4�E����+�0��i��um��aa�6e$���
�:_��������B����~��3}YGS���_CU,�_�L{Y&��V��~}9�<�@���*�u���
B���'D�i(~��yjn������7�V�����~O�:C���1�x�2e��������*G8,�x�h��V+��b�`���%?��hr��(��������\v�{C�����+��G�����Z�����V�}���f��Fn�P��h��Q�w���K�?��(B��)���P�vw_��x���`�y���v���;o�_�b���w���o�d��
������K���:CC�8L/l��{\���.���[��]���gV�u]��G�C��?j)>e�-�4B��prT~����TUa�&&��-<��`��ZNR���l�eyqiIcc�Q%�J�	9�N��#96�T��Q��
��(��P���L ���%��b�F����	�`Fe-��!����~j8���A�`ZCR|�����������wV����]���m$[�����I�h+�����-;�<?�w����|9;2�n<r�X27>�]

�(%J����x�����!��G�l�w�eJ	�U������!-Q
�{�~R��j���c�71��DY��3#����n�^�����1$�L����U�T��vl��bg7�����������3���|y�=���7���_��w���r����8Ho �ro���K+{��Be�\�}����W"�l��2�L�o=!�NU�x>�����[!^k���Q9r.�*���&&<�m�2 �����2]�M��L~:��t^�;�)x��]Q����0v��r��l����C��"�����t�E�U�#�
��Am���R�������N�^�����Y?���,.v�.�/l�����]��]64���.�����Zn5��:�����E�����"C�)���+|��**�g��O�?�����2��4CZc��
a����}������7}���D�[k��j���#��*�<�3���MADZ,r|Y)
h���p`f�z�
���[��J��D��@���(#��7��r��0,�$�������_;��0sr'���}����x��j���1F������MMQ�|�������s���=����U�g�[.��� �d�-�����f����l�:��S����������/��$�/
rQ�yf��5�%V���E)��B�����/U�?�hNC���-	������&�M����
�`�V>4b�l��**��zw9M5��R�4&�b�6L��5y���hx�$
��kFy���}.������g��zL�J��.�G�����.8��t/�_o���?��i��GB���������Ai���������w��wP�>����w��^�~o������T����!
�~S\���� �?!<���&_�^�g�^s3�e�M�Q������}�Sl��5H��,�%Z��`�v��|�C���6n������y�O9��<9���*��7��8}�u5��TU��L�>I����i��?NT�<}����� q�&a�u����K
-�Z�������w�!��7w�3w���I.S���|����P��|c �$R�BUU�XK����b !�}'�}�S�r�-/x��K;��0a)����5|=P�������~H9��(�zT��$�����a�k::������^�+`z	B������R���m�<�����1��-��=�@z&�e/\� ��FzX,�/�T��9�6F���g���%D�G�<'����g4�)������l��J�W�z_�1o�5C%�������K��v?�K���h
]�(�F��,�<�b��,��g6�a���_7R�a5�n����`��>����,O�2�Wi���)�����
L���hk���"�����	�0��_�z5@4f���2w
U(pa�aa���K���SI�o�!\?fT��Y����t�:������j������!�g��C����.��n�g���uyJ��yf���.pd�n���]���0��)`�?6����+�+�o���{'��ax�P��^�<=�R`wq�zl��m
���"[T��c����M5�X����#d�������uP���#���>���{�R�P�*G;L^�����RC��P��������'�x�����x�l��\T�#G�r{��HW��kD!ei���O�:U��8�o�]�\������: <�3
+^��el��q��l���b�����/Q�Q��~]�'�VU���aij����?��t,6�oW����1�������& ��[�R�~Y���0t@m�f�\,��&��%!���V�0�m��f�(j�*S��D�F\n�o��fw���������j�I.K�+��/+7v�:v�����CL�f�q�`�����K�E]��'��������5U��k+b_�*,�����BS�y���u�$�U�t�N;WB��R�%^m�c#���n� b�A�*��8��W�E��Br��'759��>�%�rl|k������>����	�(�O����}m5�
�\��
�\���V:�Ee5�������������O�v�mJ}��}���7e
�b����1
:=���"����9�W������	j�W��N��r��b�2��q����?�xc�T�J��M�a�0�dt�8�ViI:���W���~\&�������CcpD�}��TUA��B�Thi�_�;�����#�<\"2��������]��"�A��*sd����M�rC,T���hlwww�9X}9�c��B�P���:b��f�v�L����/9�V����j���E�R�����D���e::V�����&^W!��Y��H+�a�,!m���������#���^7lR��&,tt(�qa��o��N�����F�:,CF <�:4���l�&��h��$#���^4����SX�L�����:O/��������;��s�`�= D�c����
���Pc�	��*��Y�I\dQ����_���B
?��A�t�rv�/���������?�I<9���2g�/����R���l�������|��H�0wan'��!��]���:3�<���������X5�>p8|�g
GY�u���t���A��L{��g������!-[w�R7d��Di�bg����������^���*��=BBBz@x��8�Q��O�JL1(Q ��U�P���"�m�~�f N�N�F��r|pi��O0_���>�}��S�q�)�^�Q����h��F�1K�Fo���i����6����o�
�UO�W����
b�o�~Y5��a�l��B��h�L3w����p������0����^k���^@:hQ��t�����A����.G��:84T��)*�6���[���qo2e��MB�]0S�B�?��n.�(��L������g�9@#D���-B�	U��T�Y�gW�g�a	����������yb��$ts��oy*��i������w��g��aM}��3��G?�<u������Y��-���4��~�a�VL��~�s`
IW���4���r��|r��&@j��@�)����[F��%E^G�;�$=��m%�kQ	(.�sC�������9���Go�qj#�;�~����,��q�D[7��_C�9S;�H�k�
�T�-���t�B6�6{v�0�9�CZU���39c����t���f�LSX&�A�J$�K3�/�8;3�~���)?��7�n�u��$���j�kSb�Q��������~��?�2��5H���~z�iY����j������8����},�j��-&�w��#o�Yh{u���/�^e�w��;&��
J�h��pu�]5��>@�X��S��2��n��L<������|�}h������_�}�D,�����}�al�#���
��YY�h�T��1����~����;2
K���P�b%��m�so)��gs�����p�����.��L���k�e����e8[tC���O���W�*���h�q����q�UX���l���]�'FL��S7G�7�H�:�.���g�{@����h����q�o���_���q����O�U��{[V����$TvSfn %[������8i�o��r5Kh�����C��"�2��Emp�2.<	�|^����D��^l��
�V�k�LJ���a��iq��Y���_R����=���9e�go!�\������QTE�����haaarn���"�����=68�����h�B�eP�!�b�����wR��X���2�@��t����v��@���5��������>m"�B��	��.t���g���E�PW��3'��Rk&��d+K���%%������t:L�L84<j�i�{�gG�Ws����[������Ws��)��h�(�D	���4�!����z����/F��W
��+��s�Q�x��c����vT�-1�/,���O��fG��+:����#��aR�!AJ��3gJ�	����6b�7�(�D7+�^�p�~���[{�m�eZ�3��bTh�Y$�i)����CG�)��rH
��6��m���"e~V�7��|��=|�p���w�>����a+�dr_�=����C�%��8�����������h�>�����@v�N-Yqd��f�������H�9"f������D��.`k_S�
�������5u0�$��w���+>d��7MZ���]�KN#+�euY>_,AO:���e`E@���M���Ew)�����t������ �����D��+�������(6�M�+o�8�T����K)��w�11���8��brL�|:#`16����q����i�0'��N��M�L�6�nZ��U+����u��o��6lX��[��z}\�9F���Y���A��aA��9}�e�#���	���R�MSUU8<C��� �!2��@�;*0]7��2�4�%�{zrB�
j5�.�O��Yt��B��mlr#�u�?�����&��5��;�,�1�k��&*��K~�!B9��?7z�0�V?�+�H	�Br���G��
OK���6Yq[��b�o�-��j���"&x`�
�U��?���T���K�1�Y>�;L�����U}�����#�{���- ���}]:�e��<WB#c\�~�����GWc-��j��u�|�i�VqKj%U�]����2������3�o�l]�F�'h� 84��4V�m�5T�Z��Aw_X�.2������I���.����cPK[�(��rs�k�q�o_m}���l��g?y�������v2��=���Q�h
zl�J��7�mZ�c���V���(X�;D���M|��t�#/���� ��#-	�\21.��@����Q��#)�>;����n���+(�$�@GP�@��H��b9l�����JJ����X�Gm�����	�?�QQB:�u�`��SB���o��6�^���_m�2��7i4�������������)�B���a���IE�u�]���J�r{W.�a%�G��p>x�$}������������w��;w��SvCH�U�.������4�{*�O�9�
 ����+$���������������p�V��*5�KI��ec]��"_�$��QU����a7���`B����'O"�hW��V]U|Xe�����>�������I����_���E
�-��p���{�nv�J�r���d�f����"�sY���sv�{��%%%>}���%r����n�r��c�HE|[L7@�iGL��7@�:�E\�������u��+�C:-�[<��:���W�rw^�x;�uUn�9�#��m.T�����jy�u�%��{��z����T�,%�/�{RG(O�pr���7^vV�Gx2��8����)��?�����o��?e|�"Em�:��R��C�A\|r�q�=�?��F_\�\�c�8�w����K���:���uUtuW�'�c��Pm��Z�{�h��w\���*c`�U��W��7@�r���zm��� :�3b9�J���c(WV����f=%`'���2�L�L5c��uX�6p��%���yw��
�8���^�]�z��D���p�\6�~m��~�d�7����Og������KQkX7a�WLS��\����-|Y�����<6VNG,7P�����uo��
��w��QL�Y��p��w���w*���_���s�k��1�`�]��K}���S8��#�$�&����u���P&�3�KWR�x	a��;�:�H�
~�������;Y�N���&���`����G�N�7����s{'iS��/Ut����Y��'2wHO���v|����c��JX|1��ck�����}/�!U;N[P����z�0�t���x��F\���]����(� O�0R�K�I!��;y0�1 �������;m�z�[o�&�]�2j���!�zV�5�7�����/N���N��J�/�%t�x�����/��D�
E7����;�����###�!b�&�3�������,�����HH����\����1���B�lR�UK���Q�%����'���1��*����������>�G>_8[����5������������
����x~�j_9�+R��[�������/�P����	=�ma�"I�<�8zEfD}������^��5�W*�3��	�lA��F�z�u����7J�;���Q,��/v���}g�rft{�O/lp�V��c���<C��^#C��NVg�[���u��������, :�(�����_O�&I�����\���;_�VD�@���`����������:u*>>��k��4��#�Y�}��QH�W��FZs�r�/b9�ft�M����P���{�5�jm}H;������IF����v������y���i����Wd�N�9h�+�lN���{y�J��-h������U||l0�-^,�E^��.ochX��~��J��2�e���3��B�<�JaDMR^�Yvxr��Zm,[��8�6�E+E]�Z0�\Z�K��w2����h	��������&$&���~���"k�',lP���}���@��	�9�\�^���A.c���N�)���G"'������� ��nG�?�^_��j�����e��2Om�P�����n'd�J7�c�N���~}�J[&SM���a�jg����s�:"��7�$�X��&N�C��g����$��;�HUT~���Zs���r��$$R������AN��������c��;�k����~O��Rj��//�����1��u����t�f�R���/��L��z8%KuuS��t
�j�����J�]:��E�E'�C��N��<���iV�d 7�w�>��.@oF���3��#����{7���G�lQ���������!^��c��k�&
G����w��;����G�����1y�+����a�>n��
w�����6/��iLj�<���E�.W�_T���t���{�~�7���t��C��{�WZ�8.�4��$@KL�^�������6n$��@�w�J	N�����l��W��__�t��v�)�7[��W����N��x�D�4����km��D"k�]�/�H1���0��o��q�����'�.���>HaT��q{��_=�M�{��Yn����u�^C����g]J�����Z2�7paq/�
���V��+��QQe

���N�������x^/�g]/�o{x�������5��|nV�dvF�Ko�>��b�t\_o�a����j�"����{����*Lj�s���=��4��;L��	���`� ���Av/�d@�&���U���p_�4��[�>~�c�<,����+:�����e�:q��j��{������P)ca��Y����
�+�d}���a���2;%J�����������O����|w\d]^}��*�y���V^�_��%��;�_��7S;��]�7��T�~L�B�z�^Ig�����W��-�����z-����-����j	����������b+XPH�Z����"I�(�+E)x��9A|m�����1V�����BE��V8&DZ��ic�]b��;,a�W4�RMU����j��>b/��������8���~�����G��b9���@�����O��K=��5'"	NY�����.ES�+��\��<�:~�� ���O��Q���3�&
n8|���~����5��g�X���@�5�=�G#[U|KW*��G�Gc���Q�������{6S|��ho�wI���p��CW�,-���Q�f+�;n
,�
2c4n��s��2���J��h3�/,���|����)������a� ���+����ewr��c�r�,9q6��,M4��M]���6����8u�'1���(�c0���pm�����O5���V��3���u&�&�N(DVCC=UmX�SP�:��'��A/h�v_O��Z}p��G��5�um��e��QTEQ��c�+�TD$! % %�����4iAJ(	 "�:�@���	��tnu������}��_����}�^�Z��vC�����4;�����$��$�'�c��yh�tG��H+��O�	T�
,���,(�������w�5|�#������Y}9��@a����4��c��T�JZ������H|h��36X�)'�EK��c�c�O�'��mz��Tl�`�U4h&[}!�;�{7�(���z�EE�]���/�P�y7��S���+���uT��Sh#�z��Y��Z���s�$kkk�N�bg����9��oc��ec����,Mk�b�33��u.!.I��o�*��~������P����P��d�����N�iiN���-�jdovWz����Z�M�k���A���I^\\��[��h`@�.����p7t������2�[*������6(3s�U������l	S(�Q�]��h[����7!B�\6���]a*�����z�3�N���\W��i��~s/�K�@+��A^��V�?���O�6��o���;q�o�	��o�����W�
pJ:^v���
����3��/9}��x�L��PG�������?���q�����$sT��#w���c��0>h�"o���w���9�)��$��4u+MT���4����_�����B�Y6�dR�]���~����n$Y�y�s��>u�Q	h})C�(7-<_.������VGe��b&}�&�<�i��W�!7H��t<�*�2����L�X�j}���5U7��z��*�����Ts�l�C=���f����&�,�	\�^y\�if��:�>-0��2]O:��E��Cg�F�R'�,�������,k���Ko	�=b�qM�1H�4qpy�m��,���G=o2{j�a�����e4�cN	}��T��[�a����**�N��qf���4��(3\YD:>1��P�UE�����l���B�Z����x�8���*��Xv��x|���>�|2�����H3 }��������!;?$���;�[��#�<M���x��Hy4Q�:���U� �B
����>�=�2���3%3F9�.��z�=��=r�n��@�/x���a���������QGL-��wO���A���x9��DD�
�$X�"�npx��1��X��#�[��((��!\-��pPg��L��M�������0�<����D�'N����@�
��V�8��L	�4�R�dGKP�as����[4��������X�^��V���:��*�={���X�@|�������?�U>�O
�=LZ$�Qg'�A{�<���I�-��=
�:Eh;��
��~��g����������o�0������%w|U��*� ���<�V��,����L�����x��?b�9^s:c�!�`-�HI"?U.|�?l�Z;tb�&�_����j��6���$��7�*/���yWj!f�����/Vo�����a��yS��c��B�l{hYn��:�BMV�����z���f]���&N6x�i��Z1<��k���������.�d#�3�g]�SLes8zh40�
���B������������|]���������z��G�Dw�X�>98�P��	�S����${��A5�m�H?P���q�R���������E�A[~Z
�����sZ��3�F$:{��k�&N���UH�������:�����
���V�P��5��$6)e�Et*�PH��.�k��m��=9Q��4J�np��h�>��������|�����9Z�qX�	�G�_o6q*������Kn�1��/r>:�x�G&���beE��t��(}g1K764�=H299*[�7�Fpr/��?i ���,�&����_F�L�R����-9������Wd��Jz�����8E�;��k���+�I���m1=��P����&�y�4'��p~C����EH�������a%�E�B	��H��,#�cI����F!m��fw$���������"?�h�t��H�^�w����'�P���A����'��M+��0M?<�"�������w�;�8��q @����Mv�7������.��V�����b����'����l5��������tfv��v*6�Oh�"�����������cg��!:7t��g�����{?���q��#I���ck��I8���4�b1��]�����9Q>h����?��Zm�Ga��#Hj@��;c�*x��A-`�q�S�U�)��7_$q������gm���?��/x�|���M���K��s�������g��Y���d��������9k�}*��~x�"��)�[V��=�B�����+	�F�r�����H�E�>=DQHY+��]�p2�
D���8E��g��`�'�Q���>.'��S�l_���e�i��Y�G�V	�������2��%F�	�;���v���?C��E�@�M�T�������=���]b1'���w�<���%�B�u/��y��(���j�����6��7$[����zc3[-�
���~	[;;������8-�(nx{�Q`�<e<��w�s`�����i���~m1�_3����Z2S���b�����,����=:�~^BRR���,�z.�w�BEz�R1���[v��>e
_������vgP}UK�@3��[���x�A�i�'���>����]F�W��l&8f����>���:�8K�A�IOd���
��R����s	�y�x1�]'�s���������,g���b`��W�N������!�>F��\E�����$��5�O�����9���yR��oQB��_��
����~|�����G-S�	���������a����h�,����-���P�C�����}�3g�m�%�R����*�"y��`d0.��E��w%��E�H������}�+�/�qy)���o����X����a#�������!��]���S��!����&��p���1����6�d�.
�R��x��r�_��6���_oSSH�F�p������5����`X�!Q��I��_
�g��-����Mz��_���9������067�����.�6W��+V]8�+���<��M?^���\��[
MU�����g�����g2�M
��
�H	�UK��Fc�V����1�I���t��&<*�^R�}*�U0��|,
���I-1z��8�K���p��y��������r�?�	ee��D{F�J<�����X�>�@�:�@ft��&��S��>����)���m�%�
+�EC��L���������~�
��j�f�r�ko��I^#(���5n�����SoC�_��,�w)�LE�45��k�Kt��lN���"����Vq3��2�+-�=`��Kk=mp3/��:�����r�f�l~���P�G�� ����{����<�#a_B�����"�����R�2>��������9���h1�X�\����i���wJV��hH���� ��laoo���{�)����tz>�V|T]�``����
;�
>��T��b+�}���?>�*W3m�6��]�o����������V9���r.H��7�|��>��#�~4��<����f>��}����R��������_�Y����������i�|,�Z(=�u�sg����������0	�g��'@�>�d�K�SsU�B94�6������-V#�/�U(b��������p�k����j�S
j�J=��\��z�7-�]�����%��{�Gzc��O�>��]YHD|��c��8�\,�|��8�������������	�!���lW��fxX[&�/��Q����Z�o����e�?��x�6�n��L��W1�l��%�[g*�_������H��&��<;-��C����-�������g;hP;��?hp�^�d��bd���8���T������h$���*a�'�{�%���1��& zU��bxz�����~�h�T���n#�������:mI>�[��o���K��j��o_�s:x��k����L?
��S�
/xyc9O��XWB1�E��'�
,�����@��?��J�S3\d��@��j@�Q��7�bB���.�f�n�K�]�!g$��%)L-W�
��YF�������Ucv�1}p����A�j�PI�x�F�?�A���o�]q������^���r2k/B�^��X�SJ�����*/|n"R��[
(Z�����q�|���%��*�	�B���.�����'~�������5��w�E�S����<������� +�J�w�k�V
8�;�@V�|��Ib�3�Ok������|��RN?�P#��/��mS2��q���������}=�z&,��KY�@���
��-
���l�q�y5!�g��
s�K/��n�#�Ks4f����6������3�����I�	%�k����v&�e^���`���]��Hd+O5��
P���?��Y�B����@�����sd��c���N�E�e�5(�9���9���U�h�����������*��:�������p]�-[}�+N�����p����7<fi����R��A<!�`�N�5��:��pC0�h��b|���&����?1��>�z!(o����-"c�k��+|��O�����\�>��H?�n�����'{�;�jz����%����Gzj��
m�&�4���[���
N��Na�������J�$�cd��
��o���.i��B�R/F1�k@��P�+����@��9��>d�����=@>����VS���h(,�0���0�u&�6?���	�j�O��ZE�[�R�N�7U����_s]wda�����7}<K�'&&�>x�����_h
N_���h�>�
�/�~���ho��a�74[������x��l���6�Fw�_8�w���3w�Zl�!:x��������(�.��w��G\�Gt����g���\���3qw����yb����>�hd���7��������������{�Or(!�����3d�wX��tC�_�sx��_h�\������w���L���>�m��#@&-{�d�gS���PX�=��3vS��P?������6`Xr2Qcjvb��z,���^���f����q��u����u_%'&��������������I&i�0��F
v�c�jLn��t���[�4y�
g��N��o��<z�E�I�	�����5��@x7�x���>_�`�W�:w<�A�k���A��W����K�O�y�U9J���M�+|���[J�5��f�!Y{�I_��������`�y���{<�z	@���_4���7�p���������(3f_u����&���E�����K�E�(l�,	���O�����f�{��o����@�B�X�lN�j��`�������w�<�z[������6�s�Y������8��`�n�����&����cpye����6��6�s�i�����q?M-lw?S��8n	����hl�x������y${��ql�_������a�_�Q�z�i���<�w���yf
����!"q��:1���$���>��\�3��r��P�
l�Z����/�[\L�$�iYH����  �B�?i����c����|m�O�`���Rtp��@�2�l������[���ycMmmHTTjV�A[[�p��\M?K��3��J�en���������=�xk��qD�pL�,����I���K6�������+�rh��`��ph6��Qk$k_��([
����*�KO��4�l~^R]�/�F}�c��|��i����������������]5m��b�m�~�`��,7�w�X�O
��������Mj�N1�#����*
1��V��_����F^�8�\�W,��1�/�j��_:�.��
oN��q�+V��h�1�������7��8*�%U�L;Il�C�[��}�Hh�b�%n5���'�X��Wd��D���w�/��x�"J|z�!�AH��)���H
�!x}����!��Ye8��q.�}��#:�o���m~'����O��@7���h���[.w����'�a�T���<����r6�%�����F7Bt�O@�������A�6���-[��$�����e|�|����K��6w��'�^.K{Y���p7~�;�20r�t.G1��8�����/8�t��]?5�/�~��W��~3P�2��D�L��m����Zxu�d��~����/������	��3��;�h����;{�;��z��9��E����f`�GUA]�:�0��|%� ���&���
=]�[�x=�7�'�N<��RZ���^���������zMOxs�P G"]��6@6Pg�������Pg�'?�� �^�Nz7�#�8�y�����\/S^�~J������&U���B������h�+ �[�0���9F����BO��V�R���dk��^�.�u�a���GJ}g�d�����S�f�X*����.4��Px}��WPv�eK�+v����`HE� fwFJp���N��$�K�^@���P0����R��){������lr�K��mj.��)���W��������8�� �������������������k��j�|#���r���:A���vq�axd�,����vR���D�|�?OT��<7��T�yt���,MR{���D��K��b�n!R��r�z�����6��#8�@��
��Ze�-�U��e�d�N�V�S�;y��j����7�4� $z��"�.�yLZ����!s�����<�kW�����(�����q���S���Y�	
�a�/^�'3�I���P����p�W����+�W����.��e-��dU!#��g�>�z����9��_���s�g�(�YGL���C]�����������$����������b�K�i`r�P�`%{o�w����RO�y�pI���|�(f�"K��r������*<��U4�U����d�����9:�����+������{~�^@Q/4wy9�O)���#������������������u�������)IF���TU�C��q+�A���2��z�d����6,j�T:�l]��kO�hx��@��]9-�
6<<�����D���
�m���/_\^fv?��*�9�Y��d~A��LA\nl2���6'�m��J��`�j����:�Z��rw��\w������r���g�����!���))�j�!��#]�j&f����-���^��Jw_@���a�	���Rr!Y//�^�z�9��6�.�c�Q������d���
�'u����
�q|���y���X�a�7+g���V7e_��/;7���W,V����K!�h�b���q>���3�
��������3e�����
y�)L�
(G�@�
4\f��~��F�s�������v�WT�&��/�1S�����<nM�1(���	w����l����:9�"�������u����nX�[�6+M:����k���<�e4�%�M�Q��l�{��r�Z���	Zn�#��l��3�P�@��U-lv�������U�r�QC��)�_�|��;�>�x[60��_y�:���E\��2�L�plr��-�[�����6�_~�v�QQ�o����[�\,���� ���he���SM���r#��f+���2�zS�@�Y��_��t�ZY��;re�T��9��O���(��^3;�����;{TUa��4����C����ykrc���;��Z�n[O�������K/�_|�N�4�9r��m��_�4W�O/�z&O%���?�ta=����iw�OU�?���"0k�����g#1s������g��I^����x#����^�����oVQ�`�P�f4-��^$g1��-/<�����F���(��9�>��>
�'v
�Z*3����%k~Q�e1���D7L��Y�'��<2�Sh������^�pT�;�������K!@V�fi�A��!��.c��J����D���nA������������y�U����K�q�mgt�-����Ms<����f����������7m~.���v1�^�z�<:r���ig����%���\�}�s�Kp9���92UH����e�W�\��pTH����oP���R�oF�ymc�]|��,�|�v�\{��8���2Iyv�j`���!o�==�I����9��g9�}������Gm�RU���!�K������
�����;
&4I���%� �2�
��K���V~���1{[����������L�e�|�m��{�]���2���h��X
���rP.�gw����-�m�T�z�w��_�������_������%�u�[�{@��$��^�V��8sv�H�|"Gy���a����9����
��=eT�!�m$�U%�#��K2�l�#�e��~��w�Yo>�bNY=`�8{UVYcv��o�y5W�'$�d�e��7����:}4��1�y����?<z�W��h��m����G&�O~�����-++[����Zi�y
x�l������0D��#�D7����\�y���Gm/^���V+�S2W�5�y�����9z}j��'������Ls<�<R��']p�)M��R�8h����k{�7�t�H�gHa��_Q�Z����RkN�m���Jo*$��0�����$�gDm�'����9�@ �n�4G�5����RFq@\��?>� ����:���o��A��_v��t�#��S>��C����0����O-^���%���eo` �e�v>}������O�l6�Z+��>5y����b��YUZ��X�Ts� ����]�����x��BQ�s�oT�x�}11JI5%r��c���Gg��kD7
����3��/��##�]{nL��������h��[k5��
��#=El��O�Of�}�h����jB'�1�O���������3��������WL���=U��z�#����y�8?U��.P�J[5�C|��AU�6J��U�n�Uqm��f��y����w0����q\3�Y85����cb{+��CCC��D�F��a�i�b-��Q�yT�U��^��W��-��
r$��nEsZ��F��s�BLP,h���y�$#	��G���US���V�<K��J2J�������Bm}?�B�������555�'I{����M��=����WR'��P���]HD�ap������X����&g9��X��Q����������
p�)aEh��upJS_#uC��aw����^T���e�G�S���,=�I@@������+K�4�Rr�>yu�9����^{��pg��#���
V��g\\RTO5�>1&��t�q��Q���E�p�$�7�(Ka�;��!��-�
K~vk����v{��k��]]�fQ�5	�J4����=�W�F^�p��e��R��x����p��Y��_k�%`4�r��C���=_��>z��[X��Q�����W_2�'Eo����~��chZOR�L�T�^�j��Qt-"SM.�v����
v����an���#�����~�����t�F�27��o���NkM�_WLLL��MR>���f�Z���8�����O��e��l1H�����;�'6�@�Ea�
�u����oV���C������|�?�����g;B>|���i����[��X�����;Z�j8�@������ �l�����&T�����`��{��3�px���W3������Za��%���w$�]�,�Lk��DY7���D��I�El�r�ZHT)&��y�D�n�I/�����zV�#t�3d��j��K�\�1W�},RK���FO����Y����T���{�M��p�+<����:���!�s|���>KS����7����0.7��l�-:l[��S><��-7��Ti�����,LmC��q�K��Q0+�l
�(%��3q���otS����%nQP��@rn��.��a�;:�����2�}/K-�ZZ�"M�[��3�S����S����=z%������,�^�\��Y��l�^N9k�1�WBak5M��
-�y�<5�D^	������oz��.m���Fg��^{������$�0r�%����O�.|M�<f'�����;�VZ2���GT�����I5��
���>����+m�@��1��7S�:������D-�k�Q������BP���E�x76�U7;1�R�s���i��{_��oS�5"��F�$����}������E��F�y��VQ��q���X�]}KM�Y/�>���;��p!Ra|��h#@��'N����S����@�yCW�Yc�<�&r
�����m��i2����37���hO>�v��U�����"�����_W���d��B8+W�|�l���1[�_�)�b�pf��e��� �0������m,	Ac��J[3�C�<v��r3A�.�s�
��1rEg:*��A/�*�b�'N/Y=��;�9���9U;�� �7��LG����i�NB���O��E��RR��3�4����]_
���!eq99��,UJ�*�P��U��.|]5��h������:A�QSB�+��x''�ug�������+y0�Q��
��Y���bb-��t*H�-5�����L1����f�L`qMD�������}���62IW�OTC���k�.=3����-��f����2
�����0�?_1�������Z$�T�[�;���N��R�W����G����HK�A�B'��h�A��g�B��u����555qZo�.��c���1�7���y�9|p�{�����f���]�xL�k�t{��S�U&���n�jWj�0N��FGh�0���y�	�
�.�n@���){0
cN�C�\�M==p�]��`����_Ak��5��E��������]���
�j��K���>@[���?_��d������;2���^�����6o�%K��	��H������ �&�x�V�4:}�IV��5�����*�666�^<e�~
� VRC��4f�m*�j����{������4f��L��5�P���p�6�,�k���D)�h�#t�jwW��#�K���e�v�u���nY^DC,J�r������X�2�,�3������on�I�jo' ����N����m������:`ap,l�����^����n��	����,9�5����T)q�]Z�k�.bw��!x]`w�ho���<>����	;9���z��:+�Zj��q��B*��O�����<qII�J��hW��I��5P7@��)�+�b���e">/4���������)*������g&h�0��`��D�����x�g!v���<1�Y���Ju����b�D���!�Y5e##5��^�~��fp�i��v
��P7�y&�9�u�1���wF���-���ZO�MT'�����-��s5#�����Y}�ov%v� XL��k5G����&�O�i��4�p�������*z9m^�i������.��c�D$�&@��:�����[��xo6�r��Xw}�u���� �J�������>�m�b����p>R��g���	6%k��������9;=��Q�p�iTktD�3+�����I%mOs���V���eBn�C,�M��i��<W��&N|���S)��D��G6n��b��2��dZ�~���N��{�F��4*�g|>T�Ac�a�������KV�����5���S���#��q8[)^�C!����WTV����[�s�}��3���z��]Z�b'd	I0o���h(9��m�0b�k��a��;#�@O��U*io��c�zr�����O�<���7�"�\�,��T{�^-�]A�5f�6����������232F{c�A'p�u�4<ZQaJ��q���S����@NX���������> ;��pVLt8u�U�����M��;��_�������h�����a�������~<�)���4��D]~�B���/����&���;������,Z����W��2����'��[�_:��6�7����Ff���g��K�)f���������\��<4��n�h�6-	��!�3��Z�$����yo������T���u��A���+���;�A;�i��]��R�$���������
Y:�q���������1�s7�����C)���h��(x$�����y����I��_-�1���dm]I�(;x��f����k���Vf�
��x	�}�w<_���C������+���p�^HD����X���B�������
��$M&D�D+��Ndvh���13�3Z���P%1
��w;Q}qa�'��I�,�
;��;��� 2�D)Y����%�-V������ !$<<1�1'�3VN�_����G�a���r`�����A=�I�)�$�mdK��h���������n�q���L�'��������C���H���.�����g�p�(��v��'P�V�4��� ��{�oS_-��}�7���^�-csk��U���))���@�����n}����@(��������;����5^��z�����LV�B��1����=C���y}*l���]�<(�
:�����m������"�\7���O\6���ZqT�J�_>5S�Mt��G��������9��{m�F�E��:���8��c�0\����<\�K���D�[��g���&~�9�������<Z����p\_;�@�S��	 �e����-��c�f�!L�@M�&�I�*���TW���EkD�,���"T��o��'h���NJ����gSk�Z5x
��)��P����V��-�.�������o�?b����P�f!�������N
{S��R�����*�����zs��fP�������j�c$�3��n�`N���Bm�����X�S�n�h����?6��\���II6�V'�C5M���(F^�wA0�����UU%��(��A	D(8E�y�%a.�����Cg���w4:�u�Au��z�ckx	K�0)��i�&��ek�=�UUh�l,I@6|��OMKf~T�,L����=@"0����+Q���Ze��� ����}_���S���
&���:|�9�B�D^B��q3����T~�v��Z/'�"��$��wq�9eILim��Jh���d�o7pe�f��O��C2���P��v4�BD��'g_��<xe���(�����}T`��&��T���@�����^��C�{��}'����$%�kA$��D��W���'�}���!�-y��m�����[��[�q/o�A�_�D�V
��*��d6@u�>�Z3W�@���T��]:k�#�
�3%���e�������Ban�X�i|����
�H�B��d�������7��������d2&7�5�C����.��s��fs��� �$-�������hE���8���io��Hb��D���;�p��XJ�+_6p�\#a�����fG��i��`���x�dEj�[Y���l�Z�e�.�0�1Xt	~@�W[�vwOz_w����������#�~w������0��	z"�b&�����^n7I�����N�
ZAQ73y��)��VO]��p�b�:�Y�f���e�ND�#����vL�S�TvMI]]��Wv������j��<�g��<��<��@e��ZZ,S�2OXc�P�!�E2��p��+��p��#n5b��o����i(I��}��a�7��lzh��'O������~�y�4�/�|��;2�:B+��J�2)���VV2/��yc�G�TN���m��(@���t��8���I���Q�on'���@�K���~�x��=�[D��(
�/�j@�������:�\������
X�����D�Z6�{>�%��O�ML���1��'f��
����* �����
%��T<����PI!T*
`SbN�[yu��f�q�3D9A�Hf�t�1�T@-��%��t��\�i��5>���\�rXiuu����&H���*�B�V%��Ry]��MY�?c���eS�G50m#C���Go�����%����eg�J
����h�~�x��R�~���bT�nNt�tQ�����G��kcK\���8���%����>�
�P
�� ��E	��
y���f�H��la��S����|�-[�������.\5DN����:
��jHfC��I���74������@���hY]i%yHsF"��ZL����h���I4Us��e�����������|+=���v��T��<���(����/`u�\��/������j��
z�8��&w%�MZ�S�r������B�h���U�un�-�����^�o�iq�(�7J������[��&@���3vT��0�;�^��pc�� �,��}
T�
���o�S=S������Oy�3�����@�F�SGT ~���c��L+x�u��-�y�lO������Km4.��&�2qq�sG�[���^"L��"�����ON��[=�'��E(�����Dy���^[&lz����������J����X�`��v�����C�k��QY�����w�I���Km��O�W�P��,��$k��=�����`����`�,�V`���[��UB���k;w�M�������]T�!�H-h���_��Mh��,�O<��Y�1 =
/�1�w"`����.����6o����������J
xmAW���*i�ifA�9����!!?�Ys�$z���`8PyCw���)s�)11q����!
!�}zL����@�r��JW}�
ht-(	�A���sgL�k����I�������%:�*f�Hs�*�L�����,��� ��g��dt��q.�`B���gi#�4�=�Q��'�����T���K���)�O������I�8�M���
%X�#�_-�,�D3�D������r��#������D��kb���U�R����}��s�s
?�����0<$d�A@��3�����@�<J'X)z����������F jA���$��7oo�s,�r-�4B�`��n���*��%���T�`�\%�M��
����������W^��|��F�<BN�Oe�*�������t
�#�Q�^}�E�<�*��m��`_sl��1��VE�����:pTHZ�R��}�Sxm�\�Y����)���X����AmS���+zt��}�z�'���o���������x'_;�~�`4Gk��d�l�E`Zn�J��bK���]�����D��A1��W�|e��K�##�O�
����@��2PC������}�(���Yb�rH3<��N/)���% ��]X{��vw}���=�)�V���T��5V�����w#*�w���l���${���|��-���bIn�������\[����[����m#ST�!l��i�zI�oV�[bo��=�L��G���AI���������X%�A�0%'�4I>�M8 �g��������U
�4@O@�Qmz�f��=)_�����6~���V4
r�jvk�
3���@��H��Z�(�]9����6IY>O4H���2��L�=iKf�2��gOH�G���'D@
4�AsGW��+��
&z�����LO����A��R�H�4�!��pv����Q�Z&0L#8�� ����'�Q���4:DVv������8�K�$���%��eQ��g�T��yk�_��0Gb_|,��H�}c��O��Zs����C��f"�1��>3������@�'d	j����B�h��q�2��v9�@)����������\/�\����hIV�X�?�V5~�Vvf�}EE}�G[����1>�����~���~|���]�3�r�/��)I�M����&<s���F@����WC����c���%g\[�����HI���|��??��������v�<&Iof�S�~�J��j�UO}Y��IJ�@J���iN�����O_!O�5C�L��W��l;t�E�D�S�\=��As�`�������`�1C��n����F[c������[�g��;c���{6��bP��&\�p�Z��J��ZK1�N����r��b��>��U =Lf3��[sF����C����$y�	����:(��Q��p���wy�l��z�E���R�6�'������@�����`)@%��f'*���}���m��2���s��Sg�Q�\���#��3d��U��������cK��ebL���Z��E�?.]��^b4p1	*u����o��AY(�������W�3I^��uY�rQq��t�������|8�:V(�n���iLI����}y��������Z$���O��^��n�I���Fw�y�;[�{
���r��(:
���6%���g��5�M|�45Q���Xs�<��S���C@\�����e7��4��W�E�'���'��������H]�����i������:��@?1��0e��z(?���w���#������Q�sZ\��h��N��#AS>��Re�O����#�������(���+i9���=���{:�����*U��=����F�ds���w����u+`�����'�ks��5j��;��k�Wa����U<��>�!P����Tg���~���G����C����!���i���E�#[5����D��u���]���S� ��%kmq�ct�|�jn���tK!�:Zu�����U��Oy�vz�:��]ey���s����A�
3�~|���yR�3����CJ��$b��i[�1�,��R$!����{>���A��0t$-��<\��+�v��=T�;������L7�B����F�t�g�9VPl�J5�^"��`"�?x]��wjA]4���i���objXb��]��5'�Cs?.������{{w^|�����
K5L�`$��+5��j�.�L�RI�����N����q�N���UN�'8�@_�-���x����F�=�:b��>�\��P�W.��"*���qm-���@
��UJsj%R8�6 ]����M���q����aIG�����^��S��L�<1�ph#�)i�/���a��\(,�7�v���Ey��|�j�2S:�Fc�Yj�gO�	��/Ws"xh��`6��h�E����L�T	����������
�����9�g4(���������M�"	;�������&Go������q�PU&��]�"$��K{?�d&�4�2�Q�k@a���PM���Bm�u���� ������J�5s���/�-����1���@�I~��AycD}��'4:�zexW��x�����o�P-�K8qP&�EEG��3m�(SYV�{�	�X����'W.���lJ��G)���P!.��lj���At�Z2�s���� J��$�D ��<�����%�#��E���nw�����p(*�X:������D`'�P�z�c�H��rU��U����T����c�>w���hq>Y�<;����C�
�vdM�,�Wh3���=~�
!�|����@]����BD�t���p�9N�1��b�)�Q=fWsAig�3;��������>���x$�]�#X9}!��WF�i��zg���c�	P8���'��[n�U]�+F��f���,/�k�����2mX05���A�%$��+Q����Qt.s���8�`q'�dav��`g�������"��{�%�;��>�e1N�X����[r��$&�Q�'�hh&��-���>y_\s����-�����+����b�}���m��rQ#LI��C��#AuY��o�E�����<��h����l"
m{
HD^B�`����F&A���'�Y�9���A���.�����W���
[����y6���9*
u\���d�4+�hN���e�R,���@�|A��p�=���+�J!5�+��J�z;�U�7p@�����z	��n�	��'�_3|����K�'����J�D��Ha�Y�����_����}f;@���=,�54�����^������/R@�	�S3�K���D&!�x�:O%jJ�Nk�h�T�>�h�14������bh�J�Z�|n�
��edf��n����r2��#��e�����������@�M�)	Ev3����O�tP��Z�RMz�����C�T����q����&����4�fO�=�O�#h9Ct��0��>���F��BLX����T\4��������MM7���t����y�������m��I�^%{z��i��4�n�G6�XJ����\:��R�,dj�����}�����*�5c�5I�J����cP��{f�������n����*�.��Ii_x���`ea����T���,�B���6��iS?4B������GQ�>T"B�������4*�{�2T�4�~�(�3��������)�B���l'�CI)�~��
�@���#�1T���E(8Y��y{���1c�����V]����I"�*�0�6�	�$�!���%����L\�v�^Y�t�Q@����\_l�9x��:9d���%K���TGMR�����B-
��B5,���#���[~izr�\�����"�g��T�.\��������eb*���X����M&\
����������FMPAPQ1$-TZZr�HJH7����(�4�H� ! 
�����3����:���q���yx`�9s�{���i
2�kh��+O��`u�pM�������$��tuE&�������3�VTL�1F�Hj[�{f�!:��P���������L�hH�V1��.W7������#t3=nNR��v����\��/���?L���MZ�r�<��VH�����Z
�;��L��7�h��o"�����@���7��D�7���$�)���u���"={�?���y�\1'$pe�E��p��9j�$i������P@�#Ybn]�� ��������b����?L���A�"��us
-jO+=��3��q��Y��}���L�&;�����@�2Ys h��r�&� �)��D�_�6z6��Ay�)��?P�dj���15�`|���|��aUG11��
#��g����#RLM��nIm�X�p���&]��;d	������h�]<��R����M�A;�?CK$tt������(�p�*��MZ�,O�p�5�Xz�����Y!��b�_����7�N������	y1�mi�J)�yS��MjV���[���>��e�9f��Q�"��3��;2���<R&z��r�	o;����:XD��O�^3]:�O�=,_������ �E���J�z��+_�B�QG�����H��b��	,�Vm��,'��[=�~�qo�����\iH����HL�zIl���q!]�(�0RYZd���^[7U���.�	��^�
�P��,��	�A�������x��uu�>i�X�k��W����U�@������������95�	B����B�Mf���
Z�2@����t���x�,����JZS��2���5�6}�
�������D�h��Z{�r��\s��5����,��1/��\�9�i`#o\�1�\�������v/�.���?����^?2f�j���_BI�^}��N��
����?VN����")Xuds�>��|!�j�����Xgy���T���?|
��Z�,b7��Wl'����jU��D����`�W>��Qo�>����pr����3,���`������k����7��)N�����������I��Z�&�h���]����w�U��l��R���$���4���M���sFZ	�t#fO�m.9�FG	ye���M�P4�)`O��4.����
v���AF����&B�5�AP�W����,@�����hY�"�<d���hV���R1�.\���N���k!�EB���7L��,b�p����	�R�,��*����o������1Y�3X�������m�xrG�������xP`1>�S7���D����s�XS�����sV �#��F���-�[1��e��e���G��	@d����&�Ty���fL��h�'��������B�D��j�~����t^SC��#��Zc����2M�`n�rT�u��Y]S$/�W�V�4��j^�P����q���rJ\�S��GD�&=���d7��@�-�U���P�*xe���N�����m(�24��m�}q-7|���iq��+�x,V������*R��)O�b�������jM�3-�5k��/�V�U3M���HIGV��A{���:NY{�=�2�0Q���)'�c�������$,�~���~�z��r6SMV�4��-�������RD.��1�;�kH�~���M'
���������c��C�v��I��e�x-����^�3��m{�jh{�b��f���]��^^���R�/���-����iQL��%�F�;�Zo��c�G��@:z������]������@������SA|���Bu����
@dc���U�E�l;�U�
W�/��]1�������=�c��Q����)�?�
96f���.y	���1�"�N/��?4�U�$����_D�0���i�E�w�����Lv��!T;�>Iu\�m�SiZZ��$�,����o���`�k"�Y�/�wZ��r��H�<�1_6�M���6p�,��gi�O:�pQA�p�X7�k��2v1q���+���{�����n�0��<��..^�I�o�8pD*y2�!��JY��G�]5�Q��5w���h����'	9�r*�������}�
�j��Csnv��@��%�j�W�����M������������0Z���ZV�T�S��M[�j���Wt(�)~vv�!���]���������@�^vvvs�������y�um�@�&����u��?��"?u��sX���J��.�"j�x\v��jFb{~_�i�_Yrd���h�G���w��JMMm����Q=�������_����D,��FI��>�t�{Q=�����6`��(��+�����&o���BJ
|����F���"�� s�������nu��;��#$�����Y���_x��2�i��;#�GU����b����_P~~�K!
���6���C���+��)�7��1�b2��J���Q�d��P���Q+�L�o�U��T"�v���������Y� �����M���R�Y�%��v���2��� ����[_���w�~7��7�*	����}M���[��7����+Jp���
`��?dY���m��Z,�u;sln>�{3�3'�-{+Y`�����_����a����*������*J6R�IFVv�-D<�B;~6��,�{���^t�r/&r�F"�����^�v<�t���f ������+��$�����;�����]�����m���+�9Q%H4�^�����S���R�/']u�w�a�UU�~^6'�xG��a6<2r���5&�t���2BE�H�me�98�d��Z�s5�U�e������x������U[]}���L����P1������b�A�7~I`���L�@�)�����R?{��G��G9nb�)��>����nqs+�4�.pF���RU�B�U�L�E9,��3�
�mO����%�g%&��i������������Of/|+�Z�����-Ix�M�r��Tn\���5E��I	�������8�<�3(W��#w�j�l��6$�p��w<��r��G�PuWl��Qs�
�#>�����=�p������GuZ�]yj�$�eLL�x���`_��h�@5�k�+�@`>� +%���~���m ���4�k1��������~��.���5;�k��s�(1S�� �Cn���I���fU�`a$�G��YWp�^z�N��w���xK�"7��)����rX5W��)�j�\������l��OwG�w���6�L�L�=%� /�O��X��3�j�T�Oy��*6�4��Yi�U<T�S�[(�/ ��v��/|+{�&.���]y���X��2�XDl|�(HF&��z�u&+%0��0Lg���}VO�z���%*�������5�0��-��b�D�U�=jG������O����),�l��z�Q����2u���U�������������s�I^�o���a����s�4P��B��A��n�oXW��v��=��yW�=-~�v����
Su	�1�t[���
�}^W}#.W��e�����wb�*0
�������0�m��1�FG\�R��-��~(&��s
{7���H�d�{z�He w����V�Zz�!&<����a���
aj���7��H�������p|E��\�F����\O"@!�D}�0��?�%;��<D�+~���u'�����9xH~�-kd���t\\\1�!���?�9\��r��su�u�^�u������@���B��

��)t	�K�omh���;-��6$��K!��$r��_�+�[]�����h�sey��S�/�X��s���uW�J�����
V�N�������QW\����2�4TH��}��������g9��
�o\3�#��D���T�b��B0c�b�:�Tb���v�
�z���{]m��{3��(>��[��l
�=����{~������`=O,4?�|��z����p-��2F�\T��w[��S�>*F��� ������-�V�M{"���f��d���>�I��1��,���r�N��R������L���Zh�\�:v�Z��n%9�0S�O)%,w�Yd�������e^\�Y�k�e
K��j@��P�a����Vz!�x
e�\U���]����z�����_��(���5a4�������6���
�3���C����$�������>k����>K
��^V��l��|.�4ix#%�uZ���Ic}��H7����������mA'ifUh�8;��Y>���x��8����9���O����<���[�S^1�����'�@��-��'���o��I��a�U�
lI^II	����B��d���S��������Y��
���VgM����;�~ f�������k1�r���3�=#"6��0y;\��"��c�e�? "
bSJ�C����������|b5���/x:@2>�����������[����=���ak���b1V>��tv�@�a�wg�������B9�@)��2����Dc��nK�l9k#���H]x�6���Rbh.i?eL��Y�H]dX��`.Y�/;)x���mq�Oq�C�m���PU-���p�X�����j*�C�l�[�K�Q��dlQO]%��\����@7���&�^�s����P��B���9u��O��xR#rr��5��=L��Ub��/j�����
P8��l+�+*���������c�8��j��<�����O~>�>��m���1N�>b�~s�;`���D���dY��.4�������K��p�~3hi7>�;�i�$?�X�%cI(ND�y2�J������MB���O����
b'i����������5�e�xp.l<���D��d�:b�Y6���y��8���5jH 9,���6��NfO������6��b7����(j��s��%.�GT'8,xoM[Lao4D��*i��`+�DI�{��9KKJ~��d�}bJ<���'/���j �hj|2;�p%��?��#s �%�zj����k]��!��t���Cc_�eSVa(6�!���F�x���7��t���t8��I�A�:�i#��q�����@�l��m�
#m�		T��f�swF�o{x��bp���A0��#E��`>�M�'.N0�������4P�9d����nQt��KGK��H�}�l���:?";y{8!o�e�1�qud_}������p`L�5�p�]ck+s�{v�������z�h�d��&l��{�tXR���quP4�(�M�����;�sglvbb"��X�Qv)�Q�Fc��������F�0����
[��D��F �_�����*�.V�y��(�t�����kk��d��D�]�Z�{�R*g1��j�EJ"���\��J�����08�e�KN�vK��L�w���S. }�e"��_T��#����)�\���z 4]�[�Y��y�1��i�vg��[�~?�3`��s��� ��N�1�.\q�C��x}����j����4����g������F6��\	����Pu�w����@>Sxf�_��J@��4d��=�o"u��8�W�,;���a��#@z.K�4i�����[�Q���'X��h4E�������X �{c3m���������VV���W[��6��{�_�7#�CP�d>4�%@���8<�?��~�n\�����8��������M��H������`Z�;=n*��%k�����e+��/K[tB�h��VN�o�G�Bp���n<)�rq:o���T����������Q��y6rMS���U2�������C�b�l<&��i"��d�M+����'��	{Po����'�>Kp^Fn���������5������P���<��� 2�zPh�p��1PMw�|�\�+�������pX��z��9�$�4��<G��_l���!6���yl�Y_l�Sd[r��U���d���A#�v�����~�Bg6[Rt���d
vR%�i�������������<;;k����S��Uz�2>�����<3�/��R�����xy{�c�-V;P	u����|)��U�ge4�#B�����% ��K�����oF�_(���9l

�-Pz��a{G�����u�~ .�3��L_�Q�E�|�+�����7`� }w��NJr�!�t� ��P>|���s\\����k�/�~���s,L
�U�1*aJ~�d�Ec�7������K���1FX(�9��������v�%xY����T���7�Z�����E�o�U8�����y��rxN����<]��t��d�Wx���z���d#����(�H����-)��V����V��F���x�!��������(`�Y�
AU����.���NqA���`���c��b�:m�T�\m�|>q���������*���h��\n,zCu��6H��h,�n���4_V�]�'d��D���a�Yz�u_=�r�9s�;��1��W��k�����3o�Cz8��]%VG%���k�C��u>���mY���f/}��R1
O�z��B�F/��N�rp���R~���#Y����r
�lT�}�FK�{��Y��������!!�qQ�e
[u����)��g�T���	�!
#*��x��������R ���*4%%���bj=���.�8�v�AVj�����I�5��?����������s!�y�D��8�_�� ���r=�J����O�M
��QF����p��*Zn#U����I�a*�����#�q�l�-�xx�0�� �`[�>�\������l~<�z�q�Ol�D9����������q�=�����!�X����+�V�GF������<�"�gK�5k����D�z<Ne�hW�s���D��uw�J!�m?�����m���U����hO�����v�(����tW�C��8N�|��\X��J���^ou���-W[Z��4�J3F�����Z�]����M���(6Sn���h������v�5V����M��&F �����w\>=�)�:|�<��>��k���1���w��I��U�.�f���(�:��8 �T�U����a�;��e���������:XrKF��:x��6VV�|2L��V����4�q*���K��Y�����������X�����6���a�>d���"��z��o�����oW
��T�eo�k&�_���b�o��.���������,N�U���KNNf�|��j��dJQj�lu��$��p�-��O3C:,�Hjww�L;D��
�B�����������<�������2�������Y�	3qq�;���������4�A�[�!��#U}�:G����Wj�!��v;O�������]�s�����Oz�-
(����>x��{����V��"=5U�������w���3���
�������Y�%{��zi'��d(6�����/nq�^���:���lGy� �pK�Zb�Le^n�TU��W��k'u�s7�J�f�@�GDH*d����x�tJKKK�u�#;���|�h/��+V�#&��v���'(��r5��Fr��7�mh�#���:d�R��b,3�R�M���#$�b���oH��6c�N�z�g���Z�S�K����y��(��F�zb���.���0��.{��uK�)�Lp�tNu�{������v�d4n�J�2��1�L?u9o,)����pqq�-(@���2y������2pe�'�=:>��p����u����i����R!��?C r���Nx�`rm������T�r���-�c�0�9d��|�V��:s)i*��@\��<��cm2�x���4�Z�q��9��3y�WW�c��2���K�|��S��^&3;s���LB5M�(V����C�ej�XC���*^1���Z%� yC�m�c�u���d����%��I�$�q(��d��0���1z���|�{Q0��G,ll
""o���p�B�!F���No����3�+��S���/���q��[K��B�6��[]�����W���5���#����B&"5�#��-�b�E�^f��2KV�@��T����^8���n('����O�����D�������[>���EE�N5�/~��o]���J�I��?
���Z+6"o�q!����S���)�-�� �K��ly���X��L�Vc>�X��x��Ja��z�&RP	r�[9@`�[slR�r�y���(�_��+z�*(�Q�GS(��W@���Im��,�� �b?���h�"��9��kC������K222��a��vi2�C�Dn���M9m�@T/�:�1a�������p��	�����~��/5��������#/����y��2��{��$W�M?�\�r�BA�e� ��r�����\�YW���x8�8��7�nJDX3��[��l[f|x����U/�g����� ��m	�~����y�Q:�����0���q[������g����������55:>�����c#����K�T��";|��(���-6����Y$���UQ��z��!�s�������g4�S�N�� ��� �����S������g$�/c�� ,x����H-r	���,c�����c��1`���K��J����k���Ch�0���yR���@�$�p��L��7S.=�G���F��shq�X��L$
N	1��d�^�������{��7�����3��}�Ux����Q��V��S����>-���F���g_p6m�*H�-�����[��j����()v�Of�ah,]�Z��������������,�f�WV��Ah����&�������m����-�,������X��I�=�O��Mb.��W�`�p=����Yz��?._�J�+���E���	Y
K����[�v}��25��lo�f��*�<Wn8�Y) ���#������a������}77��3�5��P�re;����@A���^o�z�:����g�G�.$<�T������+��[�������'A�
��SU�T����s�/����-M�xm'FL���a������Mq�c���8lQ/�L����'���a`�K��������.YxD��>I�|����E`4
):R�k������8/_��B%kS����}�����e�q���wt�Z%��J���+���8��>���\7�������Z��u��{P	7;a������W�0����6����HJ~����=�~�=��+����}�w&n�����#����W��]K5�A���Q�6�����hn++)��q�:V���;�is	H������l�xZ.p��9�?�Dj=���������(��R3�c�Y�Q���,��V��]h�6%�@���m�(�C
.����x�p%��u���o�8�b#��r Zb�))��N)����l�|}ix��nOb�[��d-7SSS��8����k�<�zrd��y��i0�H\��OK��Kw�X���T�JZo/�a��r�F������p�Y����J��:�6pW���i#�x>D�U���C��U�����_��W@�eP|�d����F�R\�5�$�R��v�&B�c����&�)����V4&"��k5�=X�Na5C���������x�_�I@@���?�[ce?������N
W���,���(H�\���~��6��sp��{Z��K���&�w�^0�o���{�������>�~e=�P�wv+z���M���,��@�,j�r\*����	�SBfyB47H�q������ai�M��O�<�L�c�3):�i T7p�
;�����]�l3���gh���u���p�]��������1b[��;�W}�Q+N5S{-�tEV������$�6
�������M����u�KN�,�����
���n��nbb�I���{^�&�a�1���+:U'�tt�:H*+�B'�jE���?��E^��cX`�8d����r���8����g>���c�����e�^����A��%���U�^����z	�pUM��oV�q�{0�aJqy2y�8��}�8��t:B���I�U�B��YU-f��}�e)H���*H���aGs�;��p��}e�/�1���{EYYm��"7��_�O����U��$#���bpp����/�:��m��	� ^��Owc=F��K�����_7��t[�M7�{v���Dq}D���k5�����nK��?�0���l���0������
j#��ow)q��^�F�Y�>�Y_�������	CLR���}���1XBW��-����:TL���?=��������6���h�[�����V�=�0��T 
n������������T����}�~��~��|6�����������?U=g7���9d�g5����x6���-o���Q������z\|��J/c?�*�n�*\��H� ���r�!�PN�o��=��]����St���e>�fw7d����yN��Q�����S[oW��6`K�vwO�>��~0�!:���ROd��8�?VX,J�tP8v���B�o��A#�����G�S�����A�g!l�
�j(��
_��I=w5�@<�+���D$}4B����c�7��^;O��W�=n�qSt���i�����!����	�
K��d�\��9��co�Iuy�i�tR#����5���c4Li}7�f~��i# | ���0���z���C�lN�\Pxr�����'�_,�����w�����_x����n8�fn6����R����o�m',�5���)�!|OMM}�K����	>��Y��P�PSS�&��J�����������;I�!6�H�bNp�%���<���������������nl���t��&����������x�\F��
�blo*��.��+R���tA%M��������[��>� ����]��	�w���D��z�n��d[�������P:�qu$4�����=^vO�X�U� �������a��?Ua2v��$buuu����`����,0x,m(���NF�"�r�c=�o�h��2(J��K���)��sXTX���5�\��^.�{��ckt�P�����������E+��#�V��|X5��Uq4���b���z�����o����L�s!�m%^h�W�u����zq��R�����qu,a����u�*imCnQ�j�Y���������9%�{�����;���?-)�C$�L��7�m�m���!N|����i,�SRF[[[�8,��d%��%���@l���_���%�B�4������_5xm�t��V���n�������:����40O^Y!`�*����;����J�7&i�Ev�RS�Bv��)|V����G���k���X�9�����SF?S0M�+�M<�<�)lc�8,�e��b��V�����j�>�(���
�����^\_��s��������2�7.7U���W�M�n��'���?�P��s�.��u$*&J���3���
�?o����l�]��>DL�!���>8�p��p��4T����:Z����'�0����H��[	zM4��'�;���CAV[��Mb�h(�.^�1&$�p���:���8��������{~d����p�i������P$��h����T���\"(I�?�=7����s��!����V�����@h�,2Jlg2/?y���.��j�
,�nR���������X��rm��������y�o��������|m���JO����]�~���YLt���$G(�Z$�8qN�`]~5g+��yw_CC���_d��x&���*6b��B����� ��_�iL�����	\�*`��������c��; �6�i��q^l�k+1�CQG.*������H��>lj,��SI�j	�^#!?���PQ��������u�z����J�%^��3�;�QQO6K{6z���=�01I�`�DpR��K���QL�����CC�D���-Z��L�5
����[�T��d�"��J��'�f/���
��i��L���F#�n�h�!���T����7�v|�/��@x)�J��
��s���]�8?V-V!��L���A�������BcyY�����?T��ZeuM�NivNNY���u��`��.s��#���V	�h�wHa�����g�4�����s
TY�94y"
���qd
u�]
�~E�!*QHJBbkW,J���f��C��`��S��nc��Ec�
,#�T���G�W�0zo:��M}���X�l�N���8b�E]��=n������������a3��xc�Y�������$F���j�$�n�vK���g\���a�t�S�O
�5a�-��Q���t��������DLF���}4K�")U�����3��b�/�B
�.��w\��]�A~=6�Wu����-�ZYY�5�?��W�<#�Emq"�a��.�4�g�~h�"�AU��F���=�n/U��X�-yw��r���M��{���WY|������T6����h��or6V��h�	��z?�p
��,�}���SW7��a#i�r�x��ni�C��� ���&��1d��K��:�����tW�_����s���y+�������:w������W�^��r&��E�Q �{����*�Y ���B��pv= +%hd�/"z�Lql�q�*�I��5$�,N��i��'�L�	y�����A?L�
USVN������Z}/�{8p�2�� ����+���C�bM�����M��[�@8 "����^#�cc�:�{���?GH��]��%�q��?��I������'��	���j�k;N��'d5.B�k���-(Z&�77���p�*&�k<��%R�..d��X���#vIk��o�?��+��X��,p������-�cU����j�0B�E~�����N��V7':�V$rOO�:����_td����x���;�K��U�{W��Dk7�Tb��I��y�X�)������w���b���D�����/{���+��c;��8�����_L��]5���K���%��&�m^�=�.��o����������h}uA!W�m�m�E��*�s,)A�"V	'N����K�����Sw����	�/���k���p����~{XzGZ]}�����Z?*�������+K�����BX����'O���o_2O��$)H�&���S�$w�Lv���zE~����~��?���))�%���yD���g�cS~��L#g��osyc��r@�~�S
�����i�n�g�.-.���������
3~��;wv���$�d3�/���}��)��K����c��^�
�p_�����-�/���G&�r�/�4�T}Mim��H%�c;e:ejjz���'O��y���u�=h�]R�����w�ZM���U����l�^0GW�j���M�t�S���?�u�i�1����^j�]g��?�FaP�9IFV��sJ��45MVf�v��}��M��e���^�,�L)�c�_� =���;G�#9s�:�w��ht�(�5 .�����r��^�3s_M�-?>+�����]CxL
Y�����n��{���<��>]�v����������_��#����,xx����6F���E�� �d��������� %}�%}��ca���I�3��jjk>��H���=iT���o_��]7P��p��"����/_N�������5?w�����\p�=?��,_c��u� h�c[��j��y�/lh���]������63h\XV�wen���=?����d����s���p�����w����-[�h,s������]4�ju�%o���=�1z������yHH�~��mr�2���^�t��n[��3H(g77����D�.A���7lK�-T�+�r�)oo8z��&O���T.?��R���b�=3�rF2�
�(S�UJz���2�������G�o�S�<G_��+���X�)����i�	����SwZ[�hM�s��~���q���C���1���$;�4]����`�� q���� �����U�%�V�e*3������9I+M����
���>2�U)�Op����f�4i�0J� R+Nr�my�"���..������^5�����p�CF�����mo�^���b��o�V����E�U$���:�|5��--�~����n�f[�f[��`������i3D�u�p���;v8|�k����w���6_��!��Z�(N��! u����X�(��cgg���~|��m�C>�/����V��7\�Q?o��l��'����W��l���As�i�wQo�����S��Yh"��5|W�kJP��i�2�d�9�N�x����������{�S�]r�~��D�FM*������6�m�������7J��S���U��F%1��2Of�I102�O4�����>���\�N���M��Z9����[�(:Rq��2��KJZ�]�����r�)���/�)f`p�5��-��8��A:����E~_RR@�]]����=�����1���i�������{��tcm�<A�n�_�����E��+|,z����_�\�<)`�k��X\�S����������[���a��,������_;���F�0�����\W����b%�m�CGi�� M���-�(��7���r}��_B��>�{pN������XB�'3��f'	��Kz���{()]l
^�6Y��s���IK�������W����E}���X�gM�tuu��4�s<�����\�WG/��]t&cW����0���@����1A=���n�i��gw[ZZ6'i�v:m��O����(���#��#�������������{���]f�������Wr�]PrO��yG�%o?������+�������S���sn�C;�X���wB�I66��Ft �5��KS�@�B/�p��������>�.=.�����tMMM��CE�jJV6t�3�c�y���H�ss�T��&;8�/vd��DI�z����oZ=�T^�G-[���mIfTHP�Y�������� �j���Wp�?�w��T�|'�)�CXL����{�
�"���}�
�������;-������a�LY��eee�]=��2�U��C(��{��7�Y��b)���t]=w�#��,�����3���ol�?)��W1��D���(�8/�4�J
]��Z.��xY�L���<S>�� �:)�R>���L)}m��[����%���p����h��}���u7�����oy_S���Cs�e�\��c�?�Y���q��Y�$���������������W�W
��:!�|pN����7o^�,!��I���X��
�c����mrm�����9<�_��e��|�vu^;�X�F�f�����[���t2�������'&���`�9
D����q	���Ww�^n{���S�c�|	h���C����������F�d���y����1k[�G�_���D���d�*)�f���[JJ
��b�|����M�>s����z��n���e��-Nv<���D����!oi�,�1/��n��6�"���:���+��u�j|�9�*|��Ce��}��9����
F)V�#v� ����X��~�L>S�L��[E����6�����k��)�;�����+f*\!����m��w��eei��S��^�-���k�r.��K�����-���6�)�\)�|	rc�����[[�r��|�s��]�~!��#2��N��������%��s��fE<4�A��h�2��u�0�������]��1���������?�����Q��efdz���)� r3��K
�6�q����������[J*s	�9uO���-���^�^����V�L������z�cKU@�������b7��K6/VE���p� ���y�r��<�&����X��~���pDY��C���C(ED��5�'L�G�����~R��&�J����7,��Kn��Olk#	.��[�
���U��������kX�.cd���b:�����p�iff����k$E�?��f�����R���=H��_�u�[�d_����w~vv���o�	(x?\���5��?32Yc�>~<p�c`���vZ��S���wa���9�r�;��g�qG��R��M��)
d�X�=Qm���JJp���Q	����������d1I_%�x���@�O�#7����J��F/\�
z�]���J�Y��9���T�R"01��Q 4�~������WK��o��������\ R��?��W^�t�Lq���]V4�K������w#�����U&&&���KihH����+�(�~8\����R9WX����5�p ���L`!p�H�y����
8m�����b�z�����I?� ���+a����	A�����{�������r�Yc�|m�
���L_�Zv/XObz:>d�������������Oz$�����p;,A����P;*��<�b��6���1PO?��@A?��Hi���$;r�YP�����]�@��B�@����:]-���@h�M���^�M��;�G���1��
����+�~�4^�L �>q��y��Y���GYi2���6�@�hev�)�����o�����F����)�g����g�P�mQ���x\�(�UIV���Pw�������y�c�y1����;�e��B�Kerz���B
F�.$����o�������X�H(NT�|8|���fA��a�0���H��Dx\$�h�	�,
�r����
�.
��G��y�d����\>��@������&��EEE����8�'��6��	���-?-r(F1�(Iv���K��T����'()�O�������=��yR1A��y���#.Z8���6=W-�*TAg1�������7�
Q�l��*��2��&�g�Y��"������:��t�+;���P7\��{�m��J�3������.�jf$/bQN=,����]���}mN�SE��� ��m8sL��
�D�]��6D���9{��Aj���UJ?�.F�:�W��^����D�8�b|�x�G��y��y�]��7�
�
�������K
��z	�������L�<6��/p�G������o"��dr�M����w����t���[���;���~oW�UB�n�S��cXk)�x;]�yf�\����4�A��|'��������G	,�9IT����o��1�g
��D<�'�Hx��{p]]�[��k�����T>�q/��m���,��g��j���D�_��}#��0HA�8'�s�������Og�k�T��}Y��"���'�}��|�p��
C��.Z�V�Y��y���	.]�H�.k"�6gG�f���_C��%W�:/K�&�
�\��A�E�<O?)��u����������6�,m��l|c�C)�{v-{�N����}o�p>N+�pz.���k�2M������������53S���j�b����T[��]'P�i6t����Z�����@�I�������=zE��	�g{��N-��<��a��c���X�X�-ve'p�R�R��T6��@�q�&��8N%=�Q��������L����q�NG�����%�VL>��i�'��=�{2�p|�=s���4��F�G�����N{�@�?���!-P�������B�B��T�>~��]��5(�w�����C�"I������KH�R"�l��_���M&j�����g
S�!��p��4�����c���w�U�9{A�S�|������{������_�������Yud����,Kr>����ql
��8}z;�?sH;*�����eD�:���&���1B��*�Y����o
@)������j/��r����{�z��krl��4w��^
L*P�U��`�j�u���GO�����5G�o~�>��*,,������H���^3�FbA�8B��MB�S�~J�R��.qq���y�v@�c�A:���9�����lU�b�Iy�Nvs(�)Q����kf$@� ����(�S�U��&�PEkS����<>O�	r���9 ��sG���������o�2R��
�U3l���������x���3����;�Q�<��mM=���a���[���K�8��Q����Z_=D�^~�z��eUU�eP/0�"!.��b�uz~^����a�#���|��3�@u/0[F�Kw�LS��������KSz{{��6y<����jS�ZFi"uzi�x�����+%}��&� T�w���aB)d���bB��{��%�c��-o~�vf�~��<��jU�lf���ua" ���+dr����?ibk��S�h7-z}�"U�TNI�&:.?����?~;��pU~� ����W��J�r�Z���F?�m�CN�)��G�5���)��M�s��y��|.�����InB���D{fJ���x%���T���B�g!�[�!��-�@'��c�L�@�!.�7��P/��?�B�A���o5!M��x��������$�I^���>k(������6�=�^
��k��e�v�Ez����W�;U��h�z-�5�$D_Ld������� r\�o�����|�g�AQ_6��?�:s�$>|>���� �������?����:x%������-��}n��[��_��$�B��������(���>������!'����<#���������{��c�fG\�YY��U��=F��~�����~�� J�o>�/������C��n�p"2�!�O2�� X��dW���)
�xP@��p�7��e�g
.��:l�s��p����?t�u@�]�>�iP)Q	�	PAZI�MK��tH(*"nB:��I)���7K����|�9�����}�5s�u���e=x!�t�^Mu��$�\+�Mq���������������W��M�������F<�
g
I��v��*U�)nV��?�(��z�7G/������m�^����?�OV��Q�s/�����9g��455mo�P��Y�������$�-��NWF%���Z;� ��S���6��[��^��_��$dccC9i���h��w��O��,N��,�a!�+a]��a�����m/ov�����u�{;v,8x���(����w��l"z�m����&����X���.����{�.S�p�o����|��^��+r���e�{���WUTN������I��v�x��i�Z�Y���c��D3����L��s)~����B�jv������QqRP��K#�`��aMAb�����G�D;<����h��c�<V'�%���<66f�������+RRh�Q~��f���k�+�:���."���3��/4a�������qV1Y����	�&�R�w�P8y0���U@HAAA+���������m���������$�^kqR]��;��8��(�����)FIeSI�U��y�����r���i�7�d���)Z����{+r�����K����n%A:�{���G�_����ho_Sh�����y�6W�T%�8tKx������N[�f���0��~-x�����
��Jx�J?�K�B�A�"���y�w��M��S1Q�\������l�NNj�D� ]���x�aW���Q>>>�>&&,`��8��T�������@��=:R�N�"�?�������7
)0@|�:&
�Y
h�
0��1��������~f  |u(�<I��b���+��� *�q���hN�4`
�����"��@��w�h
	4�H��a�;��`Q��V�S����#`gm}�e�1�n�/��8���,����QO#n�������N`v����Io�F���I��|t��;���%1��L0��[Ab#��U[�f*�;����kl������={�V��$��liDq�xRG��x.����o�Q'���o%�_ReH�F;e�h��(@L��r�zPM�ZI#U�0D}��7��cW��z3�s���z/���L����^��HIY�D��_<���4����dW#Yz8a�Qq������{���;3)u]]�Mq��+�(��`�����\����h,1b��fE���
����p9�������X&��������~��$R��)�@9���T��������Eq�L���tS�P�m�We2�EtP�{U�o�T?}�\;444��,d��;��t��+����[Q�k��k�7�nHK�������_��RC���
�%������*L
���Ypc&0��"
�	FQ�S�My�t��A�1qr��9/��5��� ����p�������"��3�|,g �����
D;�G��g�!v-
J#���\b��N�i��\==����g���)��H��L.�j�stt�3O��e�L�#���2��^U$�\#[{�����y|����f�s��!/��D���T�s�B��s�O��������Wxl��M'<���m������W��'��������~	��WX(P�i�P�I�ZRR��}c���f��X@k�o�������lR���`����G������U�$$$@76������ ������;������
�W���0!]U�Cw�����I!�p��|������[b�*R�v��-$xzf�Vd��������3����������@�B���j�xK��?���=��������/���@ ����++5�m�\��@��ow���_�Y�������Kw��������b���o�q�VOJ	C��e;�����u��o��dp��/,<����R�D��ece���K��P��)?|�<�|N�"2tl5^���bt}H�l[�8=*�%Y����M�q�M��a@�,��
�Z��#���~��}�� �$������?mpR���u������E���X�'����8,�t���}K���^d��f��O�k�x|x[�.<�I	����o�n������p���������x�Ds�&���>�1���\Cxs?��z�4r���)��3i������l��vIH���R����K�N��7)R�����J�(>��gFi!x����s'O>�bSJu��������M��|�����8�:�]jn_���K��;69����D�O��i�Fp��O����(�H|���S^�=���.�.�8��30u��9u�;�W�^����=�:����4�n�Q�n)���0����p�flW���N��)!l���~�
J�.��_�3�s�n��ze��v)��l��I����S�����8}����k����a�������=x�0�^
o���%�&��m������9t	o�3���	)�����iD�^	��K�	�!	��6������J���ec���Ez�4�� �/��+c�n� 3�������PB��(u;���(Z	`���<�6
D��n(�u1�=$�����GO�����%���-s�]���2*m�W��]��^����J;�zH�>�)��T7t��(C��l����rZ�V��p.b���]�B�k�����!=����o5��:�;�.��Z0 Ix��oi��-�������Nb� �K�FZ2d�S3"&?���n�eX��~>>~4�|��t�-�|�0���N�����^r����"&����W��JiS%�����k^��{&���?!� ��L��%����5�������7������}
����V������/�^��'��}P]�8�(9gT7p�[-
���q*��{��(o��h��%G����&[��x��;w�WOe=��Z���<�X�tus��.�V�#6~c_�8V-������ahi��<t��7$''�'���J��q,z�����������Ix+���
k����(��/��-j��&bea��N?&�En���}�^z8����1'`	��}R��ni���L�N�hR��>�d��%U
���T�$$��)���{T�M�����Jl,����L�-(��cB|�����o9�3�V>������c��������j���2W� �7-�T����U����L3�-l��	��#��}���'Z^[���*T��������g�=t��y���IE&��1e�
�?|���I�Y����vuQ���������(���@�<j��By�J�����X������f�6Y��/��[?
�%�:!*��%�see%0�'������f�Q��(�y�uKU�.1�5��K�U~���) ��H���o��1z�;����E���,**z����oY�s��].�;j�W����uL����S����z�~��<LW�[^���!7��{3��y��c�����l��@�T����:����5�����	X��Q4��~w:��'��'z�u~�f��:�=
�d3�LM�M�����&�9����@T������CA%`T]��c�l*w����.���v�{9�r(lj3U_�I�"J*W�P��_�N�d�0^��V	�P����g���kT�����9sE��m�3w�:&z�c:������I��U����u���V�X@����onR�
wC�p"��t�X��v��-j���! �_�r�C�wy@��o	�.U&t~$�=  �j�U��,xi��Sb����s�G-D4���Yc��&;��{�.x�����-"7�F�3��R�u��ON����*�Y�����^@�w�h�6�|f=Ttq[������k�"`��xO>�k�T.+�A%8T����AU���u�5w�r���z�%�O���'���;P-�,M�����mM�����gt���O]��'&������8�������+��(
����{����>O��)_7����RC�J�Sf���������Yr�.x����+]�o���;8��
��V27��H���DFK
Ce�qjv�������|�[���\���v�8�<t�O])��j����y���u���"�����TrR�v�z~����N(@w/s��J�
u���Th����6�/B�Hsc�"����"���T@�=��$^Z��A����������"�nQ���7�o
5/<��E��cq�ZI�K����o-Q��IIa�z2I�2L�%}*�z������CHH���-�p����5��E	WMq-m�Uk�b��,�\��;^1�]i������3t�k7��CD{��)	1<��{uO���e{�lGw��N����%�S�y����y�QD1�.��<����cC��V����z..[���	���h�	��0��_���;��2~p��a�?:�9-���<4�s����p���#�i���>g�mGe�����o��l��Q����?���qW�
V�������|���'�z,vm��k~su��*��;?}��b��fdb8>.�X�"DKf6* ��*lj��������t'�%}c��5Z"|�E�M�R	��L����\�p�Y�<�r��C��0Fl�.�<J�/�'�s��!��H��4�v�S������d�[�	,|<;�	Wx����G��8u%��������""w�yi/�vn�65�p(g�]���������R.�j��?z�T���'���ul�{�!2���% ��y�,rCqVQ ��_�V���
��<��U74��Z6�h����������k�W.
>K���
�O~��7�BN���F�-ja�J�n�i����P��������rrr��XR:��h3�MGE�J}l_�	��oMQl������v���tM�:��B�2�[�Alw�$�z���Y�����}���+���}9! �����O9y���R�����)&��p'^[���/�2(O1\q�%9v�p����{y|M������h�+���Ri������vL�>*�l!D/����i���X�����`��d%�H{3V�,��������;e��_1w���2|�%��0��������U[J7I��i�����,���JM�]��l��W�w5�$�H�,�LPw��x�yn.��-YhW6h��5Zj����3	f&�n���"�i��D��{��mm�4C!��BT�'���g���w�B�j�����1�s/��n��|A�}	,��z*�$Kb)3��}����t?�2g�_�<����u�������-<���R�������]�nk���:��xs��FE�W5����V<�T���tpR�J����'�U��e+���n0�������`���]���e
�B��X6la�D��9� 6�������w|Z��a���U���,l'�)���q�y���]�j4m�y�����O|�r� V}���}v6�����b�Y�;f�</�����d�}�-1)�R/kQI��0Fe��p8��F��"���dYVL)/[�,q�����2|A�G�g�X��v�
��k�O�V���W�����N���+��>9��b9�G�"[Y#)���l^��	��DZpP{*%����#s��9W��y����DJor��9@_�+\(�5tr��0�#�|���xf���m	�1<�3)
 ���8pQ�(#��<i�D�9����8K*� i��$����o������5T��0a���P�se�!�����C2�JZ*v5��7b�0�:q��6���}��c�;���b.�gj�~����|��i��*s�a��`b?�q��}�s����7�t����C$J�L)���j������p����W����2�A����".v�t�����!��8/�B��N����]g�\��=WpD��C������Es��sq�<���h�n}��L���NW��NS�X���A��y���F>/�};�j���O���H�`�u�����jV&�cg���P&0yys�3h������*�����E�:���W.�i�W#I��9�A��c �C��p3���(%	�����L�C���_�;@,,���� �r�1~�G�����f�0jrkW���+_?|?��xV�W`����Lw���Y��K��Y��2�����3��{���.?u���Y{�)k�d+^]<�����g���Y���p�=����&�4�����	��_Ih�C0D�
�&�����>�����,>����>b�������"%_��������]r��!���p_��Tx{���
,wG�x]�cR>��`S�7�d�Q.w�|�3=�k���DXS�n�w�C�#:d������44��t		Q�k�3���aW��"B-,z����(���~!�A��\������M����������i�?>hZ��__^@D#�����9��n��������%ys�_��G�������C��%����X�����qq�|||��&QC
���dST������	P����+�Z��O*�G3�1�����#� �:]l+w>c��WVV�����r�a�v��m�,J-l�^��}��<�
��u�]@�����Z��F���v��MW���;NMm&D�B-�?���iR�,(����R�K�E�t]7�
��4m��z�n��,�U����L)I�+��� D���9#r�qu��i�ln��)�U����"%�}>��F�]+��n�JC�����D='	-��������	�Kn�}����Q����|�{�W<6�@��	Z���W��%�B�FE�B<��������mF+���ZQ���	�R��-�~�������k���c�/D�^v��vc��s7B�

===�g���/,���@���~��9�qq���Y��)�}���_V()�NY'�j�5F�Cn��yF��.����s��~vlw��V��4n�+^�f�r}C��H��	9m-�?	��u�n2W�!�;��Y�P�#����9��K��)�[f���d�+~�[?���s[3�T#H��������k|o����+��\��aB�R��L��X~Y���DlGG��,��{X:S:#�y���[g=%����%��M&�,]$�'z�N���|�F:;;Cd[;m��+0����VgY�����h�mX,Q�l5JL�P�G2U�G��i3#??�N�":��%�����$ZR�v���c�r�u����j��n&=�w^�&;}�8�+i����+���-
**�5��N��u#��e�1����&>����f5N�F��~Q�2*�����S��ej������0@m��H��S��-�yE���~��u���ot�Q��+�'�m�K��
�|��J��L}�:f^{����;J��)!,-Ru����0�U_�'�4>�m����D��
V���8JD��.BE�S��|�($������>���R��=�X�q+u�i�\�&^2��t�
�� 	s����~s����������xe�� �iU���9t�����3���������s�F���>���r�f(R
��������-]j����{uQ�>}�+�q c���
4�� N@S:u��/����T�C�����$�������g���G�._�Kn���JN\��tX�������E�&���*��dS������ZK��U���*'m���>�Z�<
������\[WW����E�+�7�t���jO�$��4y\��+��s�NE�:��)))=;-ru������1AS��L����TG
�z����{���1��y��b�����%on��m����b���6�T���=t�;����oI��NB�A��Ibh�Ap\SP ��w������xm����(�`�,�e=5��Q��i<~��+zzT����gi.�7���f�_����c�x����T�N������F�A�\�`���Y���1��.lMW}w�vQc*����O��?m�����[�����6k�da$���|��W�
# \7v:L5?���qd5k�{��C���;(�]�#���Q�J������[%��G�i������^�'����{���s�y���,Q�y�R����(��>�w�C3GZ^�D� A���`0(%
*OSS3ji��#�+��`Y���	����SQ�]wAG�2�hp�=*�#��BZo����d�hOm�tHV���>��i����3��D*	*����'��-f���7�X���I�����;��	��?,,,,x�*%������lo_d�:�GQ��)|��� xA```��>���*k�y��7��+A�1��#;�Rj�?t�P���P|���[_�q]��f3��E�n����wH��T������NS_�`����"�U/���� /�K�$��t<)..�TVj�����&9�C�[���W�������4����v0a��kXP��1<X�<�-���
�����k)�/+A�s��L!`UJ�:��(��0�����O4����T%O�������
X�f�u���W�T�9#4Cg��z8��:$QG"��J��#��7P[����������-;R$�Jg�����u����z2�W&�(�;�z��N�������[��(����wy!q��ALoK���EfUXXX.�1��k��Q���@a����}��%i��7o.���H��	�t)b�`����Q����pw*\��	�k�>��r���G��&��V#���2�2\VW�#z����'[����h3�<��1��q�������`����e�d�'B��8f���M������&�Z����K�xgi��\BV��i��Q�[�"�������L���#:;���>���	I��nVxb=SLEj5�����[�}�fS����/��<�&"����^��;���GfFF����;��3�����9��G�E���a����j�r����U�R�����~
��OIa@�o���Q;)FE��N6�r���cT$� ���E�y�e�#Rk�9E7
������������g
���n�he;j�����N��d�'}3�SEW��!��7�c8�5��WMU���_��������s[VKw���?�=����)t��+�F�B���y�8�&
2'�#�rt F���)�M`?���Unn.?]]�=F��.o�Qrg�-�����(�8�e�e�k���fZ4�e{2J��kY�g�g>��+�����!gC<�����G������U���%Y=�"�Q�,����aA]g'h���g��(��p�7 ���>v
v[�����/�U�>�G�����������UBC�@|�~BF�g��,!q��l�������*:�N/l�v�d����r����-�\���w�Q��dc��*�|XJL#�c S99�����~�1�=������r������Y:��iv�k������\��HV����2����S-�A�������F�Tb7�R��.���
�
�B���o%��?
T��{��M���+���1?
(�l���8��"�Q�E��t��3X�C����bP"Z__Eg4f0���z~����%u�!^�Dc&��3W\�t��	����^��������.����{�e���R���������O��C�fF0}�4���u
�u1���8c1�����F�����"8��b,���s�������Z��������UuuuQd#�n��*u4��E�����w�t��+����t3��w`��
��&�����q+F��M,�/.��l|���L@?����lw�����T��P�y�u����H
X*"l(p�w$���F��t�G|�x�O���R�	QW��*����t{���`�7��%��Dz��%-��i������?��n�t\�1D=��P�^j|||����'���1/�B�������4m�����E�\v�M�B'��������zw�����<�M���$��I�d���_���S��f7Q�G�l�`oM��gh!�IC,�"���������=&��;�3�����xD��Z��"�	�K${AY�?��p����c��8e���(����(���Q��e^�,x�����Z��a�[��x��***�99�t��^������Mss�d ��>���KU�*o/N��������>M�u��1W�����P��" �=�g��Ai�vC��sU-I�i\����a�-�Wo����+�(�����z/��'+��!����Z)3��C�o`@+:��fln��5�&���ITiI�Mu�iGY�����P����1_�~��Vw��cV�n���nkfk�w��=��p����[��3@-���kBe���QRr��e;���7�>�������AO�o�CvSl�"��5���|t����Xm��w�"�Z�n�����o���':>;��m8�a0D���M��I�6��z���B�~v�]3'k]��Kqu����kN�����F�<`t�`X�r�(�p�|I6������LLLW-������b.G���_��~�Q8Q�71|�x`|>�`�f��t������2���8���$���S=�$���:�P���R�������to���D���������g=$�������#Bssst������� o���w�^��j��S���L�7�U�Yw���9���C����(�H�fy���S��fPqL:��������~~��'g7Td��1��&���U�E��a����[�>]�������6����a��|Z�&���mu�5l�fE�k�A`E�R^��"�����ut�&zK��&d%�nh�q�.J��r�s*?MPs������	�E�7J�W�(�������&�l��=�Ti�������v��[����/ph�6AK^Z��Z�6���O���
���S��d�n��K'�o��xg�X�$(i����*xt_�-�8�BNz�CD���S�B�(y��9ko/:%{EO��xG9-�9��)<f~��;1�u�o�T�{4��
BB�������E�:�����pK/�b/�J��Q�S�<������)((���}�>%A��4T����K?�|�s�Ssus3�������1����@@���J��o�z} M#[�qA\�~E|��K'#""�L\G��y�W�1��'��6����y>�~p0v]��b����@�vT����.:�,��L������*)~W��OD>{+$�zQ����pU�4Dm<�V����������A&�+�:�qz�Fc��@��N��S������l@}��O��'�H���P[�V��G��O���v����I��v����NP��P���{l�lS1�u/�*D9W����RG6�����~����P���AU�r��R]����j��`��0��~��Y�C��qq��u��~������T3�����������(
��N�����U4�ejd��%�����l�/��G7Nz���wW���a��-���4���$w~�6�^�{h|.!����*"�"�'��C�`�)������5�,���P|��q_�	V�752�."��������5x6),��}�v��i���O���	��H4�)������!�yq��?�R*��~L����fU<E��n�p����f����M-����#QBe�����
lo�~��O<�?�_�%Vk���h���b�X0�,��SR���y����IT�K����SJ��SmiG&��1�)a�g�X��l�~!�f�p��89�i�$�"C=���:��+�����N��?!�z���/,,��k>�y���	>�j��F���������U:��3�y%ee���K�72TB�W�Z������(���* ���W��Z����������*I��q�vKn�0�����\��D!�/oo���-1��h�5����5�`�R$�6u+� ��������2�_�-�?�+6���� (!�?k�WX�����5��YE�����D��dtuO)l�b��T�Eu)�}Q#//��n!u���3����a.Rx&\�d��9��f��<@���t#'{��:��e9yy���S<;�SA���Br�_���!�9��f,JI��1)
�����"FF��l��������sp����E�C������E����^78�>~���NF�n��y�����c#FS�g_.8c��D'(��?����8�Sl���I�;���U4�07��5��U*�=��M\s�F���`�����nj���c#�/U>>o����b���]2�����<��K���{��T�q�P�=k�0V�"�Lw�����^�����y/�/G��IU�����lG+���.������O��������f&�-��t�0z�������+����uV;cWK�����/V'��=����E�]��~B��)�#/^4k�l���Y2�H4���X��V�$������1����+��9���/�\��W\_�`w�'hE
�VUU�Cl�.q5=��������L��=��-0,��������������w��{�����5-���-�T����|���a�h��
)u�_]'�|n�\h��$�)S���st�#�Y_��J�����O�v..OY�@a�h������X!�dJt�#P(W#YP�5A��y��5�����X`)Vy+O>��� 
*��a�����d��N���h��_�|I��hp�mt.����whP��(���jSB�G������8�R��$��e�G��63���������+v������ ~#�����e`0�sF���%��C����j�G;9s�9��YG��g����%|m�o�v���I����k���-z��5���H,:B�f{LM�
�����PRe�;����>�w'��%J���q^�U,|��j�J� �G�Y�g��q�/�v�����b�r�
A�"Y�I.Z>#�'�?G*���.�Vyl����wy��g\e@���wJ�h~0C|���#���w����=>����B�6	�+>���X��J���H�#�	�Lj�|�h����j9-3R1��Gnk���/�<�d3R�����ee&>��
�zt-��2#c5��"Q���r��o�&T�f������	�������X.n����D"`I/.�3���Lg&i{m�D�*��n3���5��%_TFo(�������1����8� ����.�[��f�	��p�B��>���3..,��d��HO`���Z����6�_�Fq�������\ �"�!��--#3��A�D5
���]������5��'�/f?�JQ-7BT}��a����O&�������A�,x{��|.�����;�DM�^'_�jK7����R[[���_���I�+-�Q���������u��\<�J��������(34ssJ%�!L�����o��o�y�'A�Ac�/���<$2k�/0	�,����k���~*�Ru������<�E��`5�D!��B�n�+���QJh~E���Qz!������iD�M�m�Q�5?�w��<1�7L(��I$�9�w�]��

B���I���
����^'��2��qYD���~��;��:�wre'��y������\H��������<v5�3`p�6��T`�R���eeQ
��&UL�?%c�7���c��d����]I=��+����gn�|,�^���-�����O��I���^����r�;��Y��%�+��4I'0+7������������E[����c�����g�t{[	�\�444T�5�\;�����������a
Jz�D����O��i�h9;�}�f�U�bX��k��7;�E���_���i�ml�Z���l7�>��#4x� ��
�x(�V^��n��z����?��D������������:�|����n��������|�X6�A4<GA�?]zc@���__�3za�&��F��#4����uK�P-����|�����1������8V�g����FJI^�z���abiF=C���BO�Kb��i,?k����gi_�]}w���zC^���Z�����h���*�rrr�B}6�����Pj�9&�p���!i���D*c|]C����<��>������*ed�P>��0���jP������_�w��5�b�����Km��
HY'��LBYZJ��G�M��������2��"���#�L��$�9Nu���J�,1���L������_���
��%�W���k<��'x������Jw[�mc�
��$�	H,���~�������\��������z���S����l =�EG��~RL���c�����'t�����_�z�L�k�>Y4���v$�[��}'�82�\L(4�^z�_��,@���%e�f�OT�����l����.h����%�~����>����X����8DX���v��XA��l���yWWV��"�	MF`p��(?V��L~���3�W�3s/����O����g�6���2JJ�����Q���������a���Xsi;&e��(�q��$O���M��:���x����b�-����zf�d�:&�-��������UPRa�k
���%g�N��b�����
h�B�E(R���4l�����L��1J2������r���^�|aP�����N
�T�c��/eM��FpH�L;k ~R�vC�8�e�����H<�2�����m���}���3\�
oq���X�&<���yl�F�c������rY��S�7��������7K�����O����_��t���7��e�7��1,���[�����V��������h�>�*:����b�i*����ygd�L�h�u��XNI1}��#���~�����Zz�?-��VL�����~g*:�����/�n<�z����O���,''Y`` F���N�=�!��x��JX�H�!����:�����Z��9F��I9�N�dZ�/�;#�@���������/-��@n����������}�"W������|���v�<l&�!h$���G3L:�X��-%�}�'��1]�L�2��h���F��;/}���3i<�[�-^'��:���p�{���h���>\E������0�;��R������y�II�2�)�����1g������o��99�:�z������n-������&�I���y�����������Z�=54�������7u�BO\�l�����U	�$c�������Q�K��^.4��e�3#4�w��):��������mW�\�r
r���M�	���DzY�M�Z,r=��j���c�'��f�����QU<���^�c}���Z��'�P�Y�����:�;�����HHHX����277��E��A�������1Z�b
���:t�VD=Y���?�==�&%�)%�]a:U�OB+��J
j��2�y�!N,�A�������������w�~��*��)}U�<��#�[���W��"�^�H�J�c��r�_�5DXX������F�]1hY��x<4o�=Y<V���xa���C#���� ����L�D^k����������<�I�U6}��d���]&�����G�����d�����}�t��8{i����X��/:^x`��K2�3�8]�dM�����J}���������N���X ��{������q�bD�@0u4|����j�e4��^���I���s�c^�`�V��V��g�l\��:�#Z�'����y�{�e��6O����u�@vM��m�w?>x�������� Jx������W�V	�H���0�2HB���k ���u{{{s�~���v� b�����R���?������^x>sW!V������������?���Tq�_C�����Z�F�oe�U���S�e#k��E��:3W*zh�*{�%$�z�A��af:R���S��g����#`��E�yy�5�e������	�������QlJO��$1c�S-�����T����$C�~O��:u|��7Nt���~4M.�����Hgo��s��+q���\q=����!���
�� ��>%���J-�-ws��5�
�����{3�5r%�
�UQq<A�"""��I###�������B~�!dk
��W������>o��r����)b����8��������p�T]C�o�Zg��/���j����.iPbwu,b��t�� ��R���&8��Z�m(�*��Gf��())e��������D$&|0�M��oZ���M�K�S��N�������������}����\$���`��({��@� �������L�kul��/�A+�����WY������~��X��P���0��6�%P������+�`J�����V�b�;8u�
��28�����\�S,A����e�D���1p�����j�GT��	���m��*��L�V>�a�ac8^hT@\N4������

$W�^�^�R�)�iK|ZRR������8��A�n�����F1����z4E�Ye���+j��O���&�������r��COF�L���9�������:����1���D���)��"��n��!w774�G_.��mc@����St��{�}X�o��}�F������>�(�x`X����A�N�W���I!�u�4���;�N��Z_$F����ty���5����������}9zu�-��od~�2�:x��Y���h����^t�0��YV2�n��}�`�����9��W�����m$��^��-�qN{Q?�"��^�����8��-�*�Q��u�S�8u*X��Gl(��h��p}���,"0put8/�E�7�l���3L>�*G92���3Zn���C��*)�U^$��^�%H`e��4-R�l�]�� �kn��NpZR����������o���c�5��?�^�����eQ��`4�cHz5K6]5�sh@����/�o�8o/�����vP�HVE��U�8?�@;y��%2����0&��I�����.����A_Q4�`�����n������������
E��������.4�����k�!���{�K�yj:�d*�L��D�77)�|T+=�PF�[����71�;��&,k�����>������[���E�}�2�E�!��+�!e�^sK����~v����hB��i�3����}j
2�qJ���C��Z:��[V������MO��?���3�G����1_P��4���@X�O�6g�	u/=5��.fd��h��]B�V���Sn�M2�@7�����/��I.��� �EuvS������9���m�����h����"��:��j�f:6\����O����o�AW�s��������L���z��}I8�4��|�O�'N���6�P"���P,�1��9���(��������C9�p�����~a��q��g��@u�M��4G�2��e���\?���r!G���/ )K=���C����������L����p�V6W� }�5������m>���zzz~���!$"b��8�
��2����Y�X���?����������X�6��\��������7�n�^�-���������>�$�5���_���|�����V��k�G���gh=QT��u��7+V��"i����
����l����Y<*t�|%r�(����#��K�C��Qg�9Su#��W�I~��a��xz>��R�=/<,�����Q�v�&�����	|���n
!��P1� 4g�����xw]����qnz�R�
|�Ji��}��8�k+�
�u���j�"P$[�IG����.�!O���u���\��p�x��
���I'����~������� ���1��T�����O�C��<T�����e����5>�����vJ�m�~�]�c����u��	 �6K��F�GE�����f��z�V�,������~�o	�>D7��s��;������2��]l�m2�^V$=�������@�]�98����YU���A��5�3�r'��=��Y�1����kY��s��w��`���-r^�]��:]���,2�2�:>(�z2��).�F�/��\)l����v����O�	Y&K�pO���y�S����	�ZS������f�~Z�A/=��_6��%�;�8�u&,���On$�"�t~q��[n��`U���� .�<�3
�"������V���9��[��}�&�Q*����y�t)��=�����e1�:C����w��P������3�]�M�J_g[k�����[l����W�S����5!aa���+�Z��t#:z`Q�b=�.���<�b?{������f�
c���h%w�h9Qsic|��'mll0/��8�l^��`��_xL6R�ha��3�I��c����=?04�f�_�iO�R�I���������|�Z�$*-���U�7�^����A�����r.fjd�x�~x?�.�[c��d��y
�S�n����GM�
��oP%1����Cr��"�U97����a����:�+�	1�����6���z�"@ &44Tc W�F��M)��9����B�]������-�v�;���m�>���9��E##
����/2����9��e�	�R�b�Oc5�ziWD\���.�.��n*��mK��o�V?$)���+�����������@%D����P	���S!$��Br����Q�MD��J	e&����r�!C�R�6���������9���]�����[k���]{��W�"�)��zuu7�kG�^{�Fs>���x�e�?;r�IO�����4rl'`���d�
��]���������N��X�������C����T����_�O�Z�[S��X�Wv�d3�����C5���`��ELz09J�.����1���J����}�\�$��o^�W�:OL�����J:������<��:R�#����h�B*��9����������'Ki��z���P�G��-��������:���X�
yjLq*?�����w�]�ml���_���67r�e����W����	�8�2����'kj�����`��Y��&�.Z�5�n�����y�.�����N����Vy}��0_�4UDA�L�����x}�!0�����������z��	 ����t�mv�#Z��^{��Z�o�D�N@������q�<`�a�P���JWl���
%�|d���g������gB�b�A�wfg$��?N�~�r7���i5�S���/(Q�a��������*���sck�W�!���G~���'t�a�*��x���/GH��f@j�6�=d�������(�����
zh�����$�	���l$'�����L�����t�9w������~��-&�=wl�f:��;����k���������_tC�.���K��������c�����9�1���AB�>p����9xk��%���X���3�U�n �(���	�8��/��*&)f��:,������W��^�h\�_����O0�U�2���M xTU5k���b�~��6d_�k�X�U�&��E����h�������V���;Nf_
�s)����9H���9W���&�y�Y.�k�T��9d��iPy� ��Z��R!��SF�����"U:�y{�y���r��Q�����>����"���
��~?Qb�eA�
��^B�TOap��Rt0�",���l��+���{��I����l���J��W��>�-TX���]CuK�pjj�77��,��+�n*9���J����4�0u"66��b���,�������������5�U=m�N���3�������e{����^�4KZ�g�����s3#�����t+�s,�0Y�.9F-��xx[�xG���R�-��2<�x���?���t�S�i�D������+W������������sw���w��>�,&���zt��n*;��.y� S3q��5Dgw�''&���<�@���$�s���HZYcW�Vb���pqGg��R^M���U�FFF����vH@�����&pE+9� ))IC��}|B���
%�n]B�!�S�=���N$�1��gl�������S���>���3X\^��(�f8��"�M��6m5=@�K���i������x����K#�(�m����S�z��w?<Dr������k�N�����<R.�C�(�/����GN���������k)g�����\���I�o�m`�X^N����;�H:z_��\�Xf�r^uc�����a�,~�����2C��[;�KVm%Bd*��������P����y�H���)�M�t�k\�--�)��^�D���|�1�X������&��X^o����z�����'���^V}�J����W���*�I���$�\=061�]
����������X;�])��_�8����L
3p��q#���r���Bf7��;��������E�MY�l/�E���*4]]]��tl044���W�/a��e
<��j�Y��;�u>�w�y���Z�������(��
�$��:�X�L���H4�����w��<I���8A�S�@
�K�
��YN�0{�'$�������PVV~9���q�jp������	���3`��{�*��'����,2�4�N*�J$r�����F����D�����������{�4�}���4�O��~}6�W�/$B��#����pcK��KM������e�"`^�Z.M�eg#�Ow�x{/�7���G| �O/���OH���vu��������JC��:#���	��K��omm���� 2�Z����t�.c��[LG����R"F�C������x��������\��o�.V>��q!�Q�f
v��<w�g���8��hu�Y6��G�-d����8�����C� M��83�+
�:��&&n���?tY���B��QZ����Z;��� ��Y���
�O����Qu����J�K�������D��"`J�*���K�#uF����:�R%�O����edK�w�� ��"OfF�f"!����K��`�Jw��T	f����g]������7iq�>���/���.^l����p����Y�sVxf��	�Z��T9�x�J�Y_-#7��'	&
���iS]u5��'�+�<Y����+X�1�r	7��++Z�x1_�BA���N�O��I��������e
������_�`�E�&3#L$&&�GS������#�J����
��A\�wu�����w3���Vv�*�r������`��yliR�����y��yxD��t��|7��Y0�{��+����{Z-�&5\�pc�	N�`u���W!yJ\J�{b�'��-�����A`�d��i o��(�������id$#w��p�#y�=�q��o��c����b�|��5H��*�i��������kn�V�����p������G���60Sa"���'��O����u�����G����R��D
����n�q���Ho��hk��N��)eY�<�#��C����]dU�u#���Cm:�K	�UE���b�xb$��CX�o�����b��9(<���4kUG��,��!U�aF��T�a?�6���Tra�����=W���fgC��2j��k�YV��P(��}����P���6�/���#��G������=X��P���`���R�!��U�=�X,���Xmcc��t?�#��m�
j��`W����^c�$N���',|y����������M9��zTy�*�.�6������0�.m[�
�^��,��`N�����cc*j�a�y��SS;�<k)�k�4Z�Z,���G�����3S0+-@�D�~���\4-@|*��NF������`~�x�PHO�w���m�������tF\�����Y������L�������I0��x����W��D�-���&c��h<l6���������y�E�@�{���jU��D+D-������|J+*��Y�@m����%��\Z,nsT�H��J����IIRx�4Td�<b���Z�^xlS�@T��14�mQ���6=��;\:�F�bg��	7T��=�������x���� y�w���xYG������N�e�������_�a�7=#z�z���H�CO�po�nk�PKM�G���8�PKDs�Z�� dst_1000.pngUT
�#~h�D~h�D~hux����P���.���0PA`T@9��A24%ghr�3TE$K� 9���Mn2�i�Mj��k{������W���������~�
{����Yk��HME~�n��[�l�������-���l�G����	�C]A�G����������M��[��tu�up��2���������E~a��|�Z��:����u�����RI���rT�s����=����	+�e��-��]�����sw������z	<���?BK]���V�~�
O��{L�}L��6]F���~�RK��r���;M/�*(p�_�e-#���]��������x�e��b6������c@���-?|�Q�su��W[����h���t��3��H������o������|���c
y�2��c�Q��7�))
����NC�����44N�����?���p������~������t��Lyu���+��=�O�5m��.�*d����M����|�K����C%J�vE�+I��������n�X�����z��D�����~g���M�lY�����N�v���h]Hw�M�2�f���3���"���1����d`Q��b���ncc���wk((<w�Ja�����ROV�b)>����������6�<����T���D�|����(	�$�qzs�^�+�Bq�b���6��\rtt������mu��I��S��5B��z�v~;������'����'C_#x-wY�������ei�")�Fq��{���,C����vrr�����i{��@&�N����������w�4?}U~��$��������x!��sW���zz�v�>n+��Y��&wd
���_�pa�Qb����~���[�nn�J�g���($$�����?#GGG�����eE��V����-	����rC�|�Q��������7�rK����c�Z�|Q{��|���_��rOR�9�^�j5��Q��S�/��^���$��|��1*s#��c:"*����-7��&b
�K;h�?^z��cO�ec#�l;��+��0���$����-Q��}�n��9V����{���	����w�O��1���	���a�x���iYF�T#��������<2r�����wg����r���-�(�����	�Ks�a�?���>���~���/��D��"
�n��p���fWh��[}]��|����<�p;nI����qV?�)>H�:/3?_kO��bu��k�N���
�B0�����
���w�R<726f
G�5h����p�	��zt���������R�=~�T��4���C	�>)9�ri���C��P6o����q�^r6�x��6�k�Wh���.T?�^�{1LY�c�M �TZk�j��g�����.O��4�q�Q��4�
���<��}���K���<�E>��D(s��:^����kl�qr�y_U���w�B&�?~|�s�pM������Gy��u�n����+�im��������J������O�J�tfo������Y�&Mv�w9���d�G���a�>�b:|�WPP�!B��3I���v�����TyN��_[[[XY�xx��N�����E����U���	�Fp���Y���t�]7v_�������_ �0��JU
�/�'�
����gz(;2=�	�������x���+���2zx��Yr���C��I�}�g���#	�Qqq'���0���u��/���O�8!x�����������A[��A�i��Qo	G���S�f_�LRVO����^��]/��/I������p<OjM6�f<r���`7s��1BL6@���;�`IIIA�/��>���m}���n�	S���+�uV�8Fe�[����@5M;�� ���s���.��G��s����_�J7s)���0���)�v�mPh������H��y�f��+W:m�~`�Q3�����jO��VBbbf9(�&���o�=:���d�X�#crw��`�>\ci4������:Z�r�i����!������9N�����(!:���s�1�}���$�>�6�/�)n�����V���(�d������ku��`u	7P�[�X$�[�����'o��}b��M, �B
%P~'�}[������a�_p���f���"%��^	��Wl�Y�#�z��2o�����A��)��
Gss/��}{i3�[�<���`���V��b�R���ow�{�ud�d�~}$J������&�%A��v�:�#88W�x�����U�c����lE2\��y�{o�����������`�����C���QO_?<�w�d������'��b-����:�N�/����9�#H����[����=~��y����"���w)��o��y��f�N�y�-z~��������Ev��9�;�/O�$���x?x��:����(�@h&4""nY����.1[��R�����km4��y���+}��Tg,8��dzv��r����"�|
1Z�{���]<���O�d���ms0��4vv���d��z���Mw�DsU�KW�Jb������Lp#�k��i0�^�v.Z�85e[1�~�vL��3g�����F���0���S�%.��,+h�������g�����a
o{
�?�o��������T�(�Q���\4�[���a����j=k�����h^���d�{�:}�e�
L.777�#N�������4��<�bY?y��	��
��>���s^�8���6��'d���]J��	�?�3}��ww\��:�K���������F��nL��K�|�JAz �(��h�Y����/+ssj�l ��O9\["�7����E/,,��V���sN���N�c
+�W���{If��}t�C��������C�[H~cT.M][;s�\����F0�������>�`�s�$�c��,.j"V%)����H������b6�z�����\p����c������y����{`f'�pg��q+FR��E�*��u��p1�^%�j&[��a'���Y�������������Eo�Hm��;�<lGf5`a�����3��45�P�T��[H`~�~�!���=��E����h��]���%�~kJ![�����yk#�i�Y?����\Ql�1�Xk�/_n��o��5'Dg~������{�6Sv��7���@d��-�
�'�Y�-���M���/Irr~�I��	X��b��������q��o�#�m�7�pG�����,H*)?_0b��Cj�7��@�9�*��~�[�4mI���!��R�T���o.���.M��22���#����_�m�cKp����d�����~���% ���77�����l��w�.���9��F�w�X�}f���[�#l����t�QB�c�y���>K���
��*nsm|�����o�M����I�hh�'!���.��j�u�/��������<`RyC�Hl������#�������`tu_'�U�Q��[W�P�������*SBM|�]�0�����:Fj_ 
-��o��uy���S|E����� �����\��X:��!��FNC��t7����,0
�(�����
|i^�I:����~�H�|������"V.ds+Gwdv6���B�h�U�6�������H���A8�\���m�7(�t��27�������)�������
+�u�?��	�s	�_w��?����s��H����\ru�k66��XA�'����X.���tw�����]��y���"�yS D^?x��{'HSu����6���-v��xO�c�J��WM�w�q�m;^��xN�������3�JY��V�{�����\������=>�1F�Lo�y�RK������M��Y�f�._x��2�	1�l�<!1��1~�����"h�������������!AL���F�y��_����Kci������y�����Q���r-��Kg�A�k����d��B��]�����fKM��]�� ��@@]�
���`����3'|�g�P���*��}�Br	J�KjI4&Nx�R�v�R(7]�\��*�����"���V����>7�21��^�Q�w�� �`���X�+yM�&�p��ZX���x=b�����*V�05���:���x?��G/��JQ^b���-�q�. ��f�Ot�d��Pz[�@*C��	!8h�`�?���F�m�\3��_QcYXdA`�Q��]�V-��*2`Z���TR��r�I-�v��?K�
�S:���Y�{�If4��t��N����=�*�KEx�ud��>~��s��eP�����H�24W@Hdx�I�]V���c9w����G���L:���Q�p�������	���!.���}=US���]� '��f���@��_�3�d���<�HR�S&���E���
v]�8��n�<�������� d��a���$\�!D$��W��������h/!g���^I<i��8�t�Z�p���E�1�0b
���J\��)>Z)G|w�nau(�E��wl��Y��J���8�T�e�s3�������S�:u��/��8���;�������B^�Px���eG������������Y���?���'5�z���k����Q���],�>�
�1�����.^L�M�{������������3%����������=xv���c1�����h�}��k�uq��[B0�������n,#�J�o��G����"�=l��SwgumD�e���t���7KaJP�>�����#$�N��y�4��[�>������U[���(A~�g
��{���8��Z�����t<8���=�0�8D�;;u#�.�F�k��R�sx�c�,G���'��4�l.%��[���T�{8�
"2��KG]��"�k�%#�<&�sp������p��\p[Ud���X���M}���������wV��{�c\l:2�!����L9�Q
�����Ef`� 6O�����-ZO>9��mv����7��`H-w������\�-�*MLJ����xt�T��@����b�H�����Q}'QQ���p������x�z�p��g�n�>���s1�m�i�F��I��v�����l�GY7r��&������2��z!�G��0,
�(�n�"*WzcN��a�?�:�_�Sz����yc$iI���{A��V�������F��Zd�0��w�v2���mc^�WX�em�<0�R�6M����<��Pj`$����l�n��Ij��'��M�T�=##�-�`����g'�J�e�����Ql�^�,���t��
�����=eI��GL%|�_��>�����H�-K�(
!���0�/���fK����2'�L#�KIH���<�����s�`t<AZT<:~Q�b�3gae���^��7�����������bc�^�4���S`�����
1��b�s����y��L6�����&�|ye����=X��m�M��@��������gWv�_�o�R ��j����hb300��$�ODH��n�	����t����*&&�����%!)n�R�Y��M�����f5�!����+�]y�
x+���N�&5P J����4�SFR��a���1S�HiQ�I������}W���19%E���-��S���?����}#��0�C������(��J������.<cp#������k�����p��=��_���?����`��(xLLhe�&���O.����(\o��b�Qr���t���������?��3J�����B�i���m�� �K�m$�i�Vn��9[��=D�`;"
�`��=LG���q�U-���������.Z��7����~ri�P��go�����=�"�EN�V�����g��Q���6�=��������4�>:6�����+W�O�����e����B:����O�����J@��U������B�AU�����o#-tS���a�d��yQ{���zr�K��)�����s�^$N�t��S"�������`�\0"^������	1��5@D�,�2k'�Y3�����0��4�J� ��������G,�4�
�Z���U�������w,"��U�CLL$ C�=n3�z�LJJJ��
�y*1��m6���_�G�l��Ii�a=|���@�����j�N�a�@H���t��K��4<+�]�	�(.�P�D�����3��NBY��KXm�YJ	5�J�(��m������j���Lhjj�����066���~������d�����d�[�n�����Q��	V@,#+�tu;����Z�Y��%�2�n����t���q���	�`�Ff369��nL����d�m���Dj��q���L<%"�A�+��T&�x������T�}k��9Q\�7/�;}:�q�$$#c�T'�Po�2��x�r6aen�+�NZ�����;�I{.~��p����r���o���^��~��E�����1C���@b)�&yv�.mX�������x�YAl�����N�-s��+X����S#d�M������������}%�E4rJ�N�p���u��q������eyu2D��:�R��}{���c���>��~�w"\�:����!$��]:955� R�.��zzzw���k��5oO	�4�g�B��Cn[�3:F�^A�a#{~WG��=O���!�k�;2��=]���z"�h�������1�4�S��jv}��^����KKm�k�od���������n�c!�N�F�g	��]��Wq���j�����|�,jq�m�YE����"�*������Ji����a�]{���H[����X���Y4mO�<q|��|`
(p�@a����}o������~�N|������(Q�+��E]n+}�6 Up���BZ�����q�����{2{*��X���������I�;{YL�}��g����!�����<zPm�.+F�E�.;�,�ol�����6J��I7�_��N���q�&���IT����v�����PW��TR��7�^���T
���qZ�����h��@���Z�7�����|�+_G"�Ok�����}F��#VvGD��Y����!C�������r��]��a�����u9���Y}-��r��,P��l���FQYFe������!TWrG����+4�=c=f��N����WE?�������c����������Pb���D��20'��2^�������O�^�-�4(RA����k�Z?��]�qD���J;m���&��r���m�L�2�{;:�-����KC!�$��4�q���t�
�Dk�	�Z�lZ�1d<}�����P�/o�
������A�.r�Q/{�&��9V����w/@��:�i������Jo�!8Q�u��1_�^]]��V�u����.��|
G��?�[��A�>&f����=����V���j8������*t��G�Q{{�j23�|���~H{��YDkI$���]�����d[*��������~��FEthh2H�f������G�TfgA~�f�7��Z�	�[YYu��g7S�
x���2���>y2�rwc3L�Z�c`�/�?:88D�����+4a�p��#$f�e��[cFHkx������{}J�� RH����*a�*����={���m��]���-�����Q�F�4���X��aa�����<J�,�^�zs*���MwG����q�.�K������S{{{�g

3�t�,(�|����������*�n���&S�&��u����4���L��j��HH�
�P=o5�<a�ka�V�hffF��,K2�w�oVmO�	
�K&<Y�~�j� Pi�(�2P��G����[�������{^���-�EW����`�;�u������>-���������k������sn�3�y�V�Da�����G�8(��|p�Lb^n.�Z��,(kP����A�>��Q����]���l2meT���(�~�c,H�PV�##��.�tu�=�������Rr;��3m��R#-i+�W{
�Z����L|����V3a,A		��{�JU����>y������E,'f��� �c�;�%��	�/N��?����/���F�����<��������P��`��(�>���#u
�`l�\
�9�{��5������Mb�Q:�<�pM�4����q�����+��@��Jy/�%'&Z-Ou�Hz��*�7�"%>~��eQQ�2��v=�4P�����B��c��%��Q���GOF���,�,�+L�g�����yedi���'�N�R
^_"�#���x*���|��iw�N�xz�+�,� ����od�� �2��{p9��r��"��^�O?��H9#:��.�;<I��~��OM���h��/���H����;m^r������{-�/��l\n��%�Wx���}����#�����E��M�:
l������J�Ye���fy+�0	��/
�Z?����>�������8���o�A��0��Y����9�!\HSN�ABo�������xp;v��2�
����l��5��[���`�}k�D^�YuD��q���~��cT�@�o���mX*�-iy��1���q��&�U	��q��{�~��� ���c--!�^�K~��������z�����m����
�ZK�d[��J\Y��?i������������R�BD�x��1�B2�3�)V�
�::���X���
D��{���������SYY���"*n�+��u��N�/e����:�	�;:>^�_W�l�[�Lb��y�v�=�2S���6�@+�����B^���
�����(!O&4$����w?}R����W�����J���=�v�+*>z��uy~e��� (�5)����&�gLLL~��?&>�]��^|��h�O���GJ-o��8�D��qtB^�&�IFs��������M���	�728�JYyq���K��@M����3���O�[��4��@=*u�����u���	G���b��x�w�5F��*��mC�#����MJ6��T� F�����<y��Y������87�XA�)+���7';����O�+;D�"�����[@4Nw�\���(�T��K�MM8�����*���_Z��8��x���L��[a������""����X`]���95�/��Cz�))��F/����Aw��X w%F'�������������*������
Z�k�,<��0��fj���m��JM��.�����+�������ZVVZk��9KOc;w_�mJ��{�@��9tQj_�;Q�s
��G����A]f@��2�@T���l�5���ln�!FTE��Z���C�x���F#)��Ec*��^��B�J���0(q[��**z��=�HV��������9q�D[�
�2�g���YZ�6T&��L�#�E������V�}�pc�D��V���&�|�,U69����Q�j�O?	Z6���UD���_�����R�EiA�g�2���������9Y���A.����(���!F��ev`�������$j2ur����cVFa��������q�H�z/O����F0b�#�z	����BL��@���D���Zu0#��	����S���U)e�|���d/x�i>>�(q��$VW]Q!!�/�~��������51a�r�v�Y&
�������3p;v���C�_d�JC�.���a5���@���R5���F�����4���p��������
5Hyy�����f���F5������������[TEyaS�9�Bu������o��S�����9L����%��RW�P��Gj���
N��8���Q�s��Z���]\o�i��i�R�-
����r���i���.@F�� $&'���{-�4H?~����;z�v~�������� ���.�������*']���
���~�O�A��������{��G�a����	�K�����*'S����������w�����f������[K���-��q��e����G�{����o�Qy��a���OZZ[Q�!S���O���y��q�6T�IMM�i��������5~�3p�te��h���K;����e�i����:��jb�k�������������A�I���0y��sW��W������H��o��B��<-����

���d������iK��^2~�jcTu��eH�����t/��z����?6���_���SvHT`hx�������>�k>"����|u�����^,������+�DZ������!�0e�"W�� (�b����B�����i���//52P���n�;{��l_��jST�30P�T=����2�&�;::�;j����e$�	a#3���8�^_�0��}��%���������C�P�8�a��$�H,��i���]N��{��5
W���!���a---NOo�t,�c7�[�����E(��Y��������}��B�2������q�n_�"�����7,�v0hY[�������0�����_�<��Z0��MMj"��Z�my�����S��l_�ptv��GT�5�"{��K� E�@f)j@<��9r��3��������������/b7!Ov�<�������^��xff��������[Zz�@�%�(*������������I���	�&����������������qpX	��z�����V_*���

x���c��^Ow��:������������q��S|��f��G��G�/�U��}�~6�V�?�?�U�4}�����?�$����Y�Y8�\#�DF��������U����(�D��Z�p�J>���1L�-�
k�8��_���_`��gm��xb�����]������m�sp����<�t4Y}O��Q���{��g���Z�U������"d����8R�s_�;����~�	<E�{��$�D�EI��t�^�/_n���7lk�(��)�}�+8�����:�M�F�;u���FM������C sa����b'$gNdo��1c������f���
>t�h��q�y]����������Y4��"gR����q�M��_d�<��3g�%2~=,��?��I��������k���U�A;s���2�/�Z���P��k�:�QO7j�g��I��3s1�+��Zv8����������`��)�b�XJn���tG�A�h}hzF�2��/�M��79D�7�F!9����Up/uO�����G=���o!h�%���v�r�����t<�[KC#�����6o��\5�����jN��s_�Mz�DwA�F����2�����!���x+������@~~6	���P~E>�����)C&�������OvE}I��\r]_�9��hy8��0��AAD�P&�}��e���ooV�[6�H
���*l	b�������Z[[;s���:�5E=�d�\rv�e�7L)�!����A��n���E�LD�@��_�����4������U_i�&�)�#(���JMe�'.\���TI���Qm�<�<��
�0�6k�d�����To��E�/�:9����xQ8���
��:o�[�S�d�v������������������P�N)��-3c�������y�Iyi���@0�A��k��)�L�;�))��xyF����_����<U
f���������:�����
�+*��M��Q'_���H����6/�8
}��6�s�CZ.n��S�
����>5e�`
,����t�1��u��5*C}��<��^<8�3����W3B�}��%	���P�m�lOrSfbb�Z�V��IE�.��Z::I>\�����D���R���EI�~l3_����a�����0z��q(������Z+ ���!�m�{K������A]�p�����02���}���yV/�7�Xd��2����t� �����i���6CY$�����Z6�E���=�H�	~�.O�v�����l�w����Q�-��s �j���o}��0�E4�+�d���UH	 �:��X��u��1#4��u*���� �GCC�L����`����A��>�]L?6<7X%�����:-�&k�����)���zj2C�:������j!�����
�L���eC�	O�L,�8Q�_=^��k������Vd��gO+xk��g�T�� �	��Y��z��"j����?&Gs~<����p��F�qE��4
�2]4pM�laeu~��k&���(���OP�����M!c+�1
\�A���\GC0���0��h��	e��`�>UU�������=�<�(%���3�%h	G:��kx���C�JJG��P&�;wN��+�%U3���4�t���-#�R<`����d��95�������1��O������.����7��h���@e����������l|�z���fT�&�{#IG����������sx���W�������fY�5M�C,,i�����%�6������i�VpTA�
�h|��	"����5!Z
A���D����������
���}i,pK��Xq���94�4?��v=�
�BJ���<��A�q��(���/��y��$BD0����`���O���$0T6I5�����4h��l�\��?G�~�U��+ ���A�(����nB�~ew��O��1�9Z�{�c�
�����a����A�m�C:I����H���7�����#
�R=ED��5�/,/�\�tG�}����~���=��.*����=#�B�I��{��B�����,2��(��_sMEE'��%�;3����;�G�c��b&;2#6i�~'����������p��w!Jb��EJ��w��tA�Kd�-]��))�C^�L�E��+W���Z�^WTK�^���+�������SV�umI:���J(���i�[K�z�<��wPq��EC18&&����O>�gW766.����2���)�DGi������Aje�������Y!��k�����a��*�f��		��Y��Y1���c+�8k��Z��+!a��[z656�O����S(n�w|��|�H�*��[����9+�pQZk[[��|Q�V�0�'C[zQ�J�����w�:��0u�u����Yt���X?���{�53SSA�������R�u����g����Q/�=���!�*��nM [kfQ?i�-Z�e�B�����d����2���L�0��p�P5r��g�Wk�3s��M�2t��
����QY��i��uT���|��!K��%`1��v}u8(�/[<$���4���<������O������E� ����*D'���$�a�1bo��$�*�B�������aZ���*��-[��*��A�t+�9X�U����.��mi��>�m��=C�������~��;>p��7������<)����7��i:��P��-��B0bi�������=���B6�����CF��
WV���XK�@f�:���G_��t��b0�J���o�~A������������n����}�q��6�~	MP�/�-����[AQ����c�E��}`��:��dl�s�|�m(11�Y{s�<vu�&���n1WEA!��� �
xU,�_���kk�t������.G.O��.?*��������^/D4'�It�����]g�}��i\����I��r�?��F
H��$$��_�v�����xC��3g�'l��F��Z��ly�e�D���q`�h���@6Z�����A��{�z9�%7����:�Jd�
W��5`d�`T##��h����42�����I��
�|w�X���1���6�J�Bu_�:	�&���>���s
���#C/>^>HG������v�aPP�q��'���u6��[�������PM�K�<�:N����u���FV��3#��������nS��]'��O�0�!8�3~���m���������� 	t���F0��������*������C]�f:p�D��oM4����(��$f����J�K�VV0��Q@��`HU*W������d6u���a�SSS�lxS!k�����Q����7+"CC�c��~
�$��t��E��I��I�?�-B�����N^���oN���>y�V�G0`�7s�zGGGw�3�\Qc��5?�i����SG=8\�^��AO`����1,w�j*p��O����}���
|���I1�QWoc�E(��f?���w�;pb��2��<_y�C�?���:��\#�MQE��A�J�����h�[^���n��VW��[�<����{:{u����l*�\ok/q�]���>����_���L`�-A����*b��yz��>wuc?4�(;�ds���)���U6���{�����!����������CJ�K�Au��=z����o@1��(�����v=BX�����! k��5tu_c���kX�����}�OZ7./77#�,��������<A(����lF�����F��{��at��'��VK�4�������j*�����u���#M�wW����qq'�E����Hq�Q����d��pDHp����P���mC������29r������;w�lu��c�B�S;��l
,� h�x�����n�Leo������0���>	7��B9k�<*qB�f�&-]�(����Q�d<\�^��`�YM�����n�1Q�a�H�0���z�3�
���;Y.������&SP����R�P-rI%'�����>�"��2::����bB]o�-����a���[������f��W��Hl�[�����w�n�L�����������h��
��h���y�^�����o�-#bbc;K��[wc>��K7;%-m��v,������#+��'��/$
����M"�o�Lz��
hm1#�R/8Q�FYo��W�K��>	b�+�LrF����^6q���U��&�?��~A��rh���L
>�#�#�+'����H��
D��{�����g����
J=��*9)I�';r��r
��+"B�'��_
`�������4v�X��<u*����-f4P�q�|��<���������)�/�7�{���*91Q��i�p^o�l�����!N�!B ��L��n����03��E=��l4�?$d���
����� �����Cc4�		�D6:Mk�`0��������0�W�0�R����NY��v���j��bFC$�f�q�~�0�I��E}	�����IB7
��{7��G���.�>p����y�����,<��5kqM����������W�m����@a���]�'�&??�nq
?:�����qt���!�����R�����q��z�}�L���~�v��/���~��Oi_?u&M�T�D�>#���(�A�t���uO
g	=�ph��K�����>�XZXs�>~>O�X1�`+8��������B�Jg&$|0����(�_+d�P}}}&o����}�
Q~ai�%���{���k��c�"���J�C���%�YK �VVVv�_�DI5�V���pI�\J���8�J��.��j����|�'��T�PC�G���i�I��PGv�9{�����y��#��GGo�f[�XQ���L8
b�hQ���0en����������!H�����=@k(�'%$���x�[��2{���Q#;]
���h�L0�3��z������d�/\�I-/�]�%T�����bO����Em^�_��.�L=�t�d�E�>~���e��i�����f�R��#J�OZ��&r	g�w���-Ve���-��������gp S?~��Q3�&{������0l��U�o��088h���q�$��L��z�8?����%�m�w$�r��'�6���#[.'++����="��'m(' �zd����cS����o���*�9���Olg���1O�����[\������?i����Vo��o�$���9w�\�I�I�IAA�������VF�u
���%���_�`>��1|���##�f?������k���)��
i+r��N�x?=���v���A���y��c�^�s�3���h�fD���}��5��z�'u�2V9���%�"�
�~�O_�+\����H\h���	�R�<f��U������qZ}zv\���S��)�W�n��h����rA
���(�c!��#��V)��KC{�t%�4~��c�����5I&���I!e�c�6��"PW{L-�I�1��@4oTLM�=K�$M�2�EC0��**Yn�g�~A��k��2)��|p��1�0nnn�A���T����s���H���<�b�?s�q.��NN9����+�jK��9���������@��!z����@m��K�����-���l<m�A�����T����]��J`u���B���D���S�����<}�K�����4������?��������R}�P~#k�]�*��mA!?|�\_"'�U\�F
����������t�s��*�?�"_L�31]D���G��uaD����6�����}����6������;O�()�F���KB����E���YY�������3��`��
�3�(qm����M����h
?����}�����Y�����x��q�h���7�.�����V�Y��_j	*Z�	7�,�e��#��+Zp,v���D{~� ��5��X��-��z��<�z��v��-��d��7�a��\��m��J��o��g!��u�@8S���K��"��z����999�w
�}�!~���e-8!Q)TGb6<88t��`�<j�d��gu��`��j ��^4����F�QjO������Z��E^��~���?Uw�IJI��v�SWfAoM�m����#Q�0\�	�����w�n��V:��*��6��������.Z�,P�9xxy�?����#N�F�Kf+�Yh����n���V1��6����`��t��1_��P{
�j���2��7zi�����B+��Q�pG��M�*=e2={([��(J���{(�M�9����q�����QQQ2~�h�/J��`do���3����Y1��s��v.����1@?��p�t����);p��Q���_��,��x��E�}����T��������ggg�m�[&ffD!�I��emf����]@UW���y�E}�s��}���S`q��fH��S�������yu�dp��z�2e$�,--���`��}�Y�8���#h����V�%'���O��g�-�����Y�tn�AD�[�	�@�������M �����W]]�+�'y3��tP@��?�K(�..�����&���2b�g�����4u��*�~,����
v���)������:!��m��
UT�P^��E�`%L�
�
7A+sP#��`,(\������11`,�����{�I�c���r���e�+3���rb8�J���[�s!AsEQE����66�x�	�)#�f�q��-h�HJn:��P�h�����d���0�	�n�a>)�o������%��sY�k�������+�[�bX�vDx����tE�8���������j	��-*�3�����Ok��rq��}s�����"��z=:(%�4Z*.4c�C��,����rI&��kcH` ��k�����[������z���i�zEwCaC� �2j���_�L��H�B{�u�G��R?k���kC����3����C��!GGGS�z;;uisU��	���&�&w��0�����g@5�zme����T4�P[}���HhA�e�"��1��$��Hm�7�;����A�x�a���f���8F��&/�L/��&���l����-�x�1�k	�����B���������]�\�-��������	DjkkQ
������X�b�>��7�4�HsF�����j��*���+m��;n�q�O�.��

�|�����(�B�j���3RRF���cV�:�����:�������*i� �j�{���*����C�7���]�R��m�q[8�/Z��mC�5{�����[��ss/�P����:��O��:�T�_�CV����};y]L2x��##�E�F�o�U�4K,A!M����A�������N[Bc���[!�Lx�?�lb�����'OJ"��K\�g����h����u2�ko��C��hh��+k��n1)�� }z�l�sB�d�8��o"�i">�c��!\���y�|����-h�&�����M
�$S6��x������).��_6�6�,{�?$z=������>�<����XK��K���9�[�|p�����\�y^���
��G�� �+�,����q����
���?�aNy�V
��t�E)3f~��������~��&66�!�e��x�n����h������Zh��9-g�\t����aL�?��k�{�����1�WV�;�[!��GK�K���@����.K�AUDD���mP�el+|�����>;��6F}�p���-����C����=-u����������EA�g�TU��%wL�$���qh%@�d[���wS����v!�V�
/Jn?3[�N�>*-��>�D��O��P�~r�
�������%aS���_��P*\�l���z'�������AfB
���U���-O��������������i�j[Z�GDdbK�"2�L"��<lQ��A���d������D�y"2!2�����[����������	������Z�����RU
n����+�
��nsZ����S�j�5�%�������s�e0���oo��y�Z�54�r��T���l�p���D{=�����y��D�<��I�r�"����+��<[
nA#(�m��5Q��u��=����f�K�B[�r�c�fI:O�{�f�T��/���v�W���r��	/L�w��j��D0���!��}S�q�M7�B��k>�P���$uHb�z-�4�e��l6�I�5 �a��������m�r�^�CS!<|��D����^���M�.�
�u��D���+���NN���@;�k�Y#��������eV��5k����H/;",���Zx�}v.����w�<q�IYq%*a��^��Q:8L�@��	5���x$-O2�
�P�-���L�!�%���!)���!G�bBll,s6���s�3?g��4�
kEu��/_�kG�>��H���T@�h_����b�@�v�8�t��M��=9y��_%�M�Wg�������K#�ygc���T����R�+Q{�#8r��Pc���Q��������������9�Cz��%w��Q?Zy::7

Si��\����) ���>[�[�����xi���	�2SG��0�@Y.*�G���+��z�W`���x��n����5����\s}�pD�Q`L=�����z0���f���ry��I�*�������'1@�������%�j�O���B�j����mJ1D�������}}�vrbbb�b9xKX&H	B"����+Q�YTM^h��"$<��c�p�6mB����j��K��l.��8I��������
��{�Sd�Mg>s���59���Z�Q(v���"�Cy��u��[HHJ��(�o��I�����o�%�:�a x�d�x�K�B5ckv���'I]WA.*�}+���uW�;!������(�6�l�^)����
/���8H@BI)�����g��TVY��jv���&��+�|l�+.����]�c�j_5�t`XGu,�~J���}�B����� ��QZ��8H�m�A�H���#S�CFF-��`�x��g�T)���
=|�pN�������5���+G}�Q)!�\p]9H��_�� a��W���J�>7t�ChF�Q�AW�sG���
�����g�������
����Vk=Q�/�A��=������\�������^+(h"�jU<����H�F��]tx�������n�z?�]F���V���,x����������E�8{�,��)u��O_e����H�;��?��X�M{�=,�Y�����m����J���(AY
��Hj0���6��$aQ��tOj����EH��\4�z!�Ya��x���`��u��S����T�`�&���������Pu��JAA��jjf���GV���I�����x��#��n�w������E�c�S_��A
Y�������?m	���"��t�cw=�duz�s�Ni�����~�����(<�x�)��7��P�]��n��s�!&&����]G���N��)���M��Nk��+�R�;�=�����n#���rb#�?q""��"J���Pw.�����i����II*k8����-`�D���J
��`v!eF�ufFF�������f��E������"H>%����W.�8/tD��]qKZ�C���n���o(��������)��\E��u��
����s���n���g��H�7A{v�qQg}5�u���������7��08f��-H`�����ijq�z������t<�x������w�l���#�����-\��v��%��e�9%��cD���x�**'KmB����S��@G�.*xx�c����7`0��A��?���l+�\��o� %U=���D�Gju�-|���4�h��@��S���*DE�<�7
O����A� �7Yu��B����[X��#�5	�SS8?�|\�����d"��
[�sH�����E����A�]X�v�?�@�A3���E�s6�p3JC�6�ZP����Q�4���/�rI �a�:r3�?o��b�2�>��@Q�K��$�!���L'��|%�_��+��<�y���@��x%����:d?�+����/r��0�^&��C���{3��FtA�u����f=q������w�������w��G�����.tz�
p�(�h��G�v��'���F�_�.RiOf�G�i����zzL
�����PW{x}c�����{$��J��;<l_�����!�-�|�����;g�T������;���1��1����)�9���-������b}�l�:a>m����� ��f�Z��VH/��h��{�K��R�|o�Y��-DF������n�0����
{���$���u����������J!a�"j��-���Mq ��]�DW��O��;A}^�������^�-^��M�C��@����t�t��jss�z7��75��}��q�	ET����
�<�����V<w
�K�YB�g�_;��_��-pi�%�%��X*��H��
��;F�+3�{���l���+2k�������m�1U��J�����9�10�^������!Jc���{�����,ng�8�h���F2��V��;$��k��Z�c�~-��	����������*������It����_����V.�r�V��2`6)R��"F�7l��EG?��D�n�$��J�=�T�5W_����}���L���M����S������ lwr���q��� u��f�@[8��:h��W���u���V�T%�@o�,���1Z����$�T��u���+2��W��^�AD������w�^WX_81�J������	<_��J�	=E�����.C����`��g4�/��y������+r����*�%�K$FD�O@~�]]���N�4�Ck�9�a6�9�+Cr���Z@�^W�cg^)�#�R��p>��^��M�H��O��5�Jo��}v�o��Y�a�����0�(���|v�7iz�z=�X�kq<����������vG~pv){s�FG�����~���1/����"Y
��_�~�X�����s�{d���T�\��z�n�M��T�3��N���j�xSmf�|#�R�"�iAaa	,
�(��Q=0��5�������)�����B]�����y����,)^y�8�[�����"!���z?��Ch�9�n��]�_�9���G�>���������u�jI9��^�J�����������5��
�M�X���S��9����w���R0�������N�}#���I����z
^�O_\R�n�&#���kiKyzz6���<�Z���<��v���c�0V"��\������_�x�%�B�[9����7y:��/����]Z-0h�<@'�l��=�'#33��|
D�#�����\}CK�f���DM�������o_�p�����Rf6�����1��(i���H������?��D" ��W�^���a�Yz�
Hf"�2�
��N���2B;]]]M������E���U��A"00�A��\�=
W�n��P�kDD�?�0���[\\\S9�!�O���)�����;���J��+Jd(h�^��������cv	�y�U5�j��j�l��I��,���:j�w��;�f�I$���>}�/��������Nf�kS���cQ�M���/g���M����=��V��m��(;	�j#��5���`�6t�R��Q�N1NK�EYUU�8jIp��bfrpsD�oE��u7+��I���0s��'�u�9�m��[��Ic����`�����7�P�p�{j����Ka_�������)]#�/���n���V/F=Z����K/��|���?J�X[������l�q�6/�7��F{��EogD'.P\����I��J��3g����R����u4o[?���8�)���Pf�Ua�L��;$������_�i�;���+^�p�F�^�2}���{z�{[P�A3-,��3��#i����*��g�6��4	y�#��'/N��k�}Qr;0
���	����*3�g��S��<���TTm:�U����{2���f�Y��H��a�L����a���m�����kon�M��?���%�|�n����|�����.��"\�A�5G
F<��M�8�D��a���4U��nb+@�k*�������a!���M��ta�OY_yf9�|/����#_�W=��9�'r�j��������_H7��w�.������i"	$(�@�|�fe�)5
u���D>��/�K[wz��;qzzz������S#t�C�#����d�F�P����(��)�'���a���^V^��z����\wv6i�"�D�D���FjN������8��-���B5����n�~��������Dzu�����d����I�;��EMh6I���6�b�e%7��J`�FT�c[���?2j�h5%�"���?_���|��Yy�4���
���;�6�O�c'�VA���tH��� n�n�pQ��$��e���`�g<��T~��n������|}fy��?����IrN]&Vb��)�@Z����Q&�~�����nh�R�p��fqq�����@4��Q����GiwE���o�X��v1�%.^��IX���(�-�cU�
�vL���=?���xz�������ZF�5���u���W��
��vS)�K�Vm�����5��G�u<�`����%�v��Q�3��I�t���t�[��H^%&�$r�$���p���
��q�(k�h��FjT@�~s\�������B�~kW
��d(�\2Tu/�P(���mp��I�����_���&��~�J�'Or���.^���5�kY�%����J���f��T�$��;*$q���s�I�L��J�{������S����&���oo��G95�:��w@��; ��|X�m��z��{�+����oi����c�"elP����r)T�hf�$��<|�����X�k��<���r��G�h��60q�!�����P`�L1PNE+Z����%X�����J����I���Z�Du���������3��O�NMNf������BNN��7xY_���)��zzP�������R���IE��	����e���,x|	-�u��{b��:��NS������n�|���U'	`f�L4*�LG

t`U� ��������e��h/[��(JC�[h��e�����v�T���"���=s]wW������pF�} �@$�R}�%*s|�t��`�~�C��8h��Zs$�f�2���_T%����,8p0���:6j5/,�dU�����4�c�ED$��������r�����S�}���p
�M���7����PX��I#L*b�zfb+�~nA`���7x�n�^�m58��0��
��d?�����C�(� ��}�.BC'�������"C2N�7��dU�H���)��U~�/���<y'�h�l���X��=�����7zB0M�&�� &�=X�	�tK�zf�"$UP�y >��C�����	�#<�l�������z�������]nn����������G%��\8�zF���B��s�+x|�~�3:p���Q������������{:�b��'�2a��P�O���@!P�J�U�#
�?n}������A�xII-!!!dK�t�!��G:������
}�S�f�5�[���VY���i4Z��:uJ/[@h��@��k`�VZ:��&���
��I������D����������q�mUo[r55�*A������<��7�WQ���[�cS��(pz�����%��f�zPR������WrM������.F����t>�(3�Q&Az������
����24P/�	�ti��s?C)St��^[�gX���Fy�c��a(��t���d������A�r��h�������M�]��H�����Y��|���4�&:Pd� t�W*f�_�m�g}t�U���;{ty%���>��������j��=C�5�F�<����bPf������4\1�������~���B-Rk��2����H�d#f���IH��������m�a�=:N\
���e��!p���_	�C�����;��/�vmBG�	"�`�he�������U�}g[��v��ES�d8G�~����P�� ��BI���+qu�F� v��|y���y
����CR��q���:H

r,��G��]7A>�W4���S���m!no���G� r�3��B2�����F���c����vb0����HW�k@�H�\�I�	��/��*?�~���B�B��rm��i��n`w�-�X����oF�����s^=x��)��V��K�G�B�����D��E��C��(9t�TT7�����zb�[P�F��M� ��<*j�p�)*��:�8���2L3E{�*���-[V�JF�������O�p��w|���vDOp3��lADj��j��q�0N�"4hk�?�*Z0�#�9?�=���Z���DG��C��3�M���5�#?���^�|yC��Z"|t��Q�����H�
H�,$��X������Tcy�X.9�-R���+�2�(Mg>���:)��-Z���%^E�������>�f���
��5�p���7�/D�y��E)�?����W�hE�����-��<���*�!S`��t���������.#��%fIy�����L�.�������!.7�|�Am���7�:~^���&����o������u~r[��@����o]]W����GM�J��WV��a�(?�GB�N���]�d�
����Sq0��'��gf�<��,���R����{������$�Q=��J���a����V��tU�>��y��sh��C����y�s��)&U
����p���`-�01�r��Vi��M�gG���5��<F���4�|��o+{�Mze��y�_%qj���=/:j�������������G�<{�������2Xs�L�������1���������
::�u���^US��c���>��JPD�!��A`F����U����4��N�(�S��W�^E{��u��P�c�N�+�?������#]�������y2�
�L�Q�r�v]����l�"�f�����n�M��?��!��:�N��(/��.nA���f5�Dz��]a
��[�x�C��m�-��9�?���N!�G�����������W)��1R_yD��:������}���(�|����/N�psa��O��A<������0���Z���s�\��k��&F�"��XTy����� Dj�F)\���:^�#�^:�h�����|}�k�<1%�:����]��#a��}b+�3�`���H�?��&��aD���.�pvXX�C���������Z�i�����|����0��EDX���������3����������sg��$���\�!\���z�R���������+Z_��<����9&��7��?7�������� �r�����w	
�\��)���������4�����.�P�F�FSWZ�Y��mW����_4���C�����K�6��\s�U�6�U{K�p�pA`!�I��j���_����9�n�VazU����%�,��?~I�7���X\l�W��^j���x��pn���y6�q���;l3��(�$��Z���SS0��T)�?]��bM��d}���@���"N����Ao	���&P��!
�=���~��<����z���!���h�&C����^'�b���pu���Eca�����k$MvU
�oi������g����P�	9��\�>�m�9�c�4�z�L0b�6���D����[������&��:��:\���[n\Z����	���G�@�g���Y��V5n�K���_6��c	��0�zL�����DZ���,|Lu�Vb�8�M�c��J��^)x-HZ����/K6�u8SD,��i1f����I�6�]t.i.,��K��:���^f~}���j�
�W������O)w`��q\s���Iw`���R/!�DZ��+?*���y�B�c�;��Kn��X�V���7\m=9����I,r^���U3�����Nt� o�iN.������6�������6�Wx�WO�t��o
�0�wZ�T���t�����`��TeY���?o����t�����������b���z}�3������T�k���	�a�nm6�q��;�������,����"T���f��x\���i��+�f�$��p7g&���M1���	7u�|�2v#dC���M!74D9���>_���Uh�*$�7���>L��q��%���i}���J����/F{�G�S�3���Q��9uNY����$���y��?��5C2s!dn�/����e�u�3�%`qvM-��;H��R�E�v���x �'L�>��!�)Iy>[V�u1�\�����/���)q�MC����	��=����1����X����s��M�$4��f�?V����V��cu.�U���<�|�,/�83U���kH�x���_����S�|���rHi������H�����/�v:��'����X`
|����_���
@3�����m�<tR�&a��G�W�MeRL=�#m�_&U|m�]��w ���&O;6l��\�qF����������n�pg���m�|�x���iC�@B���MOm��7��t-ER����w������{5&���;����vP���e�����B�S���wT_
�N������\`M����u\�6�UW��b�{t����C6/��e������Tn�k��5�B�����-�������=����pTu�
�Y#o��2~�H���"G����+�vm8���w0�����:�����������c5R�o�x
*��W��9i}��x���z��H�~��mS��S/�:����`�M^/�KL��6T�����>�F� _M_@�B6&����Tv���z������K=���E��1������
�=���g�
f��0�&��i�`���={-x�t���f��=Z�N)�)�Ti�����I&�8��g��
\���cn�g�X8��p���d��T���)S�Z�^Y������B��H�^K���vMe���)`��S���/d6�-\�8�dk��
���P-%�:�13�w���6�����h*�`���A��k�~���t��s�K.�ajf��yV~�6~�d�)�#se���U��ny��x����m��<6���Y5�"���2:��B���G�x�����4��/
T��Q��{w��"��r�/4�&'�n�j���;c�E�b���R~��]�`�nO9�=��[sl��	����$��m��pq�}����� >7�=�Zc3��r�,��[Tu
�{���V>5f-x���
Am��6d.����N&�o�#6]W�����CU������'y�p30q�OP�Y����9*�T{�)��<�@�H���r_f3c*V1?4�4���P�|Iz9��� �X.�lE0l.]^��pc��:.i��,--���)\����2�~�sb�|��5��dN{z*`��T�}������(y)e��
�f�Xk`���g��������;��r�N:���{��4
�$v�Q��\"��$?P�S�c~h���q������4.-QZ����=��-�n`��-���D�O('���'��Z�����"5)�U�r�B"��<�d tFg�qwDj�6L3�g��x?�5��9��_F;b�����P*��Z�+�����Y�$���Z����(>���B+��Yw�!�����N\�O�[�G~',�xx����8���}�h����L1�o�0���/��n���<�J��0�p��=��������.1H���Nj,-������c��!�wa�(n���f	R�����������Cfo~]{��R�f��^�\Ijk��iJ��)�"z��|��>��������d�L�HN>g$?��8(��N�E���f3W���XSsy�s��T&1Fln��
s#��q�#�mO�& `�5�.v[?���3�-���x���������$��0*���:������W$�`���f�����K���2��S*��F��n��I�Y=�T�6�{S�q
3��u'�j�s!r:9��L��9�Cj�TT��������]N>�N���3���2�<�l����#y��2�.��?<�����;_?�]�;zA��#y��j���3���:Z~Q�)�����S��(�G���n�)
+���	1�,���y�^�����_�gXbEai�����i�$\�N�=}��g��L-"r��~Oj���{bt;��
HU�_Z���L�[��Ws;��F:r��T���:d�������i
F���vh�#��bK�w�@��[��0tW^��aG����X�Uu��ef0��Q.Y>��?�[��$�v	��W��*C�\D���?�)�\;xr������w��=z�\���$�N�����������7�J��e�����a�ZE��#���<���ry���(���{�<F,7���-�����<�xv_�jo�j=��|�b��CZ������L(��D�8D���8��C��C7[j� �JG�����T�l����/����333����k/�(��Cb�/B>���}G\��;M��j��^��EQqFx?���A��J������-�eg�[��Xy��������!��Pb| �R�������� ���X_�*����F��m��)��5��A^�<
pF�3�����&�{�����v�}k��j��K�4����� m�<��;�18�����y������b����N	��)du���rff����^s�
v|y?��6�����Zn>S�c����9����]�R���qk
��Z��x
�i5���Kv�vU(q����Y!,'�
�2�]0�JDi�������+G���h��
�He�������/w	N���ii$7�u��������\E/ea3����O�=]T������_f�T�o	���}�Ju�:�g���EQg�; >z5�w�������KQ����q�X��vM���#Qr}$����j���0s��Q�l�kV����2	��0|{?��
1n�X�W�O�L�o��/��"��~&�w]��{EO��B��[[]�|.��&���N���Q���X��^�.��z%��v�{��D��'��9�dV�zu2�����BkZ�m_�x���m�5Q)���H�f����6�����g��g�z��f��o&�X��p������c�}z�����-�K+O1d�5�ock�G���J����9��N�.k���\#r���9 ,���*O�K��X���y��w���6j���N��&~�>��'=f7���|L��N�9?

��U��6�y���;�
7$T��q�j��y�����{~��L����N��9��i���`���������@��YE�B���T}	�w����B�~���AO���/��C������0=��Y������hB�^�����3�;zF��y*����r�/W[�����K�\������	�9��R
w*��|�rd�����������������o�Kx~	�����LN{k��A�L�]������j%�M�]=��w�>8�e`�G�x�,p\�[y�qvJ���?���&#��_����r��T��r�����D.<I�����������u/��97�� ��x��Of�em��l�<���3�#|�5��X��Q=�]����
��;�V�X�b���3g�>�d~�7�<��9��LbC:��`<�]y�%�od��q�^��'���18���?�`Q��� �"�P��b��!�����a�w�{x�?��w-��h��M�B �z��|�Ew�N�|��l����<�wG��W�D�4vc5�R��>�<Xo����v����]����� �>gB��l�=���/�82����8�����]/'u��U��#h
E$_0{�����=��k�������?&A:��*r��9�0�����
����D��r��]8����YF2]0���$BLS�c���R�A���L�	T�����2I�>��_���.���Gwj��u�gd������w���W������/��w�O�>�@n"DZ[Z��g;��@��,^-�1���o�����b^�L	B9���]-E+�����T�
s�8"�������6,�e$������������2���R���1F�~p�������/��(dx��������S]L�|��u+L$������.%�)��?n�[����{>�A���k��x>��*��2�Z�7wG}�xv(�a!��qG����q���'�u���Gf�/�z��g�����5:��w��d��?�tV�3y�EFE�3L��������}��iXe@n2�>��_�Vi���C'���,6����[�����<~t�8P�����6n��z�5:�G��P�r_�i�gQ�`���Sgi������G:z��J��at���7n�]���l��;����lr'�K�-Z$$*�����d����w^��P�,[NF:C��"�������W��)��"*��3x{��6�	&ok��}'��F��z������Ht����Og���d������IM:)��q������������R��W�J���t��d��$�F'n���t?��;�)j+O�se�c�����5���}���{���9w�Q�;]��yl�$�j����������1M�[E_9�<�/t�&����
Vw���R�	�92�C�P�E.	���X?�R�������V��� �����\������
��"�|�AV��n�q?�W��
=z('�z�D����{F[�i#��zZ+�x�k���v������O�����R���=s|������G�*���w{��9��X�������V�������_W���r����w��G�,*o��O�`F0����_"�$2O�D�,%���X��T�s
���yP����*��b�����/������I+3���.(;��E��g��A���4��^&91+b����eVE;�B�n7��DoJ-�s�F�5�^7��Y�-S�AX�u��,�K���&��Bf3.����@&�������`��F�<v:��.�{�6����c���7E�yE&c]c�X�?��Y�w�������X��f�xy�����E����'>>�b������&���^�n�E�'�V�"J�����[�j��U9�9o��=���?	�����-���w���#k������
\.Wh��a�wb\��������/�V+�=������d`�n�}�A�@���L-�����������J��2�-�6b3<G_v~R�G��.K>��e�qJ�2^&DK2�MH�p��w��:2���w�p�N�m���@��0����.g��+�R�����$Y����D^����������)v}���?�n�B���|wFYM���Tc�)*�E�(O��K'��I�gp����!�y R�A�m*���e�����0R�����5,/�d3-^�{�7i>'��|h���'�'y���H�p���k�5�n���,
CD@�E8��.f�.����j���	��Z���G��c�����k��k�������R�,�k��
Y��9	��
i��ZE ��7����K�r;���������t�r����JK��0E��5rX��/K@fI�����}��������������A�61n���r���.VQ��I���Hs��1��,�b�k��dhfP�Z�0�lc���6t^s����Ht���9��yMX��1���s��d���������J�� ��8����c��lL�>�h�Oj^j4���!io��y�� �^��������T*�����������I���*�=�f� �F�<�H�_$6���m�"a�
o�mA��U��AP_,������<�]��+�kk|�`l�M��as�!s/G)b�u�)g���t l$I'I=y�+�
v�?o��n�,C�x�Rd��2����x����>���NiUN�����V6��Pq��WK�1s��������.���<'d�S-,�o��W�����g;`	����$��/rp��0E��qcl��f���-jX1��26Z~���vs�����~"X�Bm�F���{�+���~����b���h�v����(�f�����<7[=�2�S�j�%6�����4~���*��OZa��7'I����X���5Y�&B�
�qnHV���D��E��Mi�Q>�By���p��}�Bf�SO��J��;J�������l�����~�7�s������*y0�f7'�\2jB��c9�-�.�H!QbUW�!��cf0[[]jL|Y��[�-H�I��u���L��$��8U��T���30
�V���.Y�d��J4x����Zl�?����oJr��M�W�S���+%�Y�(v�{�6&�q[�,���u_��#%E2da��'���W.Y�<��[��)7�&j-����W�v-ywzm�r�V�9u��K�#�Dgj�F<�8��L�R2E�g��)����7���F:����]:�)n����q�<d�U�����D��o9z�'�~���Y�$���^�bT�3G$�_3�������Ve~�=>��%���a��t�c�E!q�D*��/5Q��/�9��G@MX���)����!�^r�-5�~���a��K!n�����m���n�'����|���S����e��mp���R�\���i��Z��n���s��s�GLB?f��}��f,�[^_�q���uZ�����&c��)F;�.o��TmK����w2��w�����D�Yu�~���0+]�����NDD$����}��f�
v��E]�(����H;~j�6��b|9�W�����=N�p�EmOgy����d�1n�K��������
S!�KB�
����a������R:r](����LFK�BT��x�g�l��<�Zli�/\h��Z�c��,	��������G:��n��DEG��"�
H$)�g
$�����s}�%���,_&�%W���(��:(�4v��
<3,��|���J��Rg��"-������X'$4�fT��S����<Q����\d0�t9�t��w��=S�E8����/!i��bg�.�/%`��s_���������(vXQ�63���q��Q�!~u��!x����%���Il~X���"�<V��MX�l���.��
�HU���L���p�cj��z��Q[�UyxZZ������������}X$Y�jN3�8�����*�AW����I#�4�7�7��]#/� �J�M��&~��:Q"�?�3!;��4���(g���Q�0]�d���a�g�n�C��W��|�����bq�PmuIz#3d���IB��8�f����,�p���b���*U�rR���N��.J�g'�
��M�����fz��wF���
n�f�y�#�������g�&�.�R��I��f��	v�i�o5�����
��w�����(����C�:�sLa�C������u6����u�*]���S�4����|��Ae(��{���s:�������Z�[W%��a~�[��k�}�y�x�c�P�
�%�Z�V����[�8.N� �7�>(
m�����fz3I���z���}m�n���qer(
p�]����	��"�R��D�;USP��sz1��5�jZ?�o�����%t�J��y�a�fy��O�h��gL���:����&L����"J#`�
PZ����v�n�klp~���m��K�8tQ�WF��.��zwT�V��g\X���Px�iD��Q����KB���'��������k�b�����w4v�[���}-}�#O,�p���C�
b��'���[H�)����Px����xk��o����{d��!�_q���@[�!�)��%Z0���+����t���8;O���l�.�,x�;����D�������n���J��H��|����Q�����6c�T'|g��]NQk��WS������5O"u�_~�Q ���1��
�|v����<�E�;gW��o������������-)����J�,"�S��:�j���E���b
����
v	�Z�I�������*�����:i��qA�(���Q�n�kW�:sf��������O�7�.)����;N�-k����������������&������	L�l`��H�z��7s��$������0b�\������OE�
�I�^���0�L�	c�K��GJD~/�*5�����R'W��!�����NC��3B���������g���<O�y���R�+/��O���:��PA"f�S��4��\0���,N�G���R��v��N�U��Q������fT���:X������![�����r�B�4," ~E�T�����\�n��aqxQ]���1�������b��Qq)T���#��-[��ptc��GZ�����ytr,���f_���Gz�^�~����~�e�S+��4�A
����ip�{���7���M����Q{5��2,��[DU	e�!y0Z�>�����xd�8v^�
.���
�)�L��#����)d8Db�����"`	������;�D���7��:���������J;�	c�A�Tv�R)�����^�<����j_k3v�A��P��c�l�TTzT������@�-��T`��(g��T�j���clTz���D�G?e~4����8p� ��y�#Q�����i�={�#���=
'�Z���-a�����b��62��?����#������X�{��*_��X���Z��VR������7�'�n��w���.?'�Wq�e^15�8����Li�Q.b~�92�\9n���s�9KZI�6J�DU=����Sk��s�Y�WU.�x���
~<yT���Q:I������f4���=�7��.=�Jx;�Ui
�m������t�VRR���\���6J	`���W�����YFZ����={���LZb��xY���G����o�|�kI�
�3�EfT5�j�,����T�s]?���C���w���|��p}��#o���,�`X�1�/�N���iR�X.��;����wS��z�8p��z�s�NO��K-��w�5�U�|tH���_]��B����f���'����e|#��>i��RI�wo���[Q&�G'�	��Y����������!��N~6��t����@<N8�����B�
t���3[o7}���v!�)����':T����������.��8�p��w^��_!�3��;�B�Cg���T.+��,a�>�BOpt�D���@KN\�;2�h!�={7n�0�~�-���y��Gl��x����M���O�vl��O���"3|�q���t;��,�B���
k�|�_�L=n8{��{8�������)��Y��������|2�|p�r��./&���������|����V{`�����Hn��-��d��<K��W���2K�������Z~�z������f��Sb�s�G��u�G��I��J���b��P�����/��lI]�������������>�z[�a��������t��wA4��
`r���_��Rw�t����4�������_�HB��X||<�PTT4x�������4T��)q)��B��RmrPz`��*���6_��Y�B��)���-BO�*�{6X����������]�Tu6�t�n����*�h�%['2��!D$�-��w&t��jv�����u������|������q�LbS�<�qnGf!>n��6&�n����q,E{]�f!/��t����ni	��~��j��+~����o>�,
���2�
1�����������m��P.���f���V�JE��Q\>3���JU*J����\Wn���jO?19�w��'��]s�����GB�8�_z~��Km~������*�T��*g3���k�j�/5�hN�������AW��������,�[p�OuuV��;�������Gq/m�CU����S����-e���	t9�bR'9�0
�C���oT��_ �1�����s���9�"/��������o���$�O�������+�W�&t����
;�v����w����5]`�q�K!���d_�wV�7_�����:��=�����9��Q��U��v�pg�!f�����|��8]���|c����:���������E���1�.uY8^E�CG$��M�6			E~���C|�����V1=�o
$Q�LQ��z7d���	6�i�}z��V�y����������Q�q��:�)�B�7�����>0L!��m���u�4�8��Ti�_�
�
_Us�Rs{��r����
�@>RI�C[�� ��W�b\i^M��/4���9�O��W����I�wJ��o���B��������%x��u�ND���/��g��p���SLiT*�]� ���v��\��7���
����G���7�7���%��I��
I�BSA�_
�K���H��#������S&��V#�W��G�T��A^���]LT�"��+���_r�O�jQ>�~}q����L&�AMm����+���ti,���Cd �V�TjO�S8�:ahgq�a]����N>�y��Fo�����O��.�J�!��zS�GR��G�e:��
a�~":u�$>
��7�����/���6�z/6q�>��H�Xh���!����*����#�\>��.�xl�t�D�x�dSk&fK����#!�]7��K�c������#&��?\'�Z������S�=�[���F���%���PNJ1W}3�h=M��]��]��#�X(�2�ZZOQ����U����	�����n4[f��mH�A7�����U5��'j	~��`��T(��9��S��"U,j���zM���w��}U�u�H��*���]�^�WC�$>���3E?��iL�Gth	�'�>���~�u`�#?c`�f���k�E����mH�<MS��h��y�:R��N����W�N���]s��d��p��4�eRscRH�_�U�2�	3�L���0u�!�gX"��G��s,�xY�]^�I������2D<���&R�Hg����������i��c���[�fj�P'�tf������u�X�����I�
�H�e����*�V+AY���U`+��)���|��
$`�b���B�Ee�6�
I L��j��J���8#��v�>��������v�/M���D��*�puN�Nn�=��gwM����V�WdD�cN/������	)���Q���a!~�,#!`+��^�����(�	���#�4�9�hfhv3��������^���;�.V��&[N5����u|)i��,��{��&��}���[�rZ[7����������".�E@@@�%
a	KRk�c�� �iQP�]���"kQ��=�!���=j%�m��������q�$<y��g������*���@���&������A�5�:}J�y@����E��N��e��� 0k��&�x�U�����*en9��`c ���]�1��Ej�<���������	�$���*�RP���S�����\���5%W���P%9�
��-2���`����:�J���-&VS�>��k	��^��Z�\,1�:�����n}s!S.2��>������~��(�E����=��������_zRe�������kM��x���������9������Yn#��(��[��
����_�w�Y%o���������w�={s��-���N����e���Z�`�������z"��f��F��V�����$�����>�\t;�Ul{��2��?�����<�o/�5�;����w����pA$�p�W
.Mw���H%��P��������A�mQ�������U �911�Q����d���XQ>����;�����oR�g8]�$����5�z���M3��o��'wZ"7�w ����"U�����D�D��M=c �a7XN
&��LE�����%�������;]�^�����.���h���m2�h#��8F�N��H�������C�
e��Tikjw_R��HZ[[�F����}
C�	%Fv/��������������5(��sX�Y��3��gh�|�>�l�6��ER�7=F�0%	��TE�k �����M���M���YMv�c�U���	�D�����A�/��x�{����X�06���D������l	�3��"`��=�O������~�z"y7�224�i �1�?���^�B���/����@��->�d'�`C�2FW������g������"��j������%y�����w@�*y��M�&
2|����9��p�XP����A�4_:Hd�[�6���w�2�������CI����^��-����16����E����tN�No��	���u��Yj�~}s��S��4�����[.z�O��u�������*�4��;����,���ar��*�
���1qLZ?���^42L_�y������{�'�������6�'uM��������C����A�����1}TC��t�E4�&������jc;AHx�y/���RsRQ{-]��K�^~���d{W&x���������F�{�UC����{���S�{#���7:%(�����!z�}�
����b
�Mt�������.G:��h���}d�i�>��>�o�u�_�n���M���~HZ�/�On�-����)N\��������gZ�����a���-|�eBTa5�����|��a����a�>[��e(�{�^�:���A^UT��`=����GO��X���WH&���|.�1�(�K\�����Eh������-]��g�A����z�l:���+��1�dW�W,�*��hZ�������L	�
�R^���oWm�sW%[����m����R�t0R	$��S\({�H��l<��m��(AYq����y���nl:M)v,3��m�(hP�yZ��`�L�v�Z���$K����B�����X��;*��#!z�]��=��Q��T�����u�o`_���X�W{��mY(K�H��;^��a���`������b.�L���LW� Q�����c���-q8��v�m'5w�~�����2������
Z��r}�/�5�Te=F�xd� ���dS`�Y�r���D�[��@�V-=���1%z����QC�,^��U�[�
��E���@\T�\bpU��$^9����c�56��lH���{KF�e�N�{�k`{@�2N���!y���[�N��Txy#���:�~\4FwC��6��'���:��	{M�x�r��X��������X�3�hP����S��*B8�~���`����
��+��3�Kg���F�r��f�(�c�xJ1�����)J
+�+����Q��@�<���� �_�x���c]Y�����o�����}C�<���p��D�Hs� �j�VU�������/9���p�d�0�e(�_T�Q��* �f��e-�(��n���x��-W8�Dl�tn�>	Q��R+`:=�������L���4���qf!���.,�0��e��n������|�*�� ��B��2Wt9������>����	>�3F��M_��5/]�����9H��?����R>T�3a�U���+���+.3�p�K�QP��'6%g�H$�����o�=�F.rs��j�v�Yh8���l������1�/��pZ����qg�=�s�U�G��K�3�}YA��\/��%ovA��b���YpU4:������w��94/���� X3�	F���Z�{�1xt7�����Ec���O,p��`X�W^�Ub���B��9�����1��AA$���.d����M��@]5��������^��s�����F�Y���!�������y������&���I#���G�ii������:������M�h� p�5��;R[��8�n�^�f)�t���T��aS��A��~�'Y�l~1�����/�������&t����%�����t�����j�m�xQ�0�Y���7R��t>�i��7��)-����'�����8����7$!K�@�y�T�����Qjr|Ec����Ocy��{w��k�Oc��v6�'�Q��.<9���WID��T)t���ywuSw���^@���N�p.2�
[���x?�%W~�^�|�%�����S��;�����h�?���;�\[��ZFa��-o{ -������zM�N���>W���d��F�MC>X��R�����UC^���U{��b��=����A}���6!U��Ne�����mZ�^��_����i�����f��V=e���J
M��B�������>�MQ�9���@�1-R?67������"�������WS9�����{���be�$sL�"1K/2�kh�5L�)Pb�w��}����!��U��$��d��!��@�8���i���Y����F�5lHN�����z�����d�~�x�P2��^y�6'F?��)d�c��h��@��B��z������}6��'��XWb&������*�L8����;��C�{�T��
���[������j�d'~�(P�u!%�����7�O��a��(���������s���S1e��0��v��c�{jwuj�M"�"���K�����J�u���B:���NA�8�x�d!�q�����D�F[PZ���G	X�e��i�{0�7-k�q��#�=�hY�������i��������7SE�&|Y,!��So����!�S_t�����_/��T�=�����I����u��������O*O�A�3����.�}��4�!6�y��}|m�I�8�f-���'�������]DA�#���g�;������ke���kt��c>+��v����[��|����N�����G��=L�+�\��W�����s�������������mQy�5����?K� �$8�jeP��)�j|���>���h�1��Z�_���d%��@��5P�mv�d>.V�p�����r���+,Ch:�D?��p�.G\���[F*�9����Q�������U�.�������&��zS���~���#�uN��<��rRO�8�������^�;Q
L��nj��k��g����k_�E�1FpM�.M=�-*G'�=)�0�I(6�W|dj�E&���=�������g�Z���}
X�0���;$_T��-A%<�k�<g�Yml�R	��k[����e��Z��V���-�Dk:�>�h�I����2�:~R�V���8�����U����q&�z&��T$�%����e!i��2��''h��{p�V�`�M|������s�������+-K����a�a���`��:}4�6Ym?/r	�m�����2���y|i���n
*9���'�	'Z%�����p�0�Dw�.#��b��
��X{r��7��4����	\������[>0XW���wW3J!���G
d����W|Vt	��o7:5������|�-!\�?��W7�����t��.���p��A��*� ��V�C���\��r������*���`��4��s�%�GZF�����z
��#f]���P����V-cHY��_5(�?�D��1"\�n9������0[+g`�B��_q
��>�42(��~���+���
���Ru�����D�/���p;��K�(o��������(����+�d|��(�JU]VL?���`��;��D�;
,�n�T����p�1���
;j���X\X���l��+��s����
���{���Z�������������N�:z�i|����v�d���M�f��l�����>�����(�����R��<���^��:i��W��Z�j9cl���7z��rde��y��HP��Z�Dka�g�O��D��Vh���{�Q��[(��=�o�JE��^�b_4��Lr�>���vM�q���D.�>��
l�A�6lP����
��}{�HM��U[����M�����p�����7T]]o�Q����pJhX�b����Dm0�/��<�q������8���E@��P6������a�>�J���:���1�Z�xxGPh5&�#!�w�t;O}?��x�������2)�0�W���L[&�g�?��C0�jrf�lg�+N}7�CP��^e���z
HF�&��������5���)����U�6������B�� ��j�n>�?4��l�/���tEt��u��j8�
����q��%}�2f�����T� ��Kh���P��?f�������jTC,���q�:���� �a9�����4�>1u��������]E�xb���SN��n��q�I?.y��l�|�Y���6K���-��{J���wU�C�����3��8���=d���W���`��A�M�r<+Aj�x�m
���LW���8�"������hw�v��B�G�4��v/�Y���by��R�f��G�i�}�5�"��9'�t���L�l8�i�E��bm�]��<e�/Rv���H�
��S���U'�o�����;�c#N�2�]������(���S�7��i�9X��w,B��?Y$���z���G���>��E�����'���G���[$N�����N���.�Q6�j��BN�'���s:u�.amk�r&��3_w�����a�7k=�/��IR��QK����c�z3__to##T����
��	[��=�O��mA���E��[R��\��~�����bE��S��U�`P�>��y��	^7���mR'��t�\��%o��_?����3�a�r��?�qAxC1p�;�gs�avhia�Kj�wBFD��g������X���6����'��O6l�%o]�i���}��I��E�S~��XS�.D>�&M�;K����h�8T������@��ar����8U�m�"�z��_x�"�t�0]��4��M�R,5�����L>�#�by�������d��W����:�P$����H������>����q����4���v0h��{�I��J�|%�3������N�%�e@�X�����\M�7 �r���o���~sa�W_�����Q�o�����P^;�e�<;��������a�k��K��`�~���|�8�?�Qh&�#�0���9������n>�e�rQ:�P��q��������6�����C���f��{[>���bY�������>[��D���*1gi>{6�����Na>��Ep52�
����.���P}�6����<��,�9�i9���"<���y�|���h�=I��"2W��|�q���o*��<�%19r|�����������*N$���(i���'�_m����[���������sb��D��;Xyz��\������f���O�m��87������rn�{��h��&h�L�Ts��t}ib|��������;]@�����5��9K*�UC���������be��G7��(*x��\�y��Y���G�g����9c����^��'�3����S���5��P�
7������bM��%#�������55���=���
�\���������w��5��Wf�}�&��z����P�.s���y,���I���Pp9���O�HY�#�z(7���\�="�����0.�nu����e����c�����t�i8����W��.��l��s���	i�bG�{�z��I;�J(M��M?���|�Kv�p���:�k���{�fl����������|��
,"�^�"D��b���H�P]X$(~ow���%u�Yr��� ����;��� �%d6�{�rA��;����p6n(I+Y�};~�_����H~�����=����/����&q�Sl�4����*h�G�P�,��`�=
�O���b����
{����>���v���ZU�,�I��D�w�����3��}����k�f����J�;��kA�jC�x��0�-�B/Vp%�k�d�/�*��t	*4���~���.�%����1:B�����G����*������lUy��\7����L���^�p��'���&yT��Lh8�	����e!�)��><3��=v+�}vV���	l��!��&��EeR7E^������rV���c�y�W�?���L��=��JMf%��<{�����2%���Ys;`�r���c�~#����G�C��[#��Os6�b�w��\[�||�6-���'|�����p���w#R�������K���r{~�����2��6�rE�gPJ`�c��eW�����)��f��a3�)�K���K� �5�a������6�k�-+��A��q�u��������s<�����A�C���lm]mg���n��;(m����aR����
��"��2�h�C;C��c<$�I:R�=�����r��D:z��>�(B3Y�v�Q�����:�%�d�:���;�7?6gN����p�q��[���MI�W�0^����$}���2a L����&%m������������]+�����5f����<�4����������u^�QE)u���w��a4�����k��w�gX��\�����=��}����u���H�7ZO���I�2'R����.��{c���������oQ�
Nx�w�����������071>�|c}�|�����:��e������4��
��;�G/�U����B[+\r��5����������7�����0{�L������y��:ro#,p���������_����������i;�iK�-++--��-������u,O�&�]zK����9�F�J:���_�����U��?�������e@29��������F~/c�+�=l�l�{Ky�:$rQ��9�D��IR��X��M�,�V�*�����sX����%%��2[�M23AI�j���6,�,���}u]����1��y���i�,��F�@F����U�'\��t�"�)�����Eu��"��$��=�k�v��l��Z����e�#fY+4�����PF��U��B�>�B���W�m�i8����)����[*��A}��!\�D0�~��)�*�81z��i���8�;\�d����XZp������j�P�[��9�����U^����T�g���i����=��
P�8�?��t�e�d���(D��:�uk�����k�,�g�6�m�]p��������8��l26:#�gMG�����(����$9]�rJ�m/[�b��"}��^�p��,V��L���C~����Cl�'�qJmSx!;�s�]�Q�����y�?��v����55����Z`�]BUa��0;���UDm�T�������!�Z^�.$��'�X'[@��1�`���t��]4L��8=�`�;������U�9w$9��Wc�V�x]�����qC���9�������I���l8����Pa��*V"�$�~,#.���;�Q/K�i����D��������s��+���Y�k��k�d��s.)\������F|�����<!93��Y�����/�O��1]����zMV�U`:5b

�<�h�+
q|_�j=a%����b�*�e�.S�j��:�X+�"��y���7��_��t�+����X���^z�`^|�vG���
������V
�+y�.Y�o���~b�{��p>J���Mw���r�{E�?0:q��V����C"!�0�$���F5r��c����7�Ftl<e}N��g� ���������O�f!g����&F�3(�	�Yc�kn�Us7E�����-t����������-���[��
?o2%�n��q�Ks�`9i�<@P�.�p�\k%��� L�-�h��!+�*��������&��������9�}
[;`���\=����F�����*��!/��6	Y��s�D��$���y�n��o���U@��nu���Q�y��XCLr��}$(�3�E�W����
#�,�
��KF���w6�D�
=��������Y�}L��7�����D{��������s6������3E�o��M�n�a�!����P�n���HE%�0Y�`����7������|���d���;x���z����%Y�k�|^wb��H)t������`��so������UM��>2�%l�����.2��5�((�L�9pX��
���+s]�:x�����R����&�-
���I�.�m���Q���������E�6�?=_�-a��[w+ylL��Q#B���y�E��_���B�/j��V`p�k��~=4[;��?�O�J^����5
�n����$g�z!6�:���V�������9���d)�?�gP�!bS%_$F����	a�va�M�����t9�����a���� ��
�������\�Be�F���E:��]S3�4�����s�$*����zA�w`��<��rG�K~r�~����P�Ao�����Y����;C��Ss
G�'�)�Gta�F�f�p�
��#��[Yp�i�����k����4��@�������6Y�B@�nO���PS6VW}�6�����&�74F@�>D����R�H+Q���>��%3r�>#�C��w*mA��2��u6���E�Q
!z����X�'i_J���K+���1�#���%K�h���U\�%Ld1a�Z/��u��	M5wh:[�_y��_���.�{]��8���2�}4��n�F�����)��d7��|�c����?�l�}<t0o��%b��o ��jtjdT��0������1��
���������=�^M�Es������ck��i�Y~I+�6KC�����;�������-�s=�{��.��Wv�H�S����@z�����T&
o
w�����lTcU���	`��5���t���n�0��D�(
�������B�����#�k�R C	{���G{�n����X�6Bh��)�}�z�g|�����g,��6�!�[��*��?A�F\] kp����k�������@a���������>���5oK�0a3.J��^y��(�,��S}����H�3��R
��RB��;�}{8����^#q6�MEi�����y����;�B}��#�b�A�^I��a����L;`� �iH��o����=�����[���mCZ��7���]�+��s��o��w��#�7I`�{�����Y����4��5$	�%h
�U�O���'�3������
���Fu��������#���7zF;u��u�#f��J�q���������zD��_���������E���	DXK���?5Pp�oU$���7ktj7e�A�'L.$dZ��_�%7��59*�D.FU���#O�@��`��;���5�xth)��VC�_=���f���|�4)�S�.|�MX5C�r��"����'�l��x�a�|�U�C.������j��P�Lf�X3�m��Fp*)������tfw$j�yA���F9��+�����D��e~�m|��P#�t���+r�"th�w0���aR1`�U���c���Z�2_�gg���dk���xT����U�'�V����i?�Gu[�}���1R�4��H�I*a���kq��=�������)�����"�:~8����v/m.u�P<����39�g����P�K���s��_6-�7���_����k4�� �/�o����n4Q
��p�):/��aM���uB��M���l�<v�����+g��;T��2<������hir��@}I5_)x�Q{�@~���
��/E��z���WIo����e�s{���8���}��D]_�����r���O<lMb�����`z��I[�^��-���d��f��R�����[D)3��������*�E�����:`jVT]��N?�����'����H)���������7�9a�
�i~��E5B��b��D�S��V�,T�8,��K��j�Z���(iU�gK����EJe�*u^��o{Pf��8�rP�����{K��5����������A�������]�c���6f��*���"D��6��;]�.�������6|d���X9�Opl����|��j��L���.3-~e�S�~�s��R���C������U�CEkw��w��R4���:�OO�5��	���z�x�����E
y1�;Z��P�r���_d���p�������JO��g�a������v%�������~=Y�������^#�������Z���~�,��I
_%q�l���U��I���F�.��A%�#2����N�JMf��4�:���5�g���V��������V���Oi��QmMe�!�w��&�?R"w4l`���
��6z;��?>><C%��N 8a3����>l;p,k�PO�?�{��t�s�LKfkP�'b�� �=��!�����8^�BAv�;(Bv ��Vu1~�V##���.M����&�ik�>.���l�p��������p~K����/����e&i?@af?wbw��0;u�9cAO��9����Z����#�A�E(�g^rz��5�R�8�f����]�r����H����uxJX��L{������/+������mn��{��L�'������i�����Q��Es�$5���������W���s��rXs%�k_���5�������KF^���_4*���SH�%�3U,�XK:0IgQC��	�d��
lniR�d>~b��uMM��'��G��FaE�8�3�5��=/�J)��)	^?�L��x�#��$>;��������0�]�r+���$�M\8�j��'�*�^�n���u��}+��P�aD[�}�&�a�/�
��Sb&O�Pl<�/�

��I=�8�0���2�{N�M�t�7��M���
���k�	�U��a{�2`(X��;s�7�f]~�����aM4���<H��U�h[������`Rt��<u��|���	0�!X� ����2�]!���}Mf�;�H��ft���$���.��w����s%WV�����p��$E �c�T�!��f��$�����������������#�*8�OaM�2��&7I�a�&����qT�`����~���Gr�3��.g�'L��=��p*�� ��z���@�d5������|�(�9�V���'K|Kt�/��v�d��]���	����t�N�X�g��PH��a�:ln���xV�),D�j���>x����m�W0�S��`�.�`���	\|���^4�������DV8��z�R��]�i��s�zJ�A�-�����}��r���VH�md�am;LyMH=c��
Y�q�$�)Y������Hg�'�S&���������}t	��0g������(O�������v�����9�0��������gt�BT�Ca�o9�@I���\x1�p�6��?9�=�*��1Y��vW�����f!PC�-|�M&v?^d���6X���hF1�����[|]�:�#�L��0�r���M;��>:�����{A"$�S���l�B_��]���^��@QNh�AoF���a���9��&�����TU���P*����~������F+���������*c����e��Id4����!Q�B�`�DO.�\gq�tg�e�%S!��GI���o��J�����$E���7��P(�O���0�Fi]�H���w��������S2�'�P�q'��
?���^�
a���Erel!��K�2���[~����n�s���������T-��5�N%�c�Y@��
��!�Y�cX���LX�7�uB�65Q�EG�[��ABg���(�MT1�$�(����D$h"_T���|zn�[M>,X�� �==�hz�(������
���]�ri�r8�*2:�����8Aa�vE�-����z��#�������P��e(�����J���a��`�)���`g���laDvk����j����1��3>��eTn�Tp� ���dv�z���9���'�Fe�x��Vk,a""�VkC,�Z����l&�JO�������w|O�i���f�{>�
�N�=���vR��&�WZ:`�c��
���z����Q�7���P��r�������'����1���@��|�6�*/��q��n����C��]�\R��UQ9.C]�(�Q�����$��}�U|&$�V�cy�M��%O�q7�\I8~���7��g�&Y�#�j����'�FU��@�
H������R��0��W�\�Yh������`��9zCixrl�
�Wf7�}�4Oq�����_���6]Y���<�S���/�A���-�uA��P�[I�E%t�����{��=����]1��t���r�.oW}���MW���9+7�\V��6��U�6|�y��gHn2�Zr����E���'J�@��dNo���E��&����`t�~�`R=����$�;���<5>E+<��Aik��-c�WO���^(�f�����J^grX����Ox�d�y��[���	�����^������%Zn�7���E��KK�5��&�sT�sw<��W���x=gg����^�����ZZ�i-N����R����=��O:�vT5h0�WR*�����tW+wY�����&v���9V��,dOd�.���-^.NV�L�NI�uR�V� �<'�����~g�?�\#[�n����fq�f�d���_�ZT+�F
��x���N��c)��T,��C���Bu(K��2������#��
wW���@�'{d��Qy����M;wk~8�YJ�eT!��2�b�"-�(;oD���=7f}6�4X��9cix"�4ekBv`�����1H�'�XNY;WwW��f��<oK
K���he�E�ZCK��p
��6���p�B�g��<���0�����9�����D���S���
U5i%�>��t�����kE��fN���$��
�YkRm�~��l�Z]��vrg�T_U���P��"�WT�k�	/�7p�	�AvV#�WU��q�&�T����%��k�g�;���N���0���+�uR�[��4�
�(���S[�e���#)e�{��	�h0/W��F`�ntE�Bq1EI{h�o�u���!
�r�b��b�AM�4��+H&��V(T�{�7�,Q��^]_wk��=����}=��"����������
����E��Q��������O{-p�E��
������rp��<[���-�)����Y�	���<b.
o��8�L������(7�wX��J��6q%�v��\_,�W�����W��Be�%�����8��8��h272����]���Q$�DX���!�9SccJ4�\0����
TVT�BcGn�+�c3������'�@C�,&N_QyQ��1��.��fGNR�'S�H���^q$�K��o�\~�!N2���N�J~���Ry�������uG�������=���8!�$B�y�$���!5V�i����Y�E�D��H: �����_���In�6��D�T�Yg���]&~~�P����Z0�\(����}i�X�Wq[6/����!n�C�=�O��%iG���T�G����x��02(/$��	n��C%c�.��,�M���
�%��AoHjA?�����������2PjoA^T8��(0St*������:�+�
����7rC��NE9o���0"b�,���h�?���p(D�N=ElHu�K�|x�O/l}��Ye�F��S�S�=S�����7��.����v�iV���#����3E�]lhq%\����U���9�����(�����y�)JR?Y"2���"�!��oR�zK��C^�)^�0�"�5p�K�^0��sX1�j�Fa�X����M"�����W%�{�B��fx�n�3y����8(�������9?L���`��x�r��OA��Y $j���TVb(;	HF�H��k�xw�o�{���m�{@�yO�$�(sDG6�Y���1��<��<�e�L�(��pO�4���C"u���,4��e!'Ta��S��k�
��)�F���x����O(O������CPt��&�%����,�.(���d��Sy���m`�N����o����e2w���2������q����=W��g��$��� �������8o��)�e����R*�Pzb��(�����z�X��S0E���V7�����n��������@���V��P����H�����Yl �+�)��rf�z�t�}X���d����pZn.F��n�&�y���!�M���xi�*L���[��*.h2��}�����,;���1�[i������������r0L�h��?G�y����jCO��w���G�����J!����`�k��� c�o��Z��z��A�g�:��C�=�f�6f��T�����I�!���C��K�H���r�BB���c��+�:%�r�����h��T�X�bX��q���l��G�W���,����@$�b7��L�.*���xC�OV�'W�p�z]_��*�=����d������L�<��!�vg���6��!��j6�����rx �������������B"&�tNO����o r/��:gYw��S�L��_��~�����x(}	~T���4
%l>��x�w/�|�.�BEm��o�5k��V��
<��c��{p��5 �8a�)�w�,V�V����Q	=�v��0W��H��kl����4Z9���H[������C�:��2����Z{S�?�����tE+P:����#N����-2�������� �mb �������,�Q%d���6!�:h�[Q&��L|�n���������������$�U-��K�b�WP��j(2/���E��,���^�t������F�����g��T��OQ�TQf5��������|��C�]s������������c6��|�V
�Z�M����+W�Q�IG����Ca�% X����rU�F��@P4�1r�J���*)L|��"�^S��G�}4=A)��5���dN9Q�H�j�y���fL/@������������(6��}J�mu�@br����g���R�1e�ZN�dGwLo*��=8���q��@��~��G���o��>�M�b��5�����7^����z�V�n�g�i��A��X�4�+�-D��������N�3�q�P���j��m����I4�����h`�����(��x�����{z�������j��&�
���O��V@�����{���bkf��q���~���(/�S1���7o32z���&�E����������r5���}����$f��cS�CI�t����1�@S�|l����Y�,9o�9��� ����\������J�w�.���7��%�U�<i?N��4�nEhq�D�_/F�����+����_
����c����ke�dB�j��Gg�G��U�"vx��_���P|c���v35U�>�m����{��H|`X} W�
�������f�+�KRD
_�����o��_����&Q2M�[����6��pD6-Y�4W��{�W@{c*���Pn,`c?�LV-Ci�k���o���'���|��g�1%��.��:����C��:��dV��h_� ,u�������$���cQ�'
����<�5-)n��4��!2��L�~�w��:����� !BN
nw����tw�����N
�����)mZ+�F���a3rH��@�T��}�1���'��>|�7�����������U��9xA�J���/�L��c��,g�#���
L��A���P�~S_?��z�}	L�}�J��,���M�QT��^`<u�{�*��P��MNg�zF:��7M��f�x�T�=gh/[D��g�Nw�_�x �!��/�"�|�V1��g���^C�7 ���p&���O�iD�����$��w3����w6z�AD�����O��	?M!��X�����'w5@���P��t�r��h7q��e�����8{R
�}:�7?���AA����r��a�w_������A��Y*�|b�l��N�7^����`��U�C7��=C"W�IV%N
����~�����4�up��-"�;�.�c��t~\��9�;���"������U�52[�����>G:b�<�"�}67���C
���?��S����a4�%����o�G<�_M��&uB�N�_����Z�[��/�p�$l�*�����j�+V,pz;c$3=����R�n��]��L����t�I!��+`��>���h8�}�%����� W2"1{g��_�`
�){�v�3�MD8hy�&i�7O��Dz�)�/<N-k���$��r��C]��;~v�mr���������k���d �����crK�!�������3H��o6w�M�uzo�
~^R��&�r�}��?7%��`������0O��%�y��*�T� 4}j�y����vx���M�:�&y4��Ls	�����{�������^"votO��tV��l1�ppb��j}#�z��KKW�����E���z��h_���`�5��U����~��x�GMIE����7��q��7e���w���a���7fk����vu�'=�z�}�>f���T7L�K�
\�m'��p[o+(�����izy��]����
/�3{]��!���u'��]�N�O;���.PH\�`�m���^���<���g'G
��P}�xt���r'������%�z� ��rJ�����s�C��3���:����%���G�r�'|is`�YM4���#PgC,�
��nJ�����w����6^�"E��cr/��-yKb�!��W��.�S1�7&W�m3��:�����|�2[q�1R���y�|�P�\���)�/���H�%WG
D�:'O�m���8���v���y�!���;_��SY��\0����C\���M�]%�aV�G��Ls�4��S��|^��iA�4����Yo�&Tv������#����
�+Y�����K��[�g���	XCz��~�L������p0v�����^s�>�������U-D��z�Y��8�V�� 3�mQ����:b+��w�To�P�nJ�k��������i=�?9����r'��^L�]/��Y�����d �N���H��*�����}�����\&���5�oF{����8C����t���Y�����/��ct��}�e@QK�����$�`�)>0����K����-�+����2`�5���jo8;B�Y��N��I�����.�y���iL;nn��<�'�W;>�[x�nw���]d+�j�PUl��x��Y	������iW���?t�a�
�����)	u�oK�@����g�jc��M%+B��5�����\t]���7�&_Aj�T����
:���:-Uq*f���'��*����0w���d��l�A����)�5�)��Z���Z�������������h%�h!����@�����@Vq
���������,9�5�T���Ay���E&K�~����� ��B�OwmI(�;���<��@�=�����������2��9����$������vo��@.��g�=���l���j�!,>�������p{���X�{Nb��h���K��N�w�kO��l�^�':�E:_4`#9����\����<Q9��~
�|����e�(���#)�ZH�t�Qy�-���()����l����2�x���l����~��t`��/���v�XTi
���~�? n���Q}�����'ft���_�X�^}�����Jo�
[{,k5'a�<�^�1�q�����v�5���~����"�(F��������x�8�w�
PnU�'�~22��9g���()��xM�>Y���sxob ����$�+�[�*�w8z6��0�� �O��c5�����]}���������!d�?/�|�����#�*a!�*k�+�/p�����V��,\n�/�L�k������:�K���3-����$��0�r��R3��|(j��)�K������VP��B^Jlu���(�W��5��I�u&�r(W��4<Q������k�)[��IQ0A9������^�F��nd'��+�E�x����^�=�'����H�j�E�~��Nw�t���FtU�v~����b��Y!'�,��H�B�)�<�����-\�=��9m!���x}.O������i�<3�����}fq�@��^\n�Qg�6Xg����Y���`
�/�o}=mZ������5���B`Q!_z����b��u	���]�40zKm�
�`L�����p[�������Y�{3���R�_U Dm��$�M�V�V����$w��P��v|�4��������h6��:R
p�dPuT@h$��U��;���CdHw0
'��||�`W�q:B���^��f5�3b��_G`GEQ���J�K��Gu]G��&�S+D�6��e�����>�����]��1��a�������{�`�.��X���	���h�}�����d�������3h�zt�Y"�+�=�����G�����m��2Nv�FQc��:����%��\u�:?��bzz�<o&i/�h�����2*7�t���H�y�	�=F������2����0%Cp>��@w���N�h*U�-���?6Y%�4�U(�A�Sf<���Q�E|N���X
����M<���U9�P�\
����$�q���,�{�� @8��T��k�`{��Q�C'"W9\���1�r"k���el�W�����h��W
�&X�����L��[U�;�1Ka*�������y;�^�������=�,�w����+��������g��#sF{���4w�%�b~�r*�>�f��GT�>3��k��S�
����p^"����o�IG �i�7�"��d��������\I�A����q�'4���������W�={v��-[f!��~���:�����X-���l2�M�@
���S��pp����.E�~�V��\����"���I@�0�y�)Z��/N�{0	��{�f2��L�"ik(�����C��������
�� ^O���?
�6�e#e�P����~d���q�h��ojY���m�E��z���`��is��N����v��u�8������������8�;d��������M��/EP�h?��5i�N�rY�����tS������]�]���F@�[�)?+u�b�x��2h��j�H��|�����^�"��i2
�Q������[�=����<���/���l;�xi3�+}s�5J�-P�t�	�uk����[���~��)�*�I��dS���#������A	4��:�����v�I��|�6t��y����kM
r�a%'�����7�W������0D5���tj�b�[7���c�K��<���k[�U��UP��^��V�Z4�b�K#BT�-"	h�D�b�JP�DD ,������a� ��B��L@E��[���'
Y��7s��=s���0]�y4#����=��c\�Ul��Nl���Ku�=�m{�<T��B��N���WD�g5JB�`��c�������_+�-�d/Y_�fo�A��V`��k-44zxz�t:�D�c�� ����G
�>��5���m6�0�W{g���{v�.W���
e�+�|����e543e�H�������^y�h���������	!*q�r$,s������Or��Y�����	<�J.�
�ze�z�s��!C�W�u
;��(��n���/��6�>@��F>��0PD���i�n)��sk����s��[���F��f\��iNS����1N�?<w��j`��Q��[ �^8o���|^=[���n^}�=��Ih/B"���m$-�\O���E�t�?�I�I��
:G��|�����
�,�����7F��[��������2S��9�A+"X�O\Ro�y�&���������\f��}o�>|��E�D��,��lY��G(��b�5ff�vQleG��~������X=��~���(q����g��J����uF%wBy���
��F����+�-Ys�qZ���O6�w�����~�)�U�~�Us��O���~�����-�Dz���X:��z���������8��y������
R���#<�����$�e��C� �[N�,9�X�������S��8�]�U�mwi�b*���������!���x�[��l����b������Q�A���me�N���
��P�-�z����_>���n���S�hN�"��k������v�Y���z=�p��
��r�q1l��#
r-hRawd�G�uX�	K�F��`�$Q�I��"^����W�W�xc�����p�6���`�Y^%�9��n����	�C�7�O��p������c;���%����1��bA�B`�{���{�*�K��*�,|�l���K*z�"x�:<Rn�����w������������.���o���+�~[����Y$����c�Z;r��M�|V�v�.�f������O�]x�Q/���4lT���.�qne�D�8���6m]v�j��
!.Z���yd����@A�Z�_y����m;��O�^�K:]���&�r�4{����Y��k9��X������=�x���w��^'�g��k��Nu��kG�������6�{6��-�~���K.xm�m*m�
g�A�C�3HE�Q�E�������-�>��	�,�:�=��t4�)�9���T\�F�+\��$"�;cT�����������8��]���3�f������#q��5�7.�v�Ae7�����H��lCe�o?��A�rr�C�h�PM������m�t�f?(:����n�g4��,lR��,��e��
���)��7�X���]7��DrV}��*��������Xt���r}jo{
>�kd�,n�y�w�/�<!�;x�D�6xi��HIodWJ�o_�������/���C0�O{X�&�V%c�����S����%�90����`;����L��v��������&t�z��6N�*�����n���x�|��UWn���4������lC����gXZ�,�������f�]=yo�~��g��FG�;������k���~�Ahf��s���[��p�`uT8����%�
s�������Y��eW��j�����������E�]�����D��I���ih��C	�V�����	���#����c)<5���M���o~2��9�4�)��$�=�q���#��v��:;KZ`����W���;���+��u�S(]]]����9kjo�����j2�R__=2�q�����f7����d��=�D"��J]=DjC��i�x
4����^Z��k���Q�D�m
����VKr��j���xhp�#O'��]�n]���1��x�$!!w��M�i{{���!�15��^gd���c���{4��S��wE�`>�&�2�NM7�t5���O����g�}:Y�K���v�Q0H�����p�������������	�j���29����X�d
��5�s��31��pM���\a
}5<<���|�Y�Zx^�v�B��)�LJ���]'5��Y���X�s)���'�p�2@!��[U��� ]���/�����V����H	V��=vuj(s����}:��*��Q�R~��aF}���M����;&l�9Z������S�(��m�N0�6w�PF�j�h0�
�\8\�3n�8p������`-��iFz0�o�������P�������)y���`-M��4a��*���GRR�j���*gaU�O��D_��[�YFu����6�q+7�Z�"���J�\��'���Q��1k7q��g��&����mS1�gce�<�x�;����o��DD��+	��k	|.��;
��15�ks%H����(���9�A^��]J�}�g���5�;�S*�1X�n��<�]o	�z��I�����T�s��
d�~K�.2[]�jA����N����Y�;q���T7��<yw����u�Cm��t��7~�Yw�]�M�};�{?�>���4r�I�(.�In����=q���bAv�S�q�"%������:��6TI�����2k�=�D���y���q���G�Q}����IM�s P��r�'=E.��j���##����\=��,#�;6��[F���in�e�Qmg�E����|'���M�'=LB����r^�����s��}��z���^����j���:�V�������,�I��3����NGCwa{>x9���}�������v���7����R�W��������Jd�M*uk(:�����[��}t�*Ix�U�
���v�\��,���y�����Z2A�X_�H��Gb!h�Q����5�0����fS~�&��:9���FMjC�#R�s�v(;��s���3�����p��'���4�t���#�P���^����9m?G�"�(7��rw�o�wN�%S,���l�Q��A�E�sc/�</NM4�s.����tG1L��^J:@�k>��y��?����}�m�v���(�6\�����x�*�`i>?�~���.}{73����$�O��s�mm3~���������h4�cI���l���Q�;��hd����3���=���I�j��|I��i��1�T�B$4$:G��|oOet�"��zXX"���
wj�g��:�dr���553{�[��gTIA�%Z��`�'T��5M>Eb#\����b�F��)R�i~	��E���:W��
X��_Z84
���^�sK4\�^�G$h Di�G
��z� bpkJ�������J5�%W�s��4�������P�t�����N�UA�]�\������D�������L�|���n�J��pezZ_���������::��e��8A
������
�����'`UY����G��'z���v���m�jZ>�M�X7�����)D�����������=��P��7q�_���0��,��������k,�R�Q���������G�eo7}��K��~����q�a������`�d@Z����*_#��]�&H>��=��uQ]5������qn4��%���jw\d��m^�[�=|������;�������z��'o��V����#�{g���<�e�������bs�l�hA���P9�k��:�J�P�����������rp�vm@���Wp������Q�����)�8<:Q^KtS)�H	�%������0�xd8��(�0��Vu'������������,�����������.1�Wj+�(h���w^�4�	��F�#�[��e=u;�
�$�����d	����g��!`2�"b�/JK�����**	J�=?�H��76�����+�����8��-_����<S2`�Z��������O������T���&���_����u���(�?G�@@-��Z�������+6fMB"�!�A$;��@#|��sQ��4p�*�kQj����_R��R���)���:��v,N#s��@�D�pQjQ/�D��<��+c���
���*��D2b.MK����F�o����"���������
�9w�'
U8c��h4~���S*� ���t���B2��?~�80�L/�WA�)e����C���R�=�=��V�Jj,�5H>����b:��������Q|o�����IO@��D���u������Z����k����=����&
�KTI�!����pCakx��b�����k�`�$�(��K���cB��9s�0}<��S����8�%_��bw�$'�e��2
i���\.��aR�xqO�����m�dB���T��5��I�Zj�	�	'!��tm����ym�9G�����C:�{�T2w�DoE�1"�B��0o�w0��x�0;�"�J�1�I�:+��\�s_h�����W������z'-�/�(�B;O�"�1����U�8-R	��1���-�b�$���B������m��u���\ii)��O���Z^F���/�+�,+I��k�4�:�������#��U�%��`���'qd��m��&E�p�y#���L{B�hSX��wK�N����2a��.�h�YSI����tp<�4��M-7��y�� ?)	!U�6��������A����:���%R�����R����9�a#�06�-Q��> I���-|[��=hf_�KiY��}�|����	��N��"���9���j�Ui�t,��v�o��\��<��������
�����x�H%�)N%�z:����&&&���_�����J69#<J-Z?�
�n�|��dn)V���@=�7xV0Go�(����O���es���Wn������k"~���,^������m���D�o����(�u�����*o�%|�7>����]���y��6e�kw"V>A�@�m��I�����
�J�B���n���l��_���i��v�vs�4!zD����K�(��
�f����6�6��F{WlZ�Mi�L%�j�6��m��6�1�[j2�I{��!�]���8�8���S����4f#�r�n^��X�]V�`�)��
|V���s��/�[��H��z��k~���&��`�G�O����l�(�)������d�TG:yO`������=��uT.������ZY
����lD����c(@5�<6��5c���[������
H��RKz�����%����F�7=���Q;��	���`�~H�?�����o|�����lw����<9�#f���)5���]P�akX�d�x{v����U�"��n�[K��w�^_��g61���	D���\����rrr�888�� n�P r��F��0���f�����#T�$h�eg�>7FG���1�Z��Q��M?4F)���/BB���K�9t"�;�iO�C��>p������ej	�?�����>�D�������C�����KU��h��=�z������)��iR4r��'�0�,��������mB{Gq~��/��'��������^N��X�����W_����
�ov�^&bSFoo�������������7�����q^��������u��������i7#P
�Q���l���==?�%[��)jR��Z�G'���]�p����]T��uf����6�_0�����L�z�t!ww�%����&��Ho���~*@r��m'��/�mN5Ur]�K�R�\���OPt%.�yee�7$�3��b���$�$��J��,e��pM9�P7���iO���!�]�������l2B^��U�
�����,�c��VpNq���j�n��P�)i���������g}2�9_������wu��1Z�m;��(�<�Vv��o������]�7��;(����'��`���(?���>F�ER�#?<���O�/����s�m=L���e��%���RK���Q�(�E�S$g���D�����e�|�3�49
(��'��2o��V���7;�:���\�G��K}��������)������b����s`=!�,���M�d�( �=�H��#����5{~�Ze�7
��k�lX�� �mIEW g�=�50�������Akkk�����G����o��3�����C��S$����������Wf[d��T��3�c�����29/R���w��I��Y��G�3M����tS�_����{�uq������/� �c��
+$b�f��?G��N������4.���S�pC��DF���m�~����W>3{�?�{Rx^13����%|�'_X���e�L>`�Q�)j�_N���H���VaPe��
��?l��#�zc"�`���6�U����=��������F�"v������1��|T����<")����C�;�f�qYF{t�rx����7����Ul��Fy���;��v��r�=����U�;q��\����2����T����E���W�M��Y���LMM�O�<��e���m��O}�����+P�L"������H�3���6��M�=�y���J���/`���:�����;h7����y[���cp��fJ�_�'��u[���"�\��n�{���;�]��@<n?p������a.2Go^��[���E��[��_uo-�2�=��i�}k�sF���t<��E��^���4anac��I���+���c�%N�[����ghbz?�Mt(4""�����S�]�����Tx_W2b��Qz/���ch�:�E5�8�nU��\���z��<��NJ9D��h�����i���&�����~�d���& Gj�&��gQ|@�"#�B���)o����na/�3
��4�oD��x����}��]@�.dh7����?�KY�h��C��5z��%�D��������YY�����K��/HP@��|���>I��o�9H�z~.�?����r�C�m��
��K>���Z==K~�Z��n|�����I���i6d��m��Yfx����1��u�?-�#g��
����oz����6���yJp��mG�\?�r��iA�{|_���c��Z98h�&m
�����(��)y��{[y����]��a����^�0��72l���5�HD�s[8�O>�>�U�1�O���?bu�^����3�t����?%��}����j�V����T���t�����>�Ho����R]]�$���BG[��y�j
LP�"�(a�U�#�Q�������X��x	R7����x����m��,�Qx��*�5���w�����|do�o�_�p�)�6W9�~��'��5�L~b�
��O��'�p2w��)�i_�����V,h�6���v�7�?����I�>�Wl �@aet�	l�ZyjzX��Fn�L��������lTr���t���a�w����.�_+������o�V��n9�d���?��
������>�l9��u��[=W�(b�(�7%�+�������[��zi�n%F��ZncTZn��#`o�Y�����]�g�{����*������q��#��|������4��F�����`���k��� ������\���j\�"��
��q��;oo;��F��wj���\?X������<���Zx�m�����nX,`h�����RKW;`2��
�J�RM��=�	������O7X��7������0��M���n������0�����c.u�8��p�`���/4�&�,�b!w���}��}a��.H)���4�L1�?��H�����
��5kv��EEEn���ol-(,z��{��2�(�����u���~�����������m~�ix����b����Q��x��q���-4��VD#j+�Q�����a����r6������2�~3�y���'&����#����u�nXgXC��/�Y�m�'�7�����w��S�H5�������O�/��;�qSO<���`�!�K�����`�&�B�-{��Z��\q�����Z�7mi:l�{�/V/��K����W�/�%���o$�7��V�B��E������AF�l%���1$c�,����)y�(����s&i��N+�������W�����s{��{��h��_�IK������$���`Z&	���JxT�H�+v�Y�vQ�gN�q:%��r@���l:n�w�g���r���������5�he��	�8��*�I8��
�7��Q��u���xV�E�\�����:/�H�,�e���d���x�^|f^�F��/��>Yv|�%3<"}��������G���7����yh��[�b~����7��d�z�x����+K�x�{/������4���9��M��9K�m�g�������9��]�p1���N����'���\��6�$[4���KL����L"7����nO������T��Z����DTb�s����^�:Cfm�}����J�$�|�-�2�p6��j���(����
@�&��Z�;"(��9F�fH��"�xA::��et.*
If���<��iH*
T��=�f�W
���Vx?Xm��{��3��%�|�@�����j!
��<�vJ��B#~�"s`aV+L���/��'�(�t�x`���&���D9��� #�3&a��!B�Z��bK�]���������L��U>xE�l�v0��!�,�-������B�j.?��F�s
J��
x{%c�i�u���Bdg��A���S�����@kG����>S���3���n���5���n0�L�(��@�8���S$�������<��N�7��N��W�^�����T��`I����j
2���D������g{O��0Z56�bkS�������.<b���V�a�_�Sw��'=+p�1�9Y���p�U��UL2Yk���IkV���k��������6� M�y#bx�������r��Hf���Z�y3��
���+:����$XR�0�.4���Yy\����I��Y)�\�^�
�.�	`'����eGK�3�sA=��Y9���;�>�����;��k�~��'G��V��|�.���������>�:t�3Sr����%���R-`�.��3=cB��x	6�||igq��3@}����E�����N�x�es���xA��'��;_i��ZZV�����"����F{xx�Z��kaa���-a�y_��Q�p{��.O8w�:����������L�4�8>u��JD��\�d	�1�c����!y�(K���u���F�+r������g����G]�9Y��\/Yu-ab�a�����}:G5n{�f'����f���14�w����57���)����}c����5J{�X�O�6Z�.Y�t��HD4����z�����&V$%u�/���hd���������V�Q;�RGT��	�R��I���7��7+�8�S�'�Ug���k������������A���������-�bx��/�"�:�:�C��g����#i���P7��u��<�������q������N2�"�5���=^m$�F#��MM������Tx��h�J6�v���s��`�/	\a��:���I���Yf����OMM��X��7Z�e��1`q{�]��g���	\EIs����Zk��o�t�M��/1�W=3���$��T�����ZX�[h9;�����T���<��0W`2�'�2jjZ�jv��wC��a}p�oU���R����Gct2{k��3{�\�~���t����&v��5}�0��j,�h��oh�7�d�t��cA�E��$�hw9kdd�9yA��C8��#��"���Q��8�n�6��	u���+����Q^�O�e�|2�;�fo�^�)���6$�[����@�����Q��`#P��r����T�'�v�DW��[6^+�1�R�������>b�U�Y�r���,��8l^w�x�<Q8��D�8/ �f*o�lVN��x��=�����j�(�@SSd��jW���k�����o�+0�p��<�A� 
�������)�B/�e���Id
��4�}�o/U��������y������
�5�jct�����G�)9�@��h������f#�x�Q��B
����a���
=+��?(�����d~�0���v�h4����T���
�l��;��@VM�l�b�	��Q;S,�%�8�\��9o�-\����4z���E�W�tr_=3���~�~
�!������rR����%���-��!���hy;�/A���]�;1|6( {��Hk��X59r��\K�����T}��'���(���.�P�E@�}�AlLM�����je���q'��
�I��eFD���
��L�U<b������JM_��^�&�	\������M����K�p;�/��?����Lq�:7=X�8Ry����Y�����~ �5�c��h�:/�
4.(578RXt�3@pP��C� ug�)�%���ey���1(JO���|�����VvY[�RtD�����#�OZ0g4(�'��6�J�Jq�7������iV�����z�D������tO�uv�gZ������jDH3k��VH�$;D�G�d��~�p�DM�iF��`���aE�����Q_�(��>@(wN���,,&S�t�����fixKvWVlv�j�p�u��q@�lh���6�v;�6���s���J��#1a��J��6%	�9��l���/2����P�������%!H�pE�,Dz��5mHw���GX�U	*��������Y��5�|q�<#9�bs�(���a5����F��4��yZ�C8I�����y��^4'��;��$`���g���yv���[*�+t�mKT.�
#N��Ln�D�iI���\���}��H�@�����,e&�,��5�J�(�vm�h�3E����n�l}G�U�(�F�],�K���'�������Cu;QkL�HI����/��A��wM<����^p���3?�~�\����a~��e�x�]����������)DY��-�#�C��2��x����Y��p�.�>����������v�/���x����f�M>x-���������	)�pG�z�thn��)���|2H���t_a{��XqI�d���`����t�V�7$�CS����
�hx9���o�1�+��=��r q=~��������3��.��h�N�� E���E9��p�G~��l����Z���n$|,�����C���,[~Ff~�!7�����=�S�&I�w�nPzzF�1?����K�_x������m�A k�w~b8�V&��
w��Cd�ii�+�{Pf�#\o�W3���v[���k�~g�
]*����|�1_���jM��j����J���	���D�y
�*�B(�xX=�%�v����T������0^�
��KT�`y�
�����e/
E��A��i�o�������8�������9rHx2�%Pe���
�����!���$����A�m�'�IZR�x�`���fk�/���	�s��4wbP�EX�rUNH>���b�D�P����@�������E�j�������lh��z~1�+K������j��s��&�x�m��/���i���h���	�C��NR��
Sl�8��@����W��fB|(+d�k���F�������e$qbL��4<�X��Y�����5o�E���\��p�|�(�3E��sH~U3������V���`�.���=(��������,qqk�wb���2�P�Y�B�����T��q
5��������b	�C-�j��9?83/&�67cB
K��'Kl8��6�`il����8�_���AOL��
#1Qk�y���p�C�O��KXs�R=�j=�w�p������~kq������$lRH~�a4�/�0v$JQ#9-�"��>��#�,v����{@~j(t)���bx�`���~p�G[d���F��L��k�:^AYT�@!���/���9I	);�m�r���R ?��[B��������+�;|����w�&h�|���F[XX�������o�R��T�YD��������"A\B�JKV,�=F��h�H�VS55��$�3~���Ntg�����#�u]X13]���@��P�Q�CxH�o~|��#W�I������q,���(���yQP]��BVJ�_����GV��e�[��j���]�H9W_��C�U[��e�w����qs�l6���s)'�Q��6�@�M0M��I����[������e;��m8�O~�����h�Z��=���K��~&C�����Pl�f��4O�����*��d~O{��YX2���/�����a�F����������]_�y�oJ����ek~���+{~Od�q*�XV����oF��e/��3f����"ckKR�Y�D�A7o���$��V�������~��YZ�C����N����u�?mR�����Wr��E�w ���@u%�����]`.bU&���\�/��6�.R����;Sh5<�U����r<x���
x��/�r�6���Y��������p���������{���z\V�vD]N�}=�b�I������yy�g�X\�����WZ�|�`������S��'v����qf�����]��h��{��R;�
����i�JK_}s������k�qf��<`n`Wy���V���Y�����,�r�Z@�=��Ka	_��w�/,���hH�a`�5���ja����������B��}HCr�����T�����n�)��[��~�,d�(��o�Tj1Y�n��^c���c�fJ���gA}�|�Y6���&���y��$�G��*
+��S8mAU�~���=�A3��e4��<X�p4�%�P&`��o�U���=2�����44���u?�7')����w�[pW��r����SG,4eV�v�i/���M9(:�/|t����L���Z�~���4�D���O��np��st����������qt��^?�03�F���������;��&8�����.��S(T�������Q�����+lc=��7�ul�
����o�*�����>���m���a�rK��4�����������<�Q��c�CV-��@��g�m'� s�j:�A��x<�����uw#���,(���H�&����k����e R�B�$uq��k��C �%���-���UNg�O�g�����q�+����8t�g$���Zd��o���:K�2 �m�M���	��$1f5r�������g`�����z�����u%�8��Eb����2��:6�d�>z.C�
�-�������6z�D]M�����Pw��2�?����Z\q��G����f�z�}���I(���}MrFl������?�cLtz
s�)��B�w�r ��f�|��Y���a���4DS���a����h�FV4�
����}�?�":�����)~�T��(�Z*���8�i���D�>��x�Jb�`+
�`�]�F!�a��sV<y��B=�Bf%�Uv'{h�����@�{�" ���*v��-��Y�����-�q3�M���/�D�<�&+C����%���������T�i���04OI���<�YOa���Y���ge0�����ys%K�0R��;�]k*�\���_��L���OyW�CZ��K5�Q��#=M���;h���:s�g�7��~���p�/�6{N�`k�e���x
OU1��������zm�k=<�8z~����������'K����,�Oi��w�����,x��7��L�k�����h)�S����J���D�Tv9��?�����}���^0�<`�)I3"l�G�$�b�,"�03:T��Z�#��gV{���	��������t5��s�=V��M��.N��_h�R#��Ml�G|�'��*�C�>][r���,f�"������:���C�P�����c�'�aj&�g�vo�����k�Y�����/e����=��"�!_���4>�5�~��5�h��e���c�"<��k�t_P����V����
�����wq�4|�+����U����rr��`��B��O�,��8f��$�`.�]����N��U���:�8	����}�J�o����-
3l�|�Ik����
��_�z��������f��������e|��	��{�77~d��wJ>`��$�7[�#�2�b��u*�6�A0���
�V�^��A�t��:r�*w��tP{J�+��2�r����Oz��*�3hgW�.3I�S{����\?���]���K�O8�����fcM�T��
�����|t�;Y�#�@R���h���s
�
��V*����_��K��T�mN�# :�~��h5�f��<���O �&�,�f��nb�"_Y*�#+��G�#���H����������`����|��$����+O�(bA�+bx�<�����a�g��s���������#�)7�|J�W�$7~ir?-�#g��.e�����H��K���z�HU=��-�T���~�UJ�~�������F�4�F�����S�[�^�����g��������P�����'�9�zgj�F~d?�/���Q:EM�
'�d�&���Ae[h�T
��#��B�H ����1c������V�ja8T0�u�i�T��i� r�n���LE�^2H&��>\G^������L�����o5�}���e�IE�����f��O��Vb4��/@+�{����mq���5*�� 3V$04��N������P��\��E�b�%���&�l9��6*v����?�%|L�H���n�%v��E�;���S��e����cM��r��QX}�\$w��|b���'�gx���k��������^��S��}����Y���5yQ�����+"��/��?�)��$��Z{��A���j	���]��AE �[�/�yr�g�9�]d�L�3�3{QS��3�~�������f6n6��`�Hoo��jo���o���Drv/.���dS��e�-�Q�����?��{"����=?���{���U�uM��������\������}�.�d��d��=��<^_0`#����'���<�\��L��f��K�3~�}uq_��\P7q���*�*��d��p�L����o��C��)7����N[�W��.3���dXw������e����I����Z��8�o����QwV���x���D���(py%Z���cz}�0����*�BW��?�#���m��?����G��R�O��������\�?-5)&�%������U��]B����K3�2��!�D�(3��L��.9�)�u�-]+�i������H���_C���~0���g���|��C1#<���q����h��������F�M�>�G���v�d��Y���U�p�g�i~IvI�B-����K�������U~4�W�����Ih���dnJ?�Y�����Yy^�}�'��)�q�0�/7	z(�T\�:���O���6�H����
U�6Nz�g��_��8F�4t��No�V��"N|Pn�e���Kssz9���a�y�ESi���K����:��N7�����p���~#n�a���d7g����_^�t��)=ug���D��jH�^GC��R7�&'F�
H�W��M������/�-�i���2a�y2^kd���ul���a�aX`�s�8��m
D�����E3?�
��@P3W~'6
{���w�����Y�������3_������k��g�+��}'�S&e����L>
�?V1�c�z�A��%*L}��W}�/��sn�7��\0��>E�*l_Ji��������P������HM���!���J��8�������}kw~,r�/���Q��6�'���F&�DP7+p��1����zs�'���8��W��V�����X$�����u���!���!F}9�����
���������k;8z�����
m�v�_s�+@�^���k:�R�^	m��G�����,k�-�~���)���KUq�k��m����N
���
��Mf��VWa��W�:����bmV�ah�l�5�^��y�F03�:g�+��5��u`� "��k����/�b�>��������[5'�����]�Z�����	5�L��������5|��u��t�iPnXK���)���c
��<XE�4:R�\����T�v�|n!lW��q�=w���J�������N�_���o��k���YS�7���t����R*s���yQ�����j�*y �7��f���_F��4.�.@w�NW���'S�L2�A��}����9����XA&�JgO���,�������)�C/%��E�l�z��w���
��S���&��������
*@��Q�5:�\�|E��o�%���z��wk�<�r�W�L���3�j������-�����XL��������������l?�B�>��^�d�������������:Q|�Z��(���+d�\���mc����)H��?I�Iv �#��$e�����5m|��E��25myg�����
[����G���S%s�|[�
fP2�
�J��w�Z������w��hA������E�4}��v�W���*���[��?����o�g�������6�@���J��};D0��-)4\�\�-c�����F��y������M�f��u��j�-�6��&�5t���e������G��Ev�j�Ok:�c��Y�/�
�i�0
1h��Gn~��O#������v�;wn]��k�W�.�Y����v���18H��"�;t:��E��(�[F���,}��Ri��k���\�����?����l����_�5��?�7�1���0�������������B��
=� L[�]�l�X�y��
�c��c�^�(�Dy�:�vG�3�?�����\�-=U�u�^�HI����m(OW�����n���Q���~TP&���te]�XB������"�������hfk�������r��GR����^�r���_a#��p�����/�d�2]����}�YY9����?�s��}YS�Y^�I��3�S�(��t�.���,#|��yw��#������|�~�xP����~������3�����8Z�����{��7g���7K������n0���K)��������Ei�O�'���" O�%0��3��s��!��q1��/�0�bJIC��e%Q��]C���d'�����^��u���'��<}�q�hV�wuuQ(w�mL�����HE$)VC��D"qa�n	��$C�%Z���!���x����@�u
�9����!\��y�Yf�=*���M�K:=������B����	y�[�&��e�F�T[uz�R��v�p��G��n�?\�����f�<�-�v�����Y`��|Bgb��������$���A��D�$������$�6M	`��o�����#����AM�oClz��W�������-�-��|�/����`�����(������'��'&|�E�E63���}� y�Z��ZgF��d��
y���M{����`�$�H���,�/�D��a���E5���Nu��H����G�	N�ME$���\4C����* =�~2������Z1#?b�Z;�W�r"B�j�og���<2;�������}�.`���c�����gg��f���_��w����g�`�Fn*i��f*ZOri����+i����i�k���3,;����=\�\���m�E.�������������5��On���)���.�������/��"iPKW�G����-C-�����7,,��7Ce)Zm����h�����T]���+eJ����=$����6�3~��^>��!=���\���,���h&3���p�r���miO�[��,8�1"��h:E�O�7z�3=27Z����hl�f���U`b|�C%}-t� A$>-0�]�L���"���6{�����^��F6`��&��|&=�uT���|��Zm�T1�44�������G�b��Y��K���s���G"t>%��i���bL�M���i�mG}�PR�L��Z��ew;�	�J�j��1��h�Sk���Zv�~���r������K%#"q��`U��kH_F��'�����Q^�M�l�n3�vu�7m�M�����
$'li��������ID:F����((`��0c��J������y��&9���Gu51�}���DNA��e�KI�����r���u����lE����/�S�s�����+]��$����%u%R���y&��V;�|D�[C�t��������=,��������Lov|
��6{�(�6,�$���|�m��K}<������;��:?u���9o���p���-�`��<,���v(%��P���fha�,���9�r������sZ'Z��~�����3j`8Y5\��T����1%����W�Y����%��&�C����j�.�)�����Clga�j�����N(��%�IB$������>D���\>�V��6���������PoM�b������E��5@x8��	��>c�T�;*��*�7������Z�]B$u�{�N��\O��3k(����<j?�����t�D�L��5Q8t�7��$�6g�S�`����Tj���`�u�F19����
�u)��C3�G��{����O����Fe�Jfz�XZ*�K�a��;�h/�����<'w��;�Z�5�=�����0��Jk��y�
�lw;��������Rr��H���$Lg{����X��K��R���~�***CvZ
T�]���d�&�s��=p5��Y]�'a�1�z�L�ZL�f�/`6����F�?�`��R8��^i�����*v�8�:?����A�0K���}q9��}~d����	�^Q�bm��t ��@^.�sz��g���5�~����4������f���#��y���������Z�3���=(���&���MI%�H(�nVU�I����v��A�X��+��/;������\�=\�|,�%�M�
�����:��~Fc���������Fl~:!s��o���l�z�`p����@\,�-9�X��6.�����z�O��Q��^���u37R�\;���qt����Ei����$t^� w���`�t���x���'U�����W"������H��^��
�X���Jkb6)ip��-��e�6`u������~��`���Fwl�Hul������u?�?��:����]�������! (��(���! !�t���"�JI	
HwI�t��tw�q�������u����X���c�b�1�9��O{�������b��Y���	
c/s���Us���s�|M����B*-H�O�z�c��*)'s��VfH���$�T-��:VQq��p�?3�m��yo�u)��hV(�d�fj"�����~��wr�)�Z��+o�e��`�<
���������=�G2�N#~w�y��i�� ��&�����v^Z.���y2��r����X5�������j�A��{����^���l�p ������@h���r��A����zf�LC����� ����g������X��i������=��y��'���z����f�!��P���\�'��2�8-�+����v�`R2&6a��i��P�1f�Q��9��a@z����?Q�����7�����q�X�;�����Uh�����eh2E!�<�{�W�����-#��� ������B�k��xV���m;O�+��F�[:�'&W��Zmp�5����8�'�������=��wwe�mQ9,���M��W3��[p�S��y!�ei��3��1H��d�=����3�_T������u'�C����rI};��}���F!�vb���$k!{kWV��wD%;4���{�p���#�D���G��� ��xb#����G����s����7��>�9��:���_G����%��H����1�����U��g	������{D�))ss��O���@�����1��������R��`�>[�)���w�zZZC?j�]+b�����/�,o������C��1U����Q�����<�����_���Jo��������k��O��U��l�"_�R����>����]]���D�xR0��M�Z�;rOkH��^O��J��ZY�u��f�<HH01�c�/MP��;�w��/�z��uui����p�T����i���)^�uzmxx�����D���j�C�@����_�dlD\A�?�+++Q>��|�88�"b7n`���?�L�,U���w���Hh��x��/���x�&218H������������9�����/V�l���[n;�g?*���������G��K����
�t����6��KS!���!w).!u��-n�M����J\@f8%?!��*RSf���8�~�{L�<0���/�B��eh�����bb�96H����o_��}-��F'*J�zPb�@%h����0����9444L-.�/#/�A��~����mgQ5 V�������&o�[������?t��M����l�j���U|ww�h�'�~>U��_��6��=���5��Di=~�02��q���R���9�zf����~r�i�0777�|���;b9��~�OsZ����U���7}c#Ac]]]���XC:����3����u�t/��VYYYt����FFjs_�?FS�_�y�M�����V#��=)r��A�f���X��x0n?��`t�[e�u��>����Lm;�O�Z\4'''7�N|�9XzQ���q��K�85��y����8Bf�%.]����@DD��"���}���IR��7�"���LLL��L^NmWUUm��,./Q2^��������������%���*�#�:��zK����������t-,,������������p(F��yz�J�F��X��mb���|m�,�e}bz����I��
uu>����,T@w�G�ik�������_(T�����z >V��g�lU��4p�������we�g���q^l�`A�#��C��t*x�_Q����3�$7���E&'������^z��:���U�Q�S
��A-\�M���C"v^{~�����#��u^�h��B����/CU�����=�1y�m��G�����������I����~�zS�<~��2j�����l�+S=�'O(�o'H��mLuZ��}��00��z�H���D�t�`��e�l�qyE�hA�l��LL�Kv0�M��<�
�ein[s��=)���=��=��D��������#����X�(�k�eYq��0�����UT�����33���R�%������.����Q��T�gW���3����$@�l������4�^�p����f�KTT�lX�T%3*::3�6O1�����9��3���xcW�����22��u���{�w����B2��~�,))�����>{����iw�e���'))�l�^�)�!V���9S�5{���sQ���K
����OR5�to�6��P��F����� �!'����9r��WG�N����#�5��!�r�������yKv;#DPiImQ�M���R<�G�uiSrI�
$��v����r,{������}sY��U�e��!�zji)�x�St`l�j{�G.�������`a��(%A�@;^���O��������\��t|�z���W�H�|�2zX���-	��t��3jp�-~~�!������|r��|��m�������������E���W__�2,��D^E4����( B��S�����(��XR�K4���8�Z����K8<<=�o}tL��.knyEY�^�O��G�%���f���<b�V����Fl�;)lhHK�P�����V�s##�����z�O���Rfm~���}Jr�aJ.�y}3?��n0!���U�����J��=k�����[e��#���2LTXs��|S��������������		��)�S��&����-�|��?4Jl��D$�����p]�|�s���"'��/��&�����������fn�R��i���VS{+�u����`�0Q��ZZZ����aTBKs�!D+�'�"�Q[$����:�}n���#�D������*�!���,|;�o���{s���"��G0��Vg��D���g���[����������������m����������:���


���~#���W��<�N(�/��$	�l�Z�����i�:0��
H�_Wl�zP�&���1�N,���	���������zI4L����L�A���W�\V����y�����
��~y\�,7���i7���W���~��ci��_�R�R�w�3�?��8D�����	o}M�oH. $��X�����,�d�D�������@Uuu���c�%�%���'[���U��it���>z����������'�<�{���/#�<V���Q�����Ro�3_]Rk��$�H�����PXLy���>�������@)6J����������7������7��J'v{��"Ccc���su���.���"	��%�p�Qddd&ff����,4442�����zK�(R�MT�<��Pf;�q��>����1t�1������PO�����e����m~~2~��:����w�"��,�w������?�p�:!G=�������Ks`W����xmjwy�����w���cD����?����P^�r�� ����#_~~���W��������(�m���1iD�>=Q�Q��-wX D��@Xhhh(���P��R2��v4Q����B~UE>�d�g#��L3�+[��(f�G�H�O�S�������vvv�!#��Y��P�))� ��z�E���)�A����2����iy�>�
9-M�sy�1���N�������W3�����W�DV\�w��x$M�6�V`�H�f>o2G3�["�����k�3�	!k��L����.�X_j?Y�'Q[=�����yP�K��A��3JYY�#]��'�w���BJJJ��:����7��v������/8�����BC�l��u�����8�S�bC�G���d}�`,X��L:6>��,��<���y��M��'���[���3!p�����J�T����W:Uq�;0��������g����;�������o56c��>�&%%�K��t��?&k�[��LC�*���~N7w�Aw�V��y*%�bk^���5������!�"������m�1k�mU���i�Z�"=h��B}����		a�y�:;�}��6��d����upx�����!'��z��\YM�Z��a����[p��m�y\����[b��(��jQ�)�U������]�2����R���5����1I^&&"B��I��M��I~��Tt��}�N�����}7D���$&.>]����Y���c4(� �?��k��
QL/�vX��<�g��ns�cg�h����x�����Ak#����/w����t00E����x�p�����&�j�D�[E%��2�T#77?��o�;��Y4�YY��4�@'���t���S�����b� C�;Y����bz�n��h�X���N����4I��}�����gn��Y��O��������x�Ej�1���
����eqr�?�2<3r�&�����b��LTB��K���'���|5	m��x=���� A��T��-#��?B �XO]�o��8��{}dg(��$��3������k|�$H��]
'�&����FP��_�I%9<2�2J�9�j�7��"�{*)bX����mn�abam^�	���#�����&B����G���v��-*.�
	Q���z��0�����][[����4)��U08���CEij��~]���6J��j8��uy��)�o�� �C�{5J$�D�6OJ���OB���}���Ct�����oXp�,�uK�$N~R	mR�KE���a�]�9��K��&�W`[�<�O#������f)�4��((L����c6����z8�G��y���f_���q�h{s��lH�������T|�}Lqd���[��G)�6���-l��L�X4�*�G�r�\�6��P)������6&6vC_�B��A�|��,����L���r�_�a���=�:�N���l���qr~��D;���	@��EG�001�~�C&$�DP+���nQ5�����$�J���%6���G� ������Un�x���������K������Y����q��
������p�A��bI������(F3�Q�7�E�#y�$�������?i����8��Ou���d-�����������
d�+Va7�
I��?�!�#�0j�Q�R���������������ef�j-,���J%w�Z���.~�Ie�d9����{�Pd%�����*�W�`	"L$������B��r�u���.z����y�__�r��x�xy
���2�WG��!�b5��Z|f�V����7`�H9g�-@�D8fX���8|��� ��3�g���URf`��_��ZD��-/���G����2���1�����������(
?���2��g"z5 �z����lQ�J��&&���ff�����.k:��^'K��J/&���E��|7L����������40G����c�n02b�����]����+�*��3Y�9'�l����W�t\������6V���������Z�����~�0l3y�'�)�s����K`��o��Y�,�z}{(�n�`�L�����6q[�gVV��t������5GLZw���F�z�l"M����������K�+������ki�H����F�w6�t_�>��i��2�T�^T����vv��>��Q		����O������9���1���N�@_z	z��w�~"7n	���:�����:�y��	K^)u��'�??�z����e�^d���tg!��"��=!V��g�r��},m~�kGx���d��b'���7��x���o��
�x�k�$�S����$����NHt��=�����U�9�jwr`W��	#"*z�Ch���+�)����N���g��GGF��N��s�tttN�Y�M�O���,q��F@���s�J&�@�����zp�MddYF���<���D�%�F���C�ZJr���k3�����������v�������3!\�.)'������2)����p�����/rt���YB�6�{��gd����eB2��ZY��A0@^�q�8Lho��8�^U\m���o@0�(0|
 q�$%������H��}��F�����P��^��?���{�U�-�a L��)�_�S���P ���GA\j,y���	��~~����7$Fg���H����Z��W��2�O�#�������J�F�`f�S�~j#~�����s�8�������Aj��� �Ys@+DP����zu1��.�#==��a�
����i��*����.2&:���Z��F�m={KFhm��4����*66�V������c���j_THu�3v��VA	i���lJv���^7G�Qd0�_"�I�F@�S$Q��z�j3}d�d��wd�T0��_l9���6=�7*7"�������]n������k���bw����h�<�C���ti��|��(f�����}q���[�����Xl��L��t�����a`��+�L,�� ���kc0	��z��g��\z�	������$yK��_f�P���c����������>Ae��X��2	I@{����6�Fn���}���������}��'h0�c�NJ��r`���*E+�D����g"�5�����B�|��utja�&po��bcc�e_�����n4���l���$a�v	���I�#������66l�������dk��A4+��rU������H#��������s�Q�`��,~`�/~wH�����ac�ta�Y����{�|����sp��)bR���L�SRR�?=����y��*�C���������30�Xa��S����@�T�@GU��xwe�*��6'1�d6
{y��.���Q����Cz�q{!2���]���k����<}*��O[��;�y�������:���
k�p��-��%�������I����p;<���.��|�������}}����:ku�Hw;�AX����x�$!���"�V��Vs����b�Zh�����Eke��Fs>!E�ta.]��c���,��N���^wO�*������W�ns�n���R���J�c��������$����������1_�P��"��"��'�=��=}�/���S32��,�U%bhC��g���7g��A�����EP	�As�C���������'��f�������G;��9#+���-@>�G|���|�VVW�P��~�)��Ot_SpiMj�-,�<4�myn�����������7��	h��&&&/F��8��dM�3C��O��	���\\k���4��g�_�L�"{�Q���S�������}���s��]��:jk�����2Yxx���8�Y�?�{C��{��0��
QS33�"{��w��.�����[
�B�� DZ@��_#C	:F�(6$2&�"�����@v�4T�E��*��2�Ts��z�c��2X�;��v~��mT?���L.���t
���Ls��H)������'����o����?`j��wl�;)��2������Zq�&�7���}�|Wu�X\�M��W��T�,���j���HN�P�:21�@NN��2������x�E��+|(�M�V]9�r���c�������Ln�%���ge��b����0���ZD������}Fa�+_-~b��@r[���a0�{S���o�~�8�|�"���y8C3���c�����/66����Y��:Y ���F�n��`;��,���������>�1'�����/�����4���NN�N����fVG�qUt�i\y>^y;W#���!p8����S�����F�����'�����P:eee2�?��-Y�Y��Y�{��`Zg�N�YT�1��'84�KL�-o�[XLO7�3ul�MG�*�7������~��R���t0w�c\"$�0[�f!����
t*����|!z���z��U|
(����|���,BQPP`���o`��b�!��e�F6�*��/��dQJ.��#���L����1m@�2��Q�]��y]Yu/$00�����Wj$�<l��'�����<M.����5��y�@+�RS���y�)((��@�i��aQ�;�w��&�@������O�-�|��B���ru_��,d[gg�g��mW�x$'5�D��`��K��F5�:B#No��[_��?����b�Y��\��9������7��M����}��q#"O��m��K�Hbz{y��R��o�r�6}~�&��� �z��:T�)P���01(�z ��	Q������Z������_���/�iX����y*���!��Q�.��y�W)O,oO9_��0]��mH������R������9�W����r�T5}z�QYcq����T�o��\�@��t���|FFF(���Tm����K���2M��QZ%&�Z1H��E�[j�Qt�z���E��4���5{��Lf�yc�u�)z�p{��F�S$��y[TR�p��|(6�RY�'�����%s�+������ lQ����}o�*��7��/!��lS�������f���IYG?Rev]E�f��t.D3���L���-�
��#�[�$0���Y`��
����}�(&�n@_<���?@6��dg�HjG�^�������+�cAH���"*���M�#u��;������� 7w�!���o����"��m9PWW����a�%����������hs
EKG���)!Q���i����S�Gw���`G���8�!{�����8�>��a���+�X��A�G�/�u��jd����P�Xt��������A����������(�~;.4Y�ZL<��<������+�0P��@&��Ft~��N�z���N��7��cO��o�Bvd���,	����z�y���Vz�|iyE�n��;K��,�%_���H, �`��S�Jp��V��J�5(�8nCt@
��+������sp��`l>����G�(�-��uG��g�|��|J$���RO��G�g"K"~���G*����QR��1�@���DuX]����[���^�L���Mw+������p�'�T�yz�z�����#����:n�����O�87�o�IyA������9O�)z��II��ng��qrr�tT�l�g(�����}��tCX�RRR���d3XY�*Ui:<��A$���S�9g�/M�`����iH��tl������d���;[���3w,�� ���d��<H�]��`�pn~>4���"�����T�����5�\�����pG�a��SJ�	�a���Y���;���������__����-��9pBq�2Y�%��[��:[�m7#:������G]�����q�xzz202���(v���M3�8fT{��d��sJ������U�Zpp��U������3��'EK���
2k��4{q�	�|��I���KH���"iA�����kR���������01a�����[bn����[N��t0!��J"��6�N�;f;�*cXCH��k��)t�K�����E��X��p��T^.#;;>���7pF����fff�����|��JU%��	q�
 �B�����c�s��m�a�A��a���$�C�'�Hm���J��3(A�Fn<�&��������u=ll�	���������jWy�>f.�e��������U�������/�;��4�:���-�Vi3��!���}�A����"1]�����u�w7?���g�{�7��^���C���B-�-3���<�%9(
D���1�=	o���Q*������5�a=��9����4���/�j�')h���
�H���~�*Q�
p�����;�0/�lq\*$$��=V��0g}aj�Tf���#Z�=f������������qA�E2HZ������u�����xn�Ff�G�.ll��.��'}\
\~����2�M3��e}���%a��������'��) 3�5������/�,ys|���:K��EH1�6��������Zf����
�k�Q������#��~�&�1KR��q�?/�T��"�����y1x���[��������n��8�l@e��3�S�v6%DTI��>f_U��P�`���P��<���#��{%9�3C��o��p+���;��)e���'�S�����R"�����BA7��EILcbS%>���Q��_�Q�����m��'��8����`�
������zi�VC>������L�T�Z�r��A+k�+��L��EE�C���h7��4�cbb��!����}�7�������Y�\sIM���{���Q��;Pu=)� %�E�?���+����C���M�q���4��>\_>LV�_�G��Y�sMf����<�0�y/���D�~cw���0��Cy{{Cb�]e3h��W�h8�\�|C��V�>��P�Yt���4�&�@�����^#���*�����,�t,��e������g�p��7k�h�
�5�����������{>s�o�������b 'm��;�������F-��l�����h��(?���/7:�Rl�[��|``���+8!�0�/t/$o~�F.5��'�!�fY�����VkG66f�����%�n{xxL��c���e���Y*����.475�XcH���
���^R�w�.��[����D[��
{C��q����Z2G�/��5��z��)������~s=���f<w��~�5�p�+E�������@6���q��R����7��+�$b7�a1Ai��Z�}�����'����V�B�+�n&��P��y5t�{F����A���}P5��(H`�k�6��gGJ]�����N4~8F�p�-�"i0#�k�G���AJ�)w���2��P��9j��*�M��K�FFF��,�Ho��h���,�	#5l����
8W='�����������gSS�n�Il��L���#%A��8Mu��}����	*��e,�:u+F���9�P��Y��u������O���nJ����=��5����}���
	.���|��'E��������RTc|�-���2��6Y[h��66������@��Y�������1������v�~zj
���+-'7[{~�pq�p
^�~��Z�_5:��}rZ?�yu�pm�Y��bV���N��Nd�C��&������D�W���.��[d�����|e0��
:_����pn�/==���D�L���������A���{*�����
]��|{rr���NS��ltM��T�L����i��S�I�����K������$�b���M�p����.���������E}q.�����{��S��?1��}�h&�Mr2���;X	�%/)GG��|mx"����bY������t����}/�)�t{[�l�[�O�<A�H�S�L�0T�61nzy�uxx���1 *��VdB�����Mx<57����������/��5/&��m~�*}�����7�&7�����7��7>;=�]��P3fCv�wU	�.���������h�4%����L3�Ps��d�4!��n�%�"��>53�����?����e�|M���� q��'+��f*`����u<�!�`��
��K��s����g��Wy��.��U����O����a
9-@~.t'	���s^At\���
�:3e
������)).R
��3X�������Y�V�b�����/�A�M��)������{���Xi��.o��H����M��E��I�>�O�������,B�������T����Z
����������lll�P���d�>|������G|z�mK��nj�~��H���p�|������\p@�����zRtt�F�#V�5��7qq��v�=��hs��V�_�o�jkkkU��9���*�c�ACC�TBd��B�Jm��A��}~���nF:&�t��1#��5��?R��Qj�%�yPmD	��_�F�V��k����QN�����Q��8�K�����&i�����.���#L�}����,�R$�W��6��B�!�z�������Y[{��:_�>������&�?���A��?��L����z�O��o����'�UWN[����Lss������(�M��_z3���T1Oyy�CHqt�9��<R]��+��*�T.���p���>���C0�1+t��(s?WUyn�A.;y�Z>Q3�XS�V>������30L���7��t����z+�,�����CX��ArK;;�A�l���|������F��K��X�bLd���pq��w��u�����~�#N�����i,��k������g�E~*�n6�vi�+���R @=\Fa���������y��+�r��Oq����s�'O2�������������g��/A_���U�)����q���bk.�������VQ[>�����>M_�1�:�GQ���}b&3wpYW�"y�P��Z�����#��Iy��������#�}ze%9����;�x\��
,�����W��J�7o��Z���������i	O��,���
�~s�.�x25��J�z���5�[of�2:0�=�GV�����|(���G��;0����`���������_�����W����ol����uK�������++Vb�������������E����/�9a~�j=J
����z�2n�`n}�Y%9\��3���W���oa
"k{��^$�H����F�i�d>![����0���!��=�����1i`����p!#p�<<W�������=H�#j����D�)_��)�>���,B���6)��w����� [ $��Uo������W^B��EE��>:�$��x�ydfe���P'������e������;�0�����L{IG��S�������zl|)KD1?=�*������A�����Cv��FE����	:�o��(,'\�M�{�kv��7��q��Anfs�M�uR���'i�R�w\���rH�k<�����_�A�r6`2]���R��$��o6U�{����_+Ug���r��v��"������"��\ZZ������v|���N������<��/a��z�����dx4��\0*2�r8��WR��Z�		�*{v5�V��\�_����G�'h�"�}�\u�����\�=<D�h��O����������]�/6�x(���$�`WP�L*�]�����B��������d>^y�����jl��|���!X�iH�����%% �SK>�

1��YTt����������+/CB����H~OA�#uR��#||VC���C5���Ib�Gm�7]%u+�KL;�����?.�C*�S%�3#^!��+d���0����>�Q���0��UR��\�?=���Y ��FT��Fb���\�-��}+29�����(/��7�Z�D�U,'�C��@6o��;����B}q�����z���x+��n;/U�P�f7��$���%&�t�����7��I������@����mi�F�)�_\D*%�r���$��W�uf"��ad/����&��q�:�k��I���ZXX�|�r*�N'%�7���M�����j���TVKr�elVk��!�y�-����HRW�%��6�h���cB�n�b���	�����*X����#�#�lP�=�vvv��]J#5]�O��o��C�O�������]#73s))�A�
4?}����8q�M?�J���J?��������QQ��*��OPy�l��E���El��;wN\YYY��>��
�b�2*�Lz�71#��H:;�w���a@:kN@B'�{�P���PW'A����O5?\�f}$��D�t?�����uB��y���;���=F/W�K]������r��, =f���J���m��v�r��9^��R���$�y��~������������?��X���/}��#�[��&���S�s��h13R��(�q�����������}���IZh���m���W`���r�q��<���s�Q�����~H�|-�Q`��~#�X�����8�4(�Y�6%l���pZ�d����D���lj�F`p>���NN�;��3V�����T�(�b�����*6����W�vsZ�z����m���T	���O}e��.1}�RQQ�k.�&������f�7�����I��3�v?s��vn����JL��L����U!	4�-C��������I��|�w�kD��O��yy�w�4BV�a:��~�"�����Y����������F;V�CE�B���cuu���Xb5p\��+���`��m��LLM�{{<0�A8���(����*@zx=7A�~m`�v
�N�e�X�Fn�����S�����y�I�*���\>1��p�M�U���7#�":fg	b��;�>���**+����	
���cG*���sZc8��0�	|>�e�,���Gw�+�:=�� ���,�8�B���
!Rl�N�LGg�t���)-�$/A�p�QDH�������������5��2������J��q���K�����"�Y�i�H���3d�H�::��)T���=��,Q��|���x���p7sKK%���@�Fn<M��V��S���ig��u��M=���:����������<�%�[��9jYHeC��%�
�{mR�J�m�c'����z�r��~@m���Dn�a��I����)$����i�A����N��r���A�!;A��smW��*�x@�����	��E�(������a���9�����Z_��rIbB�h4�[)�����.��8(R���������DK8E����wJ$�������f�^Dj���o�����H��=��U�6������R��c�m��A���$�M0�7�U)�!����{����@�o�~��#�1�0�����a+  �������4$���&	9�����������\v�,*���FT]���p�cLR`�oH���������p��FLOKu�}������N+�7�����F��`�&�����T[G
yw��6b�WT@�\����ZO����?o��I��������\]{~F	��
�V�ye(�����E�y������K3^a����2w���	\�9���E��iwb���1Uo�e�����tH���?��$Rf�z�?�Ai�^u(>)�&��m-�����s�T �Q����?�r5��3��x���S��`*�V�1�
,,B@d�Z��D�v.��RS#�tY/��suqq_����G�����/�M�q�C������!G8�h���	]3??b���+���y�����2�)�"���]8���2fvv�r:OF����>�PUU}qzt��f�D�����t0�Vc�����������"!����98�-��.�7/^.[�%�@�e�Au�}T��&�o���|b^)��dFH?�z����W�]C��q�[[[�T:*�_x������u2:���l.�X���&�n_�0�����,#j��wn��A�qIt45�VG��"-QRR*�0���U����8��>9�TK�:Y��l�2Y����7=99101�,�v��!����uL��aK�4��*M�(����^q]QQ�	
f���#��{��C�BBx�"_]��V�2015��Skkk����A�d�6�u����@.�d� :w��N�F��"R�y>\�����&��E��69Oiv���1%��>�k!,��U������%0B��^���Z@FP6��`�e�I]��
���Wd��We���w38���ru�2�,��z�G�8�1V���� �����u�L�r�N�����'("j�W�.k������Y���;��Q�����yZ��7R�!���Hm���'d/^"5�)1I�����`Zk�������������w�>�I�%\������$�:�@"���=��w=-�
�s����{H�l����MA�}��vP�
F�a`��>� ��F��+��V������
R�A-��9�;y zs�w'�� R���&�M��s���'���@ �����eRR�_�����8���������;�i>@t40�d|��)����B*�/���'_����*��D�A�����.d�~�CH#���-�A���n�Ej�?�
���!�
���"�_g%������O�1�w8 ��IY��������{0~��o�*�������#� _@ R���F_��n3K����
G�`�4����:r�[��rv��c�n&5$���M�ww��by�!��K^Xv6��@�Z/�HM��J[�������@�v%%%=b�o�"�@��H�CHt�l���#���i=������3�$���\P���� ���n�tb��:�Q%��
G��{7n�������	����������z�^�z5<��������9~/�����c�pX6��u��d��o���h�����7��Mh���>tjj�2�IP�SSS�Wz������
�,g �sSf���g���`���X��^b�ZM_!�
���P5e	��Bh��}��|��C��j��_RO�>�w!	k���u�yz�N����0��m;%�������/~���[GX'5�Z^x����N����C�!�N�Y�nv�����{m*��2��������2�]�S�k�/:.�^@H.�
�=m�H����Ia����R1�>:e���azi)4I��-Q�`k�]��6������K�b������� ��d���d�����r8���rF7������=f�-\�a>���M)'�De�sW�RE��T��8;�"���
�F�a��o���x�A=:pr�����{(b��3
������#QE�oYr�Yh�Yj5��"�\�x��������<j��������e���w�����4�z�E
--�_�6�L�R�^  ��Y?�M]�Y6��Q�����e}��\F��C���f����5"��Xi�e�
����Z��
���]�'�:L��]:��!���O�(���p��T�$#{@U�0f4C \Um�^P1��=�)++Cj�FF�����rU'j<��lm)D�R�����Lu�]zV�����������j=d�����76�Z-��wl�^Bk���������C��%��,zh�YB!�����]Q��)���u`r�d�J��U��5��[�8;\HA�eg��\����:�P�a"5�\��$����@�;����9K%===26[T��f��I�C�%&&��������"#�� ��Q'z�d<Z�T�����
���������RV}�7������VkbaP�`�,����I1�,]b����H��J>��'c`@������
B��+��))���6�z�=�$D�������a��'���5�&���Bj*���.����tE�kB�'�U8,HM��8�bD*���=ab�1�;8(�w���b��iId]����
�"S�A��O9��o-	


D<V#7R�����+��h���� �Yw�������> Ag����%9���V�z������{�Tb��02������������0@Rch�_��^��<�b��,sm���(sT:�>��d��.�h4��_q7H�~�n�,���M��|``���w�s�IN�����M������t/�G!�IR__��������s��\�����TR�d�JKKL��QO3A�k���~HC��P����=��g� y�/]�������W������HuCo5��@�h�]� 
�����B�L�����&�^���V�[�%??\?L}Jz�"-'�89�/�/�.N\\��K�V^�>*�s:�yy$����P*@�/Y��MI<ueV{�A��8�Y�.����i��z�j�q��&����"������(d�>�,�$TH^I�.���pL����Z9xs���7�NN������S���b9�D6h>��<�v�E��e%�(D�k&���|�l��aX������F�YO2Ri��]�<R!�5v���yk�i|m��pV��#_���JMM�Q��a_��S�#�_9�6v�q�pILH�~�o�}�Fh�$1�pK�9����W
V��-�����-WMK� _�4\bj��|�?X����X[�k���@H8����|WE������Q��,W�Hb�T�e"��G�����������
����%|��I2��J���������Uv������7��-%3Y%��[��������9����s��u��8/�*�zd���W�/���?4p����g�m�>���y�.�_�<n�n@�
�/cFh���,���BTIMi��X	?�������/4m��}% �S�#�.@9��O1yyy��)��'��B33Y|wWb�!���@��u�������h� �L��d}h|}}����������tG��;�X"G������/3��3=2�d���
f�`��
���=��w�iaq������3����OB�99�hnDD������@
JPU�z���R�\2!99�����'�t%�gWTT�x�g�%-?�zP���	
���d�%���w3��1dee���DE�a�M"*9:9�+6(���f3=��<��Y��s����R�@/m������6���W�~�������9��_�[,4�[:;ke+�u%�������j����+����p�WOk�sT��J���;����Ts����}����{����*����)�cu���q���A,�=���O-���������H�g';0]��mp��r\����*1|���]�����0�tz����!PY�vos���h�C���]<<� tG_�TS�q�q�]}��*0�[���oq�O03w���9��?���S����X��x�����PU����R2��7x:�N��a�`���7He1����1<\���r��f�E����@����X��*�9�K2�}�NR^Q���m����tU�j7���9eD��?��7z������_�tVX�b���7z^Z*,++�J��kR�v�~o��2�������E
�������OU�hHE�(����='g\�����.��?����y�<��y�
8{0���:�����{{�����u��������o1d'����koo����������
���xs��74�p��-{��[I���w�J���R@��sZZ�����/�/��H��Y��OUa���B�n9�,4��`�~��w��^a�yZ��������W���$7�35B��D�~�����w��SE��~��Vk�/��,��7��f����
����2�����aK����K����l����2Fz�nM
GOHkZZ88�D�Xm���205���/�'*��p 9�^��G,p��SS�i�@�����2c��4��$eF)R��/�a9Y�_�|A��P�I�[�F��v�#�"fMm�/��nl3�$��*����^�j��*Sj�<'�k]�`�op�%�o5$A4C�I�I���,8C��m�$�8�:�WP���e_�IJ�e�����+j��<�/�ty~>�������c��k+���?.��<��-3g�`��@�bPn�Fn|$����26T���z��N�V����; ���p�"����
������x��&L��X���
�`��3�y�����b��x�\��:&&�������J
�p����_���EL�������l99���w��GG�PJ�.G���
�k
���
\����W�o�O,������F���!�<��+%	��������������*4%%E
/4��.I_���Z��'Q`7?�����c���f��D�i���`��A!!Z&CV�2�3-o�T��3.��������^�Vpl�rQ$)-���%O����u�����V>�xeN���Au��;�/?�l5�:��0,��	`����wb����t��>�|�Qr�
���:p�	@'f�G�_����I�@<g���=�!E�m�=T�5�����P{����?�+�|��~�p?��� ���!����4�������������ExbR����J�G�����~I$���H�F�A��v���I�`�?�������	),���p�������������prf�Y8��3����`Bg��NMLL�E?�[����~���O����;����������
�	ITy]�$���UF�Q��!����*v�n��SM6��q��������������r��6l�^�}��u.��M>��g���mf.���m�X������+�F��@0P�F�s\C��������RRR�oi��==�L1�����$�`�Yo��������?x�����ESE��/+kc}����������iKp��?�b�t����r���5x���YC�Ge|6��ni(����?�x����bp�]��K��!Y������ay�n5�����-�������oNz��Fw���4H8l���������{���C,�#av�� ��^8���@)�>kW����{�>V����6��c�'z��?U-�O��2W���\r����g�&@�6�������PB�������h��>�]e�I������	hBD�lC�)�M��3$���������#�X�JE3�����^9�w p�CH���Jt���ig_��&��Q�����$ ���SEHm2���?��8}�]�\����W�F_3��

ECC&�}<�f�Z�P����t�*���z�iNN��{{��(�=d��!@w����3Uv��v����#�x"�O��Y�~��+�J�JyDN���.[���B
^f_�9����t�������IJImE]����>R��8����������iii=����Wz��&�3�xoO�����t��LcM���k`���e�f��B,J���x�E��x)b*��N���<�����.��������mf�����/(��GHW�*�F�?{�&���W���k���\S��f������)����F�s���'''�����T��z�e�2^���������rXmp:���Q�,�q��7_|R0B�;��E|J��{����U�%v�$�'W��{?2�rt��-��h�6��������w������o���b;6I�b�����F@cW����:�02�O8}�5�H�����Q���Ncf��������D9�����@��i�cU�2��r������y�C�����223]����{QQ�>���7��Ym<����Q�������n���Y�&?�,`�&��',,�������L��C��CW�j��f�y�F�,��+�:���2*B�+�:S��:��u����FNx��]�cP�a
!���g�����;�?�����Ks���}�
.���KG�|���0rYd�m��W�N}�#��'�;o�n�5�h@�d�������r��\�vY��p�9�^�h$qC �-(���
9���U`V+������ 8�X7ow��!"xtp1������<=�q�;F����K"J�i�4- ��[H,��l;;;O -�<V��Z=��FmLY����J!Q��9�kf�;����S�=�x��Yk��+�91���8���bByy����4�}����.� ����������S���7�!��3Pll��������8�Qu�������b"x�|������a���0�J��w��K`��`���g&�n(je���:N�"�Ii��Q������>]G8���.f{x��y���+!�A�X�-e���5���Y�p�2$�'����G>}:��M���}�0$8*p�����r��''���(���+�fa���P���Yw///d�p�'+'Z[/�-D�9����j�t�7��������x�^���b��>�*�����G��px�-��k���p��]��655�E��	
~���������.a����]'���C��WB���4]��zC�9rH�0���.!��K��W�X/�����t�acc;�ydi�R���  c
���wO>]������PpI,H.\NYY��B�
���4i�����t1ep�V����:�2���uX�U�)�SP�Se��Q!�\%d�B��VD5�����u�r�����&�)�N�R }>+��@�����:��(�~\l�n�C���98v����`�8�����;������%Q����_TTT���G���"��j���L+[�D�����}��\��q��������f�<<<\�+*5��cb?T��}���d�%���I��r'C
FK;��7!!0}P��<�'�������L��V�g����Z���::�����3�s�gk1�9�. �H\��G��]��1�n/^�{�\�^���G���o�s�Lr�9Ftk�:���oE���vPSSC�(S�w��h��Ed01;;;��Kx��S���d��6�����������Q����B:��u}�����\��Mv���L�+�d����4�N��f;����-��<�H�0"����)�1����q5u ��-�����4�%�Y�_N�O��^�a�d�����u������R)��yj��4o�MQ��u1~�w
�.���#�^0/w{���P�����6�P$399ia��G��6���;��8������!"&������z����A3��,E�D�P�c�y�0^�.M����t�0���m��h��K.p5K����H]AhpY��H����E��>��w���H:����K1������M��N9w��q<`�H�y���vQ�����������w�4k�"�}s�I�>_�{f�{w
���0��q����"��$��A�F
O�8���@��'��Oi$"�2@��klu>���{K��WA<��{rv�_,8�F����a�eW����;	|gGo���,Y,��� 9c�*�X>G;Z��(�UQQ�4BBC<m��{���KJu=2$,��n�E���x]9�$���6�ba^����1�p�q	/+�������������f��M��ndK,�Iq������I�-5�D�/_�K���)TLJ�����5�}y�~�����D�5�t<f�5� �P���v�0����I�����t�G�y�=�c�nn��Pf.�)(��O�A����D� �
Tk������"��G����:����e3Kv
&C]up�����&|�[jrn�*�^��WQUE����@g\������b����/��J�1��~��G�}|���qR�S�mVVV���f09�P����!
������%����U_�}��oh�@����&�>��4����������K�����,X����G������d��m�z~�hx�x��js���Wj4w!J���`��������qM8����������{��?�V)R���������c+�0y��h���#��ed�_�#D]�'��1�iEx������*_���v�2pYI��(��Q�[LV��be)9�Q�e����~����[_��Svtvv����O�{�BB���"��i�	�J����kKWiXV�vE�"��[����_���Q�[��n�$�<WtQwWI�	��O����X�q�.{�����/[�K��{{,��V�vo�u�NN��#�n���S��E��(���~Jd7������1��cg�f����s���e@�F�~�8l�a���="���D�����{o������`l�b��!����7�%���LU,��S���9��i��u����P�+�R�f0��x�8��U,J%��
��������d�5�(wwm
�i qx���M��:����	�<������������8=�4<8h:����9�/W���w�
�]����S�V��{��U6P30<@�H��\�M�U�e�%
jH����[��'/����C
Eo���J�-`��E��4Nj���X2o�\-���-*���7�j�^Q�fc�`#��G�8��JC��n	���E���sj::N�z:b��F�o!��.���>�����{{���Q0��E;;k"u��@����)�x�cB�4�
3���A}&Hw�7V"�
8�����Ws����G�$=��?��63�������|x���5��{�@�������3b+j��'���D������� �%F�g�P�KI�@HH.|-��.sJG������RD�E��_��~��gC�T��Pi����^R�S�T�����	n��t�C���+_������*���;��-���,�"���
�]�8���md5���|�������<���W����l���)Mo\��2�w��*�&BR|[>R�����m�
�YKAj&*�oB�d��O��f��U��1j3�=$F3bw�~	��|�
�sQ���BXb��lz#�O�|� d��p��|y�A��hN�'�	�{`��hP��S�	�L)�)�~���f�?91a���r~g���KJK��6��eo������G�����!:�.��vT�J�i�?�70���pzne������t�����?�~�AUX��m�36��0�+�$���Mp�TT�1O���>�e��9�A�Y���I����L�����X���2��v�pro�� *��&`t�0)�;)�9:���_�h��ex�����.���L�2���_RE�d��o�pvvy��|�����_Gi+���x��Di	���E��p��7���y���*I�4,�WB����O1�`����5�
ckg�*J�p���BCq��oun����
�
����i%������'�#.��OqE�Q�u�~y`2��:��c�Weuz���s���=������a�����F��������AP5�R'���-d~h����8�}$��^��E��QG-���������������%`b��	�2V���^��-�<�B��x�k��s����8���:����(�KJ��Y��zp;���RRR$Q]�&��5������@�z$bN���T����mi�p QG�QZ�#���,�UN�s�'Z5�����q�S[�PZ#}F���k�G@�-�Cpp2Q>�`���������G��y��]�nf�z}���+B��*
�b�����";�����(���������?"��)t�/>\���1$�C1�y�C��#y�ZY�|[�_�z��������X��%zO���i��A�r"�T��o�IR� S�������P�������������N�J�?�\&�j���G�C��������c�% ���'v��)�>kOCC�	<���v��/R����,VT*�}$a\)���o��}���w�o�8�G[���u�<c��� �.?l+p�sc �|)���8��AZP}��"z���Z���.��`�����=7�F�#�I����UX_FoR��Y�QT��������rm�/j�<'kp�o$@4�h�['�=j�_�y���FXM��I�V����C�_|�u�]p���ZpG5�����U7�9�N�)
�`�M��P>�����dB��{��j������FF�NT>��`�mgk�����h&���'Nx$h��{7������7s__����d���9��\^5xa"T�:r�}�87����|k�.g_@I��ji���F�~g�)A@�O��O��Q|�7k;���,-������gg�7-N���
�r]���g���Y]S�P�p������d|Y�����UN�Y�o����`e�?<9�)�8/9&��J��8�ic(�._���������y�y���s���)���\+y�����]�
K����!�����T6���1xwl����~���-�YdP��g�K%��U��Yh��M���GFEU	�m�����:J/����&�O�mT��D��5�m@Pot��%���aQp���mB�
��C��i�8���Q}��R����s�Uv�3|�:S�t2AMX��SE�~,Y��DEE�kj�`��3��t����OeP0{a	��U��x����cfR�*2?��*�1���
?k7����s��0��3��g��H&  ������I�����g���v������t�90m$���nae�_��|�i�S�V��NF[|9����at�7`�����������l[���gw��lo�����(����N���S:���	��.~���zy�Nx������hr8����j�8S8nf� p6�4Q�������������PA�I�����av���@��B7����-��/ohMP������m��+.��c��%PM�D���+&�����2���%�H-O|J�s��7TX�R����x����3heH��+���{���Sw����ZV����`N_r4��iPf�VCG����{ob���2����0S�#������+��.���C��������Ufn�gW��0��\?�O@�14�5�:ouj�P����GE
�Ou�����_��������v����b��}��_�;��g�� ��~}�>]��/;����\�SX(����V�l_j��X��
A�3X��.�O}��U�^��������}�'����{����=Y^o������+E)�t�z���������`u���={���-��<�]��Qb�y_����$��yK�����k�|k�\Yg��K�?��^\��:����S}�Z?�r`��Z�-)4i���W?��t����8���*���K4jU�1�����������������1��u0<??����*7���i�2Z�������o#\&
���v��H����P
���b��CT����W�|�	�H��M	��
0P�����m�y��'��4��#���.��)�z8.��GG�"���V\,@@��F��;l����zZ������>��W�,�6���UPW�l�w]����'�k%�>I�rS��7C�2��`Df>�8%��Vp�8N�A�g��1�v���K��P`4.le���R�B_�.�an�;��g�������j ?�0��&�H�o�+��c ��U0�(����*:;��!��%&<�W^]tqe+�%;���o0���{e�1�������~$D[���7`bb��4� 8
�NV��lngbb"b(vfa�m
o��M>`��*�����z\h�;K4vu`Ra��e�@<�@hY����l�wgS������]�����o*����������?��N8Q��nRH�������Yl�T=)nn�K�/_��jf�R�"2�M��(���*���ML��}�BxE%^�4����y�������n�Y��|�y��C6y���`#���v�V6scE�*++���r"����zD�����M��.W�i���t!����oH���V��n0�����7G"��P�bk�������1�S�A�W�
�z6 t5T@���W�����������hEj��F���k�O�����*Q4_��e�}l��v�\,�I�vs������`��0Z"JJF�=?�����1����p{��#�����������xyTA�3T��(3�0(����z��0�(Rn�O�]���r�ndDi����+N�m|�:N��L��^���vA
�f_>SL��G�rUI���VW������_C��h
H$�66���zi�2��P�<f����*�c������+�|-#�@����Z��	#�Ez�s�f�VS��kE+&�B��~�j/hT��`�JZ8���{��s�-�:�'���0|���6O����	�s��)���,������-I�}���rT1�2���RLjj���H�KL�fo��A��B4����]Sv6[P�a�gE��2�fff��ggg�>f�����}�ue�"��<�LAS��efr��|=_�^��R���~~�pLr@�4�`&���y\x�������35u�y��^������b/�Y��:�qOe���0��q��'�	�{Y���g����K_�|�F��:��w%bcc������Y�����'��%��1�C�3���)��{3��Ev����`�:�v$�V;&6;H�������F�`i����o;?6-}|�����t>Dv��;�6Q����D��P666��/aY�2����B��q�d:�L��d��i��B.��\�gj��s�lM�1����cU7H������ �=.������z��i�~��^��!��5�[��ys8��/��!���#l3�H�_���V:I
~lnuu��B�B��:�H� �a�����*X�pk��<-���m�>��0�Ube``@SgYr���(_^���r��/���nws�r�%%':�\N�"������xJ����S����5"uC��������gx2^��/��d{��?�Q�(��,�(��aLG*]W&O�X_����������,:�������#_/l�u�<�u�	S����1�0&�ST�|aP"���'O��QdL��,�Zr����w�Cu�Lnv?MQd�
V"����e&��7���ymd�*�b�E�\ ��S��`���K�����h��w��y�zz��++O�����8�
��\1W��EEu����
�9j���$����8��?5|��,�"x�3hn�p�Z>��
8c��k�Wx�G�W��p�������2�H�����=5u�Qp���k�b���V�A��?:�)�C����nJ��R�5S"����)"����������������/o�CT���	S�.�x���9�� v9	<�]BjK��3�CD���������
��wW�ti��s=�2�B����[�yx�#v.ID��Q��e���o��L��a��3�O��V�<����{v1�KR����,�q�s��������=s�������?��Vj"�H���c}��@n�^�H��y��3eEp�W&��<yr�������K�����X�[y�?i����{���3��r!�N6G���[-��&I�*�g`Y�T���o-gj���Di�'��R�x��l������z�.�~�*�
�r}������MpowU��Qp([^d����]I������U�,=Pnyu55��'r�K�J������;8x��� ��/��'���L��}�x!J���lui)<,��G<pi!��O!��/^\�������Z2��{k����������i����Q>�.�+FK_�(��p��P���r��At�����TLL}<Hda�.d�s�5����D DE���K��o�$���� �����E���	ik�Z��������K����|��J���@b�1�-@�4���_3�ke���psw|�h����KU�Z��U�k�	�+4�B����R�h�%q�"]�����+���6��-��2�FnN�
+U�F�v	�����_4��-��Yu�A4�K_WWg����o�>������A�A������T!jtDR���"B��YHjj�'��d��R��+I0���C��h!���kiP������Ln_A�E���-�i��6���'O���$�~��������pqp�&Q�d^^^�������\���eeq�[���@`&?���!e��w�n���kd�����t������e���l��7�\o�C�I�$��YG�UM��Nk>$vww�����u�
O6<}�H)�Cs���9�<:yWix��o��$��[g��-t]01��e��3\	�i�)))m��	��=FJ�tyz�lR�u�B�P*�J����s�A��
�1+����A���
DEE1I82�I�6^^[B�z]
b�doc�}�w�d��������a�{��M�W��3��D{8Kk`�p�~�!���$���y���-�0�X�����c�qIg�bg�����������2)�4�+3o���4d��[w��4��7��
@�B&J���>u*�������744���*<�E��'��&�:�k'�T����������Cl{0�����������&��r�{J��,tH���q�P���[���|D���jj]o��b�^�o��I9�����/��}�������{@UgmkK[v=�"K>P�Q�*C��x�]�0���|�:�n'g_�y$�)/����:�xo�b������j�h>Z&��?����4)���b��F��'��=�Sdb�����'rx���ccz�fu����Z9��E�5�$��x���N_$��������h�O�&�jW_<��DMO�����>��Ca�Z��~{)�&�O
�J�j�gd�T���Z���ND��m����)i"8��5]q�L��}��+(�[�\�`���yx)�3�,{���G�����*�������(��''#���������}�iJ��#���������o��
;g��e�%_!T���_N����tw!v��*L~<�SS�D�H����|IV#%�w�Z9�P��(~�����}g'�������% kK���&����X �[�!D�Tz����j*?3�AH����Sw�T����0]���(����##��������^��c���_H �����D��:�E@�����I�V!���J[YJ�
�C��DF�������`�C����4x�R��* �c��������k������7q�fU��Jy~�<��C��{�u��|��U(�s��=+�^\��#�����q�
��989U6����r�F��u��Nt��s�l���rLDr
��B��.	��������S�����c�����FFFDo���NV],�������s�=���X���j���
e���7����W����� 9�����s���V*���?�������Z�P���!�~z-
�+h�DP��Q�Le������x��,?;���'o��a���bT�v%�g
��r;��2�9����C	�7g��|SS���oQ����5��/,4��#�b���
R���
���7Z]��h~���qvv�`"����K�7R\�K�t�������m��Nl����Q��������\�W�0y���]1	��N�����F����RG�=�Gl���-n�c�hzj��m]�yp}�B'��S�B�2o�#JK����b�48��;3��-J�\�,C�"M�6_�w���|��n?<JQLK��V�� YKKK�f����gp#cc�O���(����FqU���3��p�+b�5._|�R�A��:���cu��E�n�������uup�����$0Ex9�������6�'���m�#�g+�,�1��(V��\;�=~5����_�fH�#/��Y'mmm��j�N.�r���i�������8y�
����&����O�M!��H��,""���p���SJY� 
��3Cr��q���Pj�W&�f�sh}����G�)�a�sf�D����b��B����w�9���^O��}��IRFa�e�[���b����'�P�4��[r�A���Km5o^���k���V�������a���zz�V�III:��������(�3�O��D�	�����^t�D#X�0N!`PVV&����n�/�z�
"MQg3��;��T�Lq2����i��pu7%����B�������}H2F��I;�\����-p�����YMV�N�u�L�!
I�'�����2�!�
}��������Q>���H7��_R��Q��
�W
��3�gK����n���.���0�Hv���'�7��IiV�=���
����3X�dT4���Yk%�7PO�H�5
����s���qe�(6��r�$��H�c�j��
2�$��\�|=�(|6��=�8����-jp|�c����T�.��*{;���E=cp�������1���o��i��1���:��U$��p��ic�����(4�J��H���P.Hx9SZo��
�A�`�����#u�;E����	�Tb��4^�����!�h�?�k'q.]�t&�ue�uBvO>i�R�A��H�j{ym�$���?���`gp�%������F��e������'�>7x�8����
���A�e��
�8��F4�	����w}������_�+�\���RA���O��-�n����C2@r�KV�
q���#��\)���`�$�-;*K,�kXJ��y�6����(Qc�^1�l��:p4��lz��&/��#��������XM�FK������b
�
\��T�f�*-FC��bl�P���Yo��6�����J������e��.�cMhQqq����S:����;<�+����G?�����=�Eh'�E��Z<�tT���F��d�_��W�P���MA�/�~Y���/X9�q�
�)���C�����$���������H����|����u����<�����������g$����Nv��'��qI�m���5��	��^���)v��8b<��b���o ��0��'�d���3,u�
��}����+���20����P�AF��k��y�,Y1p����������@j�h�bYW���w�^i��%��������B^���/^�������,�3�UHc�w��&�)vo1�Q\��;��5�U��8r����'w~���bV��ln��R��&�P�k��������|�������:�I����������\!�i�1	�Z|�����!.!����O;����T�����y���vw��g���������{��D�[M��0�m������/Qcpm������o���D�����8D�w�AJ>'��)U��JW��?C����g�yT���h��s����RE�`���	1�mv�����/{82^�%���y>�\rT�%��[��og��d�����j� �W��f[g����L6���������3z�%��
_�fg��MsrqY���@�h� .�����s��}pq�0���q{����-�����m����D�ry�	C����HJ�����B��R����j�nH������o�==���I��������n�r�������A�IF����bKLww7Ji�ui��?�w|��8��������#[|��/��[e���D?���k0��>������R76�|��1��OR�w_/��"�0�j���4$�.��f"
�����H_������qR�M)�np�0��Cg���w0~���i�MM1P8��������j���I�C��.�7<��]�L�~b��o
���8	l���O[0���9��������7-���6l�����D���_�!��@eq�'a��5��u)���Y���EEF�w~��CV�x�J��]>E��'G���������.�c`E����8��6�ELrNGd�]���!��������55��`6x����������-�u�G���J�oL7#9r{{^������3���������������l�DvR\��%����n���RO��#��x$E�4��`�2�~&���#���uO&J\����}�n �J� �<�=+���#��r���?{��������,@���MT>(��}AIT_B,�W������ �B��(����M�[��%k��u�^K�����_h���p�f|�6�+�����(����o7�j�����	+���W5�-�P����X��z+�W5�ee�>d�!xd��D =��I#K�B{-�[�ULNtmN;

������n��YQimo�ADAQ\\<�<sh��	����x�%�����D��h8�D��7���H���Q����PDn<���%f���X�����|4��_h�5�m?V�b�L�,A�<��lbr���O������%5��V��k�"���+�����7MQ#i/���Z�����GGG���Ox��g��K���}�Wh(��+���%�[�[^<�����Q��r���}�	
3i_�N2��_���_Y���+R�V���m��A�0��
��EP�s'����?����D)c��_K�Sm��%%�@�Ih���X������'b��A��n��D�+���.��M����cQF���%��5�G������T�9a�X[�-
��G|/��2m��_�
)�sC����A���?g2	$b8�@������J���gK��GB�Hp�}^~�@�y%Mc ��7�M�A����^�zI�m�
�+U�' nt.~|]KK5I~�DK�Z��������pZ5^��W�w�I����ptt�(���L_��7�m�[��X�_w���s�r������q��|�QA����b`=s���nT���X�e-��`xUUU�r")F���h�"�Q�}E�������^sG�qpp����	�kK�f���Dw�\6����Q����(�.�N�r���OB��C���������..��(���F;��>�"�O��V�[m� p��e�-+�
�'-��0+��?�9}���o�%��ex��!��J�C�2��(�D=���6�4-i�%�8�����h����!^�''���%|,$��v�o��}wq�+��(��	W�,��K�(�%_��t�:����u�����5:�]F]�Q�_h"D�C��`����&8��d��G�1����e]�;�������_;�UhC�d����!���P�@���q)����+��s[T�����Z����W��/�)�����jV����Q�����;HII���q���i'11Q��@Q#l�A����d`�����oiii��V�P���G����-5o2���s)A6/�B9����<C�����j6%%e�r*�bY����g�K�4kD���������R��(��,.��i4��m~s������������!����Ek>���4����B����555���
�Z���������7��B���s�����[0���_l^(T70	�yT�[Xx�+���M�a�����LKH�Q^d!�Z��F��,��������(�l\�8'`��!juV��~
������qb�b��Aym-�"���.���4���|�C�<����W����/�q,�����d*��x)K���h��h����-I�����B��������99��0����rp�@��^04�aG1�2�E����J|����8�s����0�������gr�.��#Z0:M�&8�����!6�=7��%���Qw�J�!$RM��5YrdffF����V��F
Uc�)2����6���p0	�S�R�_P����2�%w�U�A�)���"\�{Q2���+}������t�����;����9:9�*����#$����5QHGGiG��$'���&�O	�e�{�'�I�L���x������Gs�����7#cc�I5l�^��R����89�.&F�6������2���8���Q��`�����>���g?yby�c	� ���u����l�===�qq��;�4]+H���#&&V�w�f&:���.5t���������w�v��I�Mr����������U������Eu�T,X�@r$z8�h)6,���n�y���4gJ��M���e��t��/�RW����p��3 $��:�>F-���$����u�+	�
�a0HO]Ss~o�7��i��q�1�r�q���-=����S�|����n���������n
�����o������t	�hA������]I��s�W4�����Z��TGW��1�%G������_�f`@���?lmm}���%@O5)	�G�9��>j�y���@�5M��H��WnJ����>s)��G%�)UK��V;��f�8b

A����k�������������������Tzh(.\�}�i�����;EC���Nvvv������@���]��/o�&_�<��P�C-�v���~��@�~g|r�X��3��(Z����h��C2-����:%�DHb��������[)�[����������I�y����2N����������e�J
���O���`�����Amw��-��3g��<5�79��RwJ��<1"H����X?D��&�w�))���w.�����~mu5��s�����;^j����+t�vT�uS�T�o�B��H�,6�I��]
��d2�����'kiO�D��AftU���?��9��z��������=�U������G'�-�f\I3��f^�:.g/����^����:y���,�_M�������j�N9��+���*��������644���)��y��a���o�du�kO��F�1��Vxo��������k��h���S���5�`{y���<�������*?	Z��i�3\���>G�,�\��[bQ����������uy	�'���2
�5U��@�*���N9��V�')l1�W���p���@�`(	��J!��3������%)f#���\p-����2�F����kj;�f���h��i�|�8�H�u�	NT�:���>�0!Q���#�!�8��q1O�|8�b5!1E����`�KJ�����������E�*[��r�OK�&��sR1�=A%?��Jm��%q_A��o�h__i	�)�;w� ������mJ��17
��}�'���BJLL
�0w��Fd`�������

�`���Z�o����D�
�����A��.���su�8�lll��W��q��K~}���u����}��Q{xx�m
D
�h`��{�P���?�������jV������%fErnnb`����o���X�Tou�{�y+JK���_�~)���5��Hj�������Y�C��C��M��JeVj�|`��?W��)j�=,�m�d�_��)k���M����#z��RS#QYY�	'�C�����0ju���J�X��������~u�������8jI����EC��K���������2��<��u3io����!)���'#67].��O��r�s���g�����P������X�Fu���G�:�q�U�+�c��u]�_Ad��5DIl���F0���c��������V5����@b��*I3�#"�U���sU��[L\�T�N�75\{�V�o�D�.O�	$�tx��65���2:��dk\��r���?�"���fR����c_�U����6}T��|��:EEh�L)�mt�/1����]^F*�%�	�l����o���"%"���%n>����I���	+"�r[��"����
�j����]��(�$����E����,"�s������%'%��	����&sF��K����q�����F��9�F�����U3m���!y���/����>�����V)�v���l���b
?����B9���?����3D�
�JG��RR��k��4��J��[��YT��vC���/�{�����f���6e���8��Y�����)�	���6XI�m�r������C�b�}����+>�;Qx�k�6�D�I)�?s@1B���h�(d���:�X��V@������}+nP��q(���QV'����=Z����������oP�}�F;
���~n�;��d�p
�����2B<r�*>����^1��T��@��_�D�����
`�����G����x�X�h7����������:�|����x����?��8Y�{[��*������gF����������������U	�=����#��<�x���h9�*1�[��d'c��f��������-��oss2.���KK
j�gg�M�Jq�T��
)�l���_f/�6����}��(>���|�p�wU�k4[^]={��/��k�
EE����^�R3��>������C��S�w�OhD�A0�I��lu���(�qg���@�s�o7k���R����w����]�$7���w;�x+.�t��I��V�����1{�^�~�������^/���.���f��d�O(���q�G'���+���e����k3��S�^�dec�WY�<FGJ�������a6���>�%H�B����9{��W�|,2����X<u�)ws1���%Z0�dw�L�I7�K����.?��?��g�yR������ N�<���W������S�7���8�����B��L_������)��7��H��Z�����[ZN�uU�����U$C��a���4Po����7�d���@F����,]^�8��~K��e���O9�9�e�O����y�;tS"?OP3�;sz���4a�tP���X����d
�rr-uuu�j*Cf������y(&���n}�����$2��Y\]��Q|7f*��==�h����6�~��$6�b�Vi`��WJ0�vRjC�r}�����<��N4����1(����2���:J�q_��u�YB��G6Y3z��"��dFN������A�F|��'q��y3�DVFF�V�5�*Q����
�,�������S9��k�=�Y+1w��B�;�dU��5��!�����|i<m�t��8�H��[6��ge`Lt���i��JE5�1���u��*�z+���s�G"X���:D�{r��d��[����������
5g4��y�s�]�AQ����Ll�����U��l?ylifLm�9?�M�;����P�S�h-H{����{��R����J-2?FV*>'y�s�aT�bc9/�;�� 7^~�x�'{���kQ����\�$GH��MYI���h��<��n���Z��hs��S�&%��8	h���x���y`��h��Z�j~�;x�����+{�#�Yo��z���ZTHHB�L�&8o1��W����kv����7y��xn��j��5�d|[NQ�;Ow����V�MY��HOxXX2d�i���p7�_�n=y���}�Z_Li�|
�i�
��V�G�������j��e�����~[����;1f��@��U�Aw?K��ev����t�`f���1��H��Y������X��>^6��L��<�#������o�������|����w�p�}Kr+M��8���p��rk���5���h#1v(
b+����[oAxtt&t�UXX������L5CW�o
f0�����v��8�8�����O[�H����JTDD'�b��Xk\|ul����������za
�Z��S�'����>�7F3%�f�Oe����p��������Z��d�V;�(�	o!nk����e[�C����e��^C�*���F���3a���X~����Vs�������&k�k	����p���1T��=v������hk��3T?�����n����&rU-������3��2���t&�k)����%3R�I���L��N�i�Ds��TS�vM	�5�C�b�U���!�GhZ��6��
�Gz�89�L���K�����7b.������^�q���V���Ca��0���2��8R���j`@��-�$��6��{Pd���z��F������Fq��`Bv��F%q�U��&
�e��4��Y�[�&]a��E��'�m�I��_���K{�7Z�6��Z��+�:C��G�SM��5r�<D8�$�&(�x5�n���s>�]�lR6��Z��� �w�o��3�R��^��_�Hi*�6��U���X%�n������rw�S�f�XUy����#�8�\��hs��7X����/���8���]v��:����9NN��[`��r�������*��[�����S0M�R��
�v7�I���D����4���X�qNr'%��w����b*�<���vJEKK��G�/��k�I�d�}����������!"�����O�6��,���2z�a�,K�fm���V����p���X����bC��$P@�+tB��2�lhe'�>�\K��c�L�FQ�s���
�(e�V0"�\�����[d	��j���#F�<������l�E�q���J����|Dxs,�����a��=$��z#6k��q��������"+K��"���&��C������������ �V�h�*��+����08�>����+��*�^9���j^�/$�Y�
��n����`ml���C9�Fm����B��u�2�\�T
u�����$K�-]-<��%S�8��& �}�Zt���[�#�	h��S��F�.�u����\����=HpL/����2����>�c�����V�E����n~YUm��I����%G����]�~@\
d9������K_�7�:mm����Yh`�z\F��&s���Dg��n�Eh�h�-�L��z19�����.	���
����@jo���2��=s����b@C�������:tx��P#��by�����2��c�[��h(�����I�rs��t�>�����,�B�a�}�E�Q��BN"��
)N�%�N���]�5zR�|e��H����ihHWN�.�d�����_�,��yo�n���q��O�������MS�&�Mz^��_PP��L�A���>@���!)���{�����{ff���h��������
Z�	��p}��g(�K���4U�nm�������mg&�
��y��N�/��L��>:$�
�LQd%��C�	g}3A�;w��_j���"�Ls�8����$��2�>x�QL>W�v��f���/b6����#g7z����%�-Z�����O&�~��Zu��U��P_^�0��
��)S��s`��B�%Imz�w���8��/��2u,���q�Svc�H�����sQx�SUNA����.�����&@\�����������h=o+>���a�zK��OYQ	���2��N��D
�I�����:�A���{G�a�# T����[l�Q�|�A�E��<���-�1 ?�s�Bt�*At�V��MV�3!��S���� d-�j������]�]t�������[��t1�yt���(������E'�������Z�!�P�_fA�
AX�u���{c�m��o=q�~f���S����Q���+�7�>��r���e� �
��C�j�i�S���@P���
x�j��*��H�'���x��=�Z��b����7���r��1Znk��'+��&|��aO�^���}g�������<��kj�U���$����9$9 A�.U������:�����L4��u�[A+�
�����q: ��$}�lD����R97V�/�\��b�y{����U���jc��Y~C���:?J�f9��<t�L0E�->�����/���%����_��\JM:0�1��)	BEUU�T�U-3xe�7�J��������V\����U��h�P�vf!�|��h)!U��Gy@R����Q`ma���%R&:fEs�����M��y�c���{��'M-v�:�$�a��8;c�b2�����]�����Iqas�B�SY����:�g@
-������&+8D
O7�N�4:�����Lr^\����V���
��>���J1.UW�"���	NA���K�.��/[�JU?��f���[��c�t��xJV�;�����������M�t�88n��D�����`(	���J���r}������IG�_~~��B�[��]���D�������e��84��������b����r�C�K4D����pR��X �s�Cg/�V�A�?%�k��=q�����/e�e��X��>�{/���}�8������/�|���mC""��f`�����em:_q���y+3��4�'�Z� za���{���';������&����B�L�Y����:d�[�5�����K�?� ����-���[��pH8)���7�����'��]��Ls,�Vf=�o���6
�z7I�C^.-9!o8��3>f8�$M�����:A�u�SQQ��D��5�[�\$�
T� ��j(���&�/����IUSS�b���4g�A���|�A���+[���f]B�v���������x�u�	�����=��������r��K>u�Z��5�0����7\�'L�W�@�*��%��[���;]��j�e*���w�_��Y��K�C�|��;���|a�N_v9�:x�R'�XV���7���t%�O>�tm�0i����>t���>�
|��]x:�4[-G��hPQ���~���\�gC^���!;�3��#"�F�@n�r�H ��x��CX�i�lO�Q������I�&mQ����,����"�xv�O7k�������s�Br����`*}�B������"��.�O�b�����{��t��'����p?I��j` ����\!�����%��>�bq+P�N�K���3�Sg?� a����G�U��yQ*����;����L4�)2����,������<����H���i
��B�i�������q�c��0�q�V�����Qg������2���<
A1o������zO������9e���IY���8G���R��e)n&�v���HP����o�����1�6����3X��~���cH�1��\��*�M3,�X���e�H��%��Dei*7����om�rH�[zKX��|��'���z��c03P�����[��gJ�I��+�$�����u��#���l��HK=���|�������F&��LSM�����m��r���E���������8����?�M��[),�0�go
]��s�x�Iw<�3��H��NXmB����EI�ve����"�=L��s���Po����kU��-��8�c��?����]:Zb���K0v�FD$�s/�P7���f��kk���>���V�	,��|����Y��cl�z�N�'���m���0���_}&�,���z�������v���?�`�/��/��GI~>�A�y^�[���X�"���:z��Sr�A'����3��;��������J���3�����d~��U�z�j�p��H���d���]^��
�,�����_����q_�C(���r�Q��L�J������.<��bz���w(*C�/�5�����
�B���I���8����O�G�,	$@cv��#9���TMK��������O�:ZC�
3v����G������K����#{$o��6���$��k���vf�~�E��kG��f��Y&m,z���}(���W
@���vY����t%�5��%o�%r�?P�kj�]��;��Am����t���xz���N[�g��EF��eviT�Z��M��j�]��S�f&/qs�Z_5�P��Z��W)��W�o7���E^�Zt����J���u�����(�^��l�W\�����nhxY[�2�+{g��9=���.9��G��al�z{{#�O��Sn��%:
���1�{p�,�U�+��
�Nf
3�P$��]��Y�:�i���I"���H�J�\�)U�R��������fK���8����l����l���Us�l��<���_j���� �](�8�����uC������i� �3L����s����>|��o������H>��������$
Yf{���})	�g�E*��a]b��X�O�MMT�Z-R7�~��7�w��������\�9N5)q��������x�u���Z9�����o}�+3�]�k#��?:��]�	Z�UJ�[�T$����uZ���������G�t%J����b��z�������J����-����B.5T�W<���wU[bE���%>��~���$�������:��:����1}!�o�`��D�C����w�
@��2�Ui�-:Av:��l�lm��2J�����C�����_�����vy�>�<H������{T;�P���!G�^��89�����"�1���e��*f6~NM��������.��Fi���`R�J=�!�����"�u����S����?�vE�v��!�N���dq��-]�R����yc/�F�H��#�]f���}BK��d������v�<s�.}������
�6����r����#'�cX�`�
u����Fo���a����!�/���6�0m������I���Mt�Dx"����*�t�X�������<�<N����
M��!`��w���,,���5��l�<�N��X���3����$}�?A����i�
�g�z��+��O9��z�S����r"�u��L�2���,�//�����Y��Ss$����4�q�r��pg[�����}���H�~
�L�5����^��������h>�Gr+���%d����H���D���b���`����S�h���Jie������H��;v*R4�T&g��)Q��i�I�`���	��m�����`�)_���m��`
�
=�C��!�R��O���h){��L�`����I9��$!�""^�w��B���Z���m�����"��I���P���bm� J������x���W
��������>���!�/��,����_�{�<U�t�!�l���k�Q9�B]����m
���9��������z[�>N�&�����i��y��+~����%������q��M�h�y�Y��(12A}W��%lg� o[�3���W�u:�}S�������.�&C��
,I�g�F���=�X���fG�z�9��e�����7u�b������ 1��1����K����-���D���ox�R(�����tR� �R�d+
6�{�70Scs�BO�������	�0b��g@/�0�/�C�|F�ckm�����	u$���c��u�\'�A��n���>a�~�Q�}5�~sd_�u�K��t�uc'����=�����Jp�A�I�gA�K��B�W^��\��W+��F��ua�>�W,�����R:(Q���L�1O��r��z��)������@��[�9|�K�������~�-����-5�W��^+�i~�-$�Y�������'K������M�o�ALG�[���5I�&�N��Z}��bzq����J�������~��#�u2��k���P�H�+S����6* Q��K�g�������!��#	���yMQ��op�Y��%�zt�'l�m@]�##O}�"��)?�6���W-���;��x.�ZS�-,��a��ze��� ������f��G�u[��d����we��%��O=�T���>7����kS��W{J�5�V��T_rNDD�#h{�j�+��O��>�GA�{3��=I�Y�z�����M�����69�Y�R��	�����TR��J�~e����.����&���.�6�G����`C�9�Q�:�H�r����@6�7�_���fh��`pY:�eL��������Q��m����S�����
JFu?����[��_p�U��	GD:����;�@5��B�r<
�Xx� �?U��dXJ��_+A�
��R�U��;�5�p�j�E<2'� �r����Zd��(�	���W[��_����L�����*-�3]�f�VU�����o��Vk/	�_E+�\��@a����i����}��w�_���\)���������lm6�ug�$	�_�(8��"�X��IdG)e���[�kZ�]Q�v�|/g��L�w'�_�+3F�C��4�p���.��n=B�����~1�����I�Ph=��q�f��=Z�v����IB6����2]J8+�]���*������,�%g��1nmI���9K��0���J��G)2Yuz	�L4!������!�K��a�utt0y����y�M�!����C��}+�#6���Z+���~4'� ����2/tr��<�,Q���S�� ���2������N!AZj-�&�)����MK�l^�������p���������Z��U+/���?�����:a�kd~v��vG�T���qr��:�$8��V�el����)e��@�����PF��:�J_��z�<?&�P|��n�?�nk��0u�����i�9����mg���7����L?Y����V�6n?��m�}Z*�9!�Lb�#�B(� ���7�V�rF�6��&p��n��\1�����}	�\M��y4y�8P/����
���Mr�@0I+�����Gb�I�CL��4���g��7s��G�@2��<���'6�C����6�\��d@������A���������ARL	��Gr�����&j�6�P���/��~3S��������2���r���-����"�.^�k�-o�I�W2f8����a�?����t��M�8tfN�R�9��zj�u��;�H�3��s_R�+��j��_�
{�e�Ek�0����9|V�ur��kr�t�z����-d�%����(&����#:������jW�&&u}�v.�:s����V�I_]��@/�V�N���v������fN��(���a�b����*o���|
NN-�aff��
N����ej���7��K�,�>�o�	�$K��d����(��h��lc�3c��-H���t����3��`��z��x	H�.<���0����k�<1�k�nd.��l�(p��@:�t}\ :���"�P��c+j����i-�c���[sJ@;��������@��7��,o��3nO��xm���UU��/]�?���1����WHL��2ZZ�/��H� ����v=�f���k�������4�����I8{��{0�s�D�,��W�3�K��J���U�������~w�Z�����]h�Zk<��(`d5�N�H
yb�&�}����*������(5�+?�s��G}���=�J��TZ�����-�'Eq��O�����k��/EM:SNr���nO�F�,t������g:�>���{`��{^�36oO�����meb�����	A��k����;IV.5p��w���`9��@v��� G7.?�x�&b=�*��)hvD�\$9�%9&BF
��T�u6F�gt���Kh���X��A��n
�8�_
�2w�N����:5	�����}��X��.������!s���P���K&�H�7��U�d[	6���s��LBG�Q�;q���<��~��B�#S�w���4x�	]���)F[t���S)QFe�g�R��[vT�{�Y�xL�YtN 5>��E�\������=��Z
@X@8
M1D.��6��d�*Q��/G�4��)	oz�}����b���
d�My`�n�Z�G���J?�3!�o��-B���b7*���`DM����`j{qq4��G���,� $�I���������o�����������d�.�8�V	����&��1�3rp4�E��
8}����s�*E��_W��K��Q�����<���_��?/��N������_��~��z�N#���r8��,���Rd1�������/�T����G=^6���J!�3U��Zr��/�U8}��2��7�D+`%�T6h���m������Q.������w�I)�7��1�3�K��X3X��b�,���3O/��b�q%Nw=9�f�<�G�x��f[�U��f��#|�nv����T�D/�"�
*���d�I�T��S������,�r�\���}�����	�P@w����������TV_���H������}p��~��>��Mn
gc�.Nv�M��u����?�q��:��Z�������<��-��X;|���	EO�"�����m���r"�
{�<�v�x�������O]�&
����~�$�CY���
,���[3���!�(0l����@>����B$u*�\Xo����������v�����CM����������^z�j���;�������<~�c�)�ZN�v�zm`���9[K�'L���rB����Q]D������G�<�6�o�a�V����{D��c�+��t�:q�1n�9�U����/����/f����	���N��%�7[�V�Ha�I�����]�0��v:����.k�Ss�*���P�����l���q���[&6Q���@�jy��8i����M�Cv����[��
47S������%�k9�N�V�����-�V����4p�>�.�1������l���Z	���hz��{x��Bm^[�r����F��I~��t��������<e��c|t�\*��<vg�MHCSOG�����C0[Q!�I�yf�b�!�����{~�����I�����/�?��o��YA�M��.8���AY�,����$� �����"�(N�T����?�di��`o�����J��x,gG����m�_��G���S�>���i%|.2�_�|]��n& H���T'!!��>�)K���BSE�����~�q��U�~�g�"�������<j�Lq��d�.�s��]��8���UG��I���0"���z�2N���� ��v����Qjll���F�F�q����@G�.�0h
koah�f�(��OX�Ov����!��+�-�1W�/
�&��mDg>[����z��NxQ�����w�r<ID-E.�J�������X�8�,�B��T%�- ��&]��X�Y�!�u���$/�l�U��h����VBtUD/-b��XE���������2�r��hSl+��K�"���d���q���|����%,DO�>���#,$D���R��0�����nE�O3�[kW�dD��0>����7�E��m������LV��c���"�m3jh}���EP������b7�\��7g~���H7�����-x�.�����d�[�k�m�M>eNl�����?~L�;�������3�R��6q�U��~�j��D5�C`�w8��{=�$��J�;�f�������1B���E�Bj&����*���>���S�Ob*4j��,�gB�z�#�D����[N��M��6��\���	�HR5)z���M>�AAuP��L�v�j~����a>1|��,� p��af�Rp���N�D�U�.���s����.;b�(V5������(�eb���B+4��'+��s�)A��G�^���ei��iW��M�i$��na\�8C8�|=��V��"���8~�����(����>$�O�4���&�Xh����U��f��?q��,'�$�]��������X�wz�>�m	��8m�v�i��;��V��p�g��E��ogb��[#�Jx��M���2�a!22<��J�A��Ezp4���a�lp�{���;����������d_���U�\P+1��r�x�������E�'�}�:N	�yWK��[�w�e������I�(D��E�����|�I3T6��������]�G��-q���D�
�6��t���$%9D�0�LyN�h���W�6xOE�b��MF?����ZFW������!�9�l�>��w�.�aS�T���o��~=�)K�Z�x�%Cd�������r}��Iwv��M���.P���[j�����{�X~�3l�'�f�%�k����������yM?]���Tvs�PQUE�7t������F���m#A�x�>�Rt�j���y��x�F�]o����8p���<�l��Z&�V����9:Y���w���*������*�?%��"x���g������m�����6�e2#����`�6�����t&V������������I�
������ %�x� z`~A)]D���V�0t�[2D�/��y��R�WB�� �L:�e]���>)z�4���2���MF���X�}"��m�
���+�:��������r�7��O����yh�%�����.��O�m�N���MB���[o����� ��F�Rs�u�E�_�O��}$sr�H�j�������L�����@;NP�p�g�b�����rt�������5I^��9�F�f��%]	d3a�a�&�O9;<<����.1�h����6d���H�l��w��� ����%Z�e��/�l��k;����_�U��_��a�?��+]yl����6X4��h��/Dd���Y�s{��q[�~���SL�K��6`������m�
����`���Z�d�U)4������c������mX�N�T���X#��z��V���V����#.�~��[I�N���/�8��kB�b��
�q+�9���
�T#��"��b�E���i�G�����?�������D�b�n���x���];�������p�(�<>���(EZ]����O����(���v^5��X��+�����k��/�?����]{�M)%��B���R��-q���PKXF�S���PK9v�Z�*
 dst_10000.pngUT
_)~h�D~h�D~hux����T�i�.�m�V�n6��" ��$k+(  �
�-�TH�M�(h�T�d
(@�EhED@RA�P(���~��J�8�9��s����_kf����{����<;��/��e���y��5,���h�Y����5�#�9r�@~H�*�j;Z��_v�\�v���UG����{���.������G����^s��|}�����H�T�|�O��]tY���5��Z�z7�5k��Q>sJ�z�0��z�eG������5q3�~<|�p�^E��G������T���n&>��-��/\V���I���
����N�����p]4B�Ph���o�E��:�u���}�9�z�U�{���c��?�i�>�����y��_\%�������w������
_Z=�����6&3Z�c0%���bb))����T�={&p�H����?��T�b=�h�055��j��}�v1�����i&����x��z��}����X�AJ"�������k�;m]�mbZ�I�v����l�l�vG����KFdh����g:�j\/
7�O1�ti&���; �����X�u��Z��Zc�Z0���#�E�.������oo����dn9�������M/���2�{��]���&�C�)����8��XZn�y�z�������]����4<{�v���_�XR����xx��j��3�wY8�*���{�8��������������G�4�,��U���;�lom�������.j����{�&O�k����si��x������F�������>�d�N|�5���
��yVR>�����]\E;�|��l�]��G���CCB�����L�6���(�6�U�]e���~BR!���������9M�������r�y�������F3��_�G{�g)�lf�:�L`��}t�|�����,�\�����4���/(7���O�v�/���:t
�=~�sM����umX���-"����|�G��
?cB��g�`P|/���4�ty�}�����tyJdi�s�����'��{WS�qLt�b�4���k��9X�I�ci+�AI�������+�!��^����B,�.����1ocO�%���
��@��,7��	+�����n��	�)�c�2�R:LS5t,]"��u����C��i���}'j'�G�����F	jhh�12�a�$�UN���7����������M��&�s���d����~���=x�`��k�J��T��]��1����`��jB�0#�~[����~��������U�����dC�]bm�|����v�����o����wrp�����fg�8aP�������BYM�
?Lb��8$G�6u�����-��|���n>�fU$Fs�l���X���F8x���72��6��im�h)%V.-g���[���������cO9�a"��HG��g����C�<��y��
7����K��,..���iD����hii�\��������V���]��ly�u�.�}�Nijj�
����S������d�ed�~��i�����7��]�041��S1Fp�������0���|������u�b/��!�����sf0��P}�i��'��`*t�{�����}9�S�n�J�A|/����c���Di��{���!�����n������_��j<���1���� (H_]=PEE!��k��4}�D�Q��

f�X9/G �������o����~��z��_l6FH`(lf�q�6mK��m�$�v���I�������@}\s��?������BY`����H8��]Z��ID}�WF���H1�7?�}�c��k�28K�S9G�4����y�?o"�s���k�4G���E.�s��C���
gy|t�z���x
����7H���s����g�v�����d|r2}������+??p�Yb"%%�:�����u��h�����������|a�B���r��4]��\��L
������S�~�[���H���;k�=v�de����|E ���2���9�bL�����-��]��W�lw�LB1��v
u�QC�����K������7�m)	���?�L��~�����&i���2��~���J�dd}���L_��'U��N<�����\Y�������L~����)E34E�������iG�<����e��aG.j%W����H�����]�w'������}�]k����f���Q���(��&����X�x�keFnm���a'j$�+q!09dM|�#���8�AU���
�;H����k/^Dt�x�|��\����.�;,�`��w���A�����_Z��RZ�������S���B���S����^��Z��Q�v����ny�<9��zK��<{�O�d��6��v�%��[�x�/�_������KLG�<��t=�G>^��
+�s���z��cOO�Bn���L+�y������3��c��KK�~���kw�WT02�:(-f~�f>�K3�����;l��f7l�<�;��Y�H�$N��'u����u
+��3��iD�,z����sIG��:]�;�=��4l)@q�D��|o��$�����Y���	���E�33�oCCC�h��d��m�I9
Xu�A���v��b2��VI�����]��AF[�FLfnn�!S0���f���J�����0\s��SU)NV�s�������L��#94�|E�?����~������D��e��0;��-e���\�=q(>P2���\�����q����t� �1�`�_a�"
v!�@�T�h��C��������I�6��@�j�8�9�R�������x�8vw�����k��.x���4����-ya���Lv��_K���z����w��f���`�b~��v��*�c��d����������[C?���y���0�jG��������&��r���pb���6"����3
�J^�k7��PM%�����9����9����'���=t�
.X.��{c�fl���/D�mS0�=	�c����2������n�s���B��|4e�=���SCx�]u�����.B��F �*��h������e�W��)zX�yxx�G;���g����* h���\]��7K���%�!A�w�21t���>���z�_��-^������c��M>�M&mc;���K~�%���x1C��H�<����{
�CM��#��J5U�F��`%��6}�����m����|�� :���,M�`o1D�>�\��Y���:�  �I���\89��)��_YQQQ�c<�sjHOS.G���kwPz�n��[[UE$I������6;1L��nv�_�)��j�.��/~>
w.(/o*R��5j���d��i:�z��#�50��?��w�����[��j$;m ����!��3�V���I�9'vW�����)R.}6��Nv4RF���*`S�C������#�@��=�����4��3��K+t|��X�i���&�;���d��f��)0�6�{�@{wh��YV��r��!���a/�*,�~���p�J����#%#SmG8~\+�o��1�	�9�W��6Z���������N3[qX> �B����{t����k��D9�iPVn�J�	`A-��?��r����
��^~W]��3	P��KR3�Co1�N��0.�f�5�I�7~��a�,�w|�;"��94(����|/��
j�Y���=Q��I����>���M�R�G�@H��FFr.���7[7/�����[���=fk�sS�p=LG�E3�%"�M�h�+qcD+�+��+����Hp1���U��
�������+D���O
E32�c�3v�KH4�2��x�����NHK|u_����~��o���JQ�pi�6���m�Z[[I5�����)&���T��!xt"� �)1k��m��+�8�99w�����%��s��!��]~}{#F�w"��z��@���xM%������4Lh����ld�����V������m��e��i�����/�,�v�M�h#a"X�e
���/��v�����-_�������\v�<�s8������M�Bq�������A
	����u�����/����w��-��
�mE/�����y�=�~����[�]��I�Al�U�u�����P��7A8:�o�=|K���[�+�5�������H��������J{E��^����������d���<����
A�{�@�+������<6�ic�l]� �w���WOz7�_����'UF�Ax�����-{+�=K�\��������?T��w-i�0b M�x����V��_��5|b�jmm�'x�[�#I=i�<���)��?��*M������N��i(��n��W�����^yP@�c7�r��"��v$�N����9�jm?u=���{fl���P�����6����X0���F�j���c����t����������1�j���'Z��|�&3�^%K�FdH9�����o7��S��D��� ��������b�)����WQ+rX�/���Q���I��
Jp|"��
��~b�i(D�&��~���u���@�����D���5��U��=a�����Y��#7�^K[&�RpA������E�?�wOp-;�F���x�A(%y9 ����x�+���q����1���\-d�s�~���qnS3�+&LZ^��c�-g��0����P���k��^�"�s�u�ZDZq
"���r9���D�8!�w�9g�9�Hl�{�v�I[C��UAAA�/��">�
�F:Jww��/�c�J�&Xx��(�
��.��	��EFa�t�k�0��**��"�M��0�2{M5/\x���\WZ�0h�����"~s��k��~�a��8�]��������A�����������n��8C�/��-��d�HV���PD����N�G�a���`�Y:�m�/��un�����Z&v|�/%v(HJ�+,~�E'-�����;�l��'�8(�g*���p���f��c�������H���xHF�E��)i�%jRO����:��f:��@���0gk��������2�~���X���V��c;����N��vQQQ���G�q�d��lz/�� D�4m3����
n��#�6n�P��4L����������	E��v��@����\Q��#�Nz;�5��g����D1�\�m)�
�]��{>�udbp��'o��.D$3�3�����J��Mg��9���������%p�����~�\2�uq`�%��\�M#� ��{�OQ���hA�������&������B'��X���wg�*��$d������=�����n �������M�$#�+�K������c������M�)����[���=���C��E�'�de������fpq#��?���\Oe��H
�N��Lr�p{��L�S�[~^����E��y)
��T�V�����h	�s���nk�m�`"��u&�A��1�������y��	mYG���'���F�+�`3��t`��f�p}C��3��E�T�	���B�mQHx�B#Ap1q�gybp�}~rP�������iP���db|��5�QR2O�6>1�1<���2;����"t�2�1d�J]~��g����&)-�6���E0-n�#������p����cv[�J����G����d��h�#�!��+�����3�tWmb��z��r�������&���,[yd��=<<@�d��f5�i�ho}i�o��
�a���M�e����a�x���'���[<��Ar������M��4�/�Y��*)�G��z�����.���1�������n�����Q1C=����MHx����^�HP7�������cuj����e�������!"n���u�w�q����	�}�����T�<���W�WV���s:��nq�#��{��b����9�F�p��5���u4��^��f����+L�!�La�{��./-�x����w�P4�s�
�?T��	����y;��J�� ��Iw��[���^��O�KLLT�� P�s|�AI�[����8^��@��w�n���yl���1�����^KI^�pZ��=��@|M�d��G������L���r�,Q���W���L��h��mmB���
b���������'�>
u35��ML�'0�QQL�����7o��T����yZ��6��i�����!��ZBr2�$��
b��.z:c��Q��J5/A�gVp{�Qe7���|���q\N��2TC(�6�5y�������~�LXz�PG��Nw�����<������������$IdHIIy��u���
����Y��M��g���^���<����"��A�]v��`��
)1�����y������F�m�,/���/xKI�Vr��,�K�����'<*��#���e���M�fg_G�G������A��A���%)��"s�d���^%������7km���6;�[��{��>�K�u����q����������*+���-���J�=x� 	�����...�3#t�I��T�7��^%���NEH`����l}YA�L����M��`8�	?�`_@�p�l��}KfT��g/��R�������q���00x���A}S%+�����H��i�����w����}���6�KKL����f�	�*��LmM����,Zg���������ON"G����xY��gf>��������3&�RfS�O��A�E��o�(��#n��e2��,�����III�g�d����uJ�W7�2;������*�(�A�KV���	83j����}������J��{TR��q���_�������B��bO;�\�t>�M�%�&����{+:@;���1q����-��\�����F��\rdh�n���;oo�a���0i��FD;][��`v��������m�X���y/��r ��X��_����Pj�� 5�D+���O&+,)�Q��l�
�a7����<J�����3�����N .Cn��&�m�������L��oqz�V�b�Q����Q
�����@�P����Y�
����)wV�X�X�XZr�3�D�����|�Lmm��>��(������{����w��?���&���w�0I���H0�D�n�z�Bk�����ux��`��@D3���-*X���w�J����@����0	�V-B������m��h�W���}E�F� &�L:J|����I=�_� lme5���-7��;�������v���fV�
�p0,������_��/srr��Vi�� �g����)����#����~n���e� H04 ��������|�U7*��$)oq]���b3W����T�T������R�����w�`���\)^�g`i5��E����@w{!��-3x|g���:�������d2Y�xR�������p��\�k1L�5�$=0���2
�T��LERgg��.���/,lC�}5��l�x� /���������*[�JW�������F������lnl���=�~���*���r)TL079Bm�D�pz�F�oy|_H	������Q��h)���755Is	8pz���@�P�I���!Jb�G^����?y/R>�zzz�����J�]:\����S�RC0�� ����l�
��lCg����U4c����G/�`:_��~D�H�?���������rX���Tc�����B;;�by��m�_N��.SG��^���$wbr����_������T�
%j�GM�T�m��'�R�6)�'#�����,Ff��e���m���d������sQ�@��V-���i�v'�hY�<�-�n=G#&�~�������+&d������e������! �n�f@�\k�[>`� @��U�yv�<Bd���8����@|���8r'N�����L |_
/++s-�i��z��i�p��6�4�)�'O�u, &��@���w��8HD�V����4�����	�1������S��1�����4�a��m�F#=}��&JFh^��W[����Z�G�l���p��e���/ps����w��.j����(���|�x��Y����\��nnj!��"���^De���_fgi'I��_9�M�9E3�V����c�YY��x���Z��`��K����e[�M�f���tydT��-����2������S_r���_�4�����g�R���ty�?����}PD3Ji���$���r�,��/P������.����p�����?����iB
n�V��T�Hx">������AE�f`��>On��G{�����xE��_�Rf�K�6�����AhQ�<���0�U�|W�yyy9��CJ��0cg4�<�'d��1;���=?�ased������&_����&i������������;wl�����O�j���"��#Jb��������q���W*���'j f���
������	HKrH\�7�M}��7�~��O�>�x��Y��;��J.\���LC����i|��(�W��������#�;�t��7T"
��t����%>��%%%Z��O�,�GJi����������b��T�Kzl�����>���xn# $�1~]�����s��6�QsssT�������Q~�wp�����{�(��'g�@$j&O���Q�27 2�r�����
�<a�y�������t����~���	�wy+vtt���C{�!�o�F{5h0��
Rt�z��4]\�����.�e�����W�C�<���rQ�t�JW[�����W��y�Oe�dlr���6��
�vR
��:���, ��[_��O�G� !�s�8�@�T����\�'9/_�Z�X0��)����&<7j�� �
;�����5����g�C�o���9�����K��
[&'5$Z�@�"��wb
T�)_��6����6V���u��pS�����,/WD�#��w���m�N��G�����:?T�4���uk��Di�����T���B� �����2g������\L��g*��:�O���6�,u��-f%�����+2�Z�����z��#R��o�@B����8c=%jK����?�����j����#��g�m��d[z��r����^�B��F4RbR���^}{���=��\b�"�t8&ArSA<�'��;��#BO����Q��+
+��7���Q�U��k��yue>C��o��k�\�\VV�yV�1}}}������-����n���$����B�������}��j=z}������-_H���F�T)�;;��.zJ�4>%1bc����Jo���d��>*�T�
N-�t���J_�����V��*n�t-VaN�!����������k�w�<<l{�=�R����v������0#�kO��4��{��V������X�1����(��e�����.�o�t�]���_�Z��O�����m�����;l%�y��H~��M8�����w~QQm;jZ���H��uO���VWWk�8G���������N7Y�v-P��f���>�������������B]�*�(q�V?^�?.*��?�*��������
�����_���p����.^�XU]�����
���`AM�ET��E�����[�S
��a�������FAA��{����]����C"#���d�����Y��U�%Bf����[
�)/3���'U�|�C��[�#?|[�5��NH���F��C��:�4�A���_��5l�����*��|,���������f���Bm~M���,����V9,��k�U)����]�1�>�S���z������C#�U���*��4�;}�Ew�����j
����k���X��h�l�������������JQ��}���{V���X��������G��_.�e�e�R'.f����]���]EA���o��U�o�����v�������e�p���=,v�ni~�&����g�����||���e�~�=7v��l�0h�Y������O�)��o�g�e�[�\����s���=o?�_���G����m���~���o���G��h9�!��7o���KN�>�D��(���hb�m�3��h���y���\��������$pw�K�~	����Z�����L�p��S��k���������G	�BXw����Y'������Uo�����/�a�+v������n$]"���P�PC��7bF��O�0�V�<�]e�2����'���/�!��f��BB������DC������ ���3AP�X�������DU6)I#�_���>��Y�������H`��a��_�Y^�����zx]�.$&���
X^��N�U9�U��������oL��w����`n~^�H��4���F#��Z\x|M�;��l�����VK��y��[��o+=�����;�o���>��r��;wAO/�q������k���X����������>!�h��6�_O����Lm�_�Pn�
�=m�{q�
����XY�m�<��������t}�rI�����\���;o�i��m��\���SV���yQ���U�}����w��o�_K��!A		=��={�������#`�����20D�~K�K���y+���mu�_6��|��}{���Eo��n��ON^Y��W�����G�N�(��x����W�����S�����'����p����*#Y����n���
L�y2v��	����$^T]E-�9�mG���S�����\����
��5�aQ���#F���������i����
��K��������\GKk?���:����������^� ���k���#4����n2)2�)�xW��}c��NAQ��7t~>M;Y�����L����H{���9�,X��[S��>���ij��(�Ywm]�>�iWWW�������s~0����b��8�'\]���(K
����y���aV��2�m�s��(E�����F9
mG�{{��
}���2p�����1�UB`W��2."��%�i�1���Ij:��I��Oil$b��([6�_���o��i�K9��"t��x�Mz`ou8�W���9G��0Z��^^^��!���������An���_�'$�7�c���#o������P�������x�!*^?�y@�a}b�i����0�{��3� ���������pn7#���`��+&@�gus
�bL}�t����sZ�����}����5,�
�����'���+���>&��Ed��I��H�%�{w%�]~����}����"����k�.�Q��#G�����f����#�D����������4���sZ"..�$��+��A�&���)fggW����2�l��X���� B�SG��nqI
�W�	5r� ����o���\��Y����p��&�mq�������E�������T�qp���������We-s��n�C���/��#����|���W���v-��!����z�l�
�� 3�uP��Te��?���3gn?~\��0���Kh�%�iD������M��0LDV��y��)�S��69fL��6���Pg�����L�����!��Y�0!�Cx����_�bG@���#��Z<���a��r���6�����H���h(,%���7$�7 ++�&��C�te�V�0����������=�
�n�G	a�;�k�N��-��TUU*{���fC���q:� ��!�1R4�N�[Yb�<y�,�/�[��e����������ON�)����?��y��

W�������.M��aSSSJ����'�Q��SR������(��J��R��(�9��������rr�v��)���"��e�HQll�^�S#Y���&�X�������&�g���md�s�>��\AE4����|�]M<zC7��c�Xw��<��UXY|�����~����&��%''�"(��1�#_����*'�GQ�<&B�������w?B��(}��������	���������L�c��� n9�)TG��m�����������3"���C�<�
:����ZO�U��U����w���Q�|�G?�2����R�l_��s�
8)lyi�x�73BG�zpw����#5����?Q>�_w~�t%cia��z�?���~5���(o�n��G�
v<�Gj�w������s�666~.�j��9T�f�Q�H�V|Q��(��J�����\LM����[�/����
�����(���!$����A0-�]r����@#=0�b�G�y��P�B��1�eKOe����|�r[�S<Zq���)����L6�������y��G�? ��hy��o+�D���T���7,����-�"n�<�fOp�^2A�����R�|���]�w�9v�������
5�&E����@M��NQ�i�9+�� �\)���)9���NR�)0��r��8^����`����or_�����Z�#��GK�m�U��#u?�i�$��9�-���P?�����,�s��y�g����8�����4����?*S����
��g,��jO(�>���k���O���U��o���\�@��V�����CM�d����q���6��$H�4hLFc�
�lf������<�\���*����p�c�e�%�������h"���lmG�*�)S�{�����	�c��?�wz��?�^��n�$j]'���	@G�J�����d:y�?��(��3���	����R��jN�z���.�
`���3w)d6^��M��<�������2�m�6���Xd'��|t/�����UU�����*��&��d2�>�FR�#�w=�B��6n�����"�k���y�9�Um��^_��z@p"�&A�p�'���.w?��P^$���:)��{�K8�����
f��QM�`a�d�����I������\���c``@�t�i��j�tWS��F�4��Q5S^Q!�;3w���������s,��T��<M��h����u�X��10���N�S�~G��}��K}�e5��}��bNH�%��������A
�����a�L���B�F�<uD���C8E����&���~;�:XjU���k�� �s^��h�0d�EGG��=���C����$P(ZBQ)B�l2���U3���@����Oe�nM�S�Fy������H`���g��PB9g[��R�I 8�h���N!V@�����N��bl�������M~��z�NL��:��"���%�g����i�R9��$�#@%�����3)tm0[��gv������B�Wh"��V�=*��������{���i�pe>v�J�y�a"f���������o�@�����[�f-���4�[�*�z�
���;8x������S]r;�P��)�-8�h2E%%���@w���2
�O�{�5�����e���$~��5��V@@���H���R_g������D����j|UULe����m}�s=��������x����1�[��s�r&U���M�$��:}(S���b�������1ggg��_E����h�I�!�`|�����(�jb\w�8��6�@����a}�k�|t�0�>|����'_��U]tM�?g-��;��q����P(����?N*�Li��Cu�%��f��v��D��	���*���d��%o�`�6��b�>��5��o��Om�m�VNMMJiq�sf��>'��,��R!
u�����\Y�&6������7�n�gKJ��\�{�������7B��-���

N��O3i���I������0
<R�g�dw�s�iVei�|��S}%>v [������*�"��Bh��i'�Ou.����l�|�A0S��O�<W�{���
����u]hH*E3�gd�����5��[����!����*@����BQ�����3w�F qP��W�������G_�����i���(��18��n�}[�K23��S-�BOMU�X^%�{Y�+d������
�g�O����x� ���1+_����qU5A�wn�4?����.+�(hDH����;�5k������yh<
�S�.�'����stew4��}��6"��yZ�/�`�m����:��B��bl�<��pb��TN�r���CS����H�}������l����������m������)�8t�a
��&��4�a�i~a�f�d`W��G��.!���P������1
Y�xO%�!(�w6�[��p�$�3�ef!������[6�"/��^/R���t�"�|�'m��5�|��):�������A'�}�BB����{fo����_����E���x��!Tw�����	4
�Kt�4�����M���Z\[��[$�Na���,��v�tD���h������	�����
\������Y���'*e_�?(S�Z� �;F�_��_^^nK/tCC�	.�{~��|_�2���m�����x���}�'�������+(��q_`�S��h<�ty�>�����&��b��:�(2*
u��E��#����_��V<{VwH#:M&�s����F�G�gL�A��������������A<~����Zg''MO��/^�3rA�2I4�9m4x�b��HA*r54�X���#g�8���B�>D�n�>�-�1��V��K��
qn�  p ���lR22����������U�����r����4):Z���>���#3���/�Z�����y.�X3�2	=02�����Q>7�^��W����E�=eN���|���G/�
CS{@8c�-�N����������<:�(fe��]���� �>�'bY���)�Sw�]KfT��	~t�R�.>pKeA-�Dv�������`4k����CY��i����hw�KG�>>>���	��kq@��N�Jh��!��MG�Rt�Mt{�@��6�Iv�,��?p�mei�fR�g�H�38���>�p�G����@N���S�~_>����k�Ae�~����e-�h=�A�������a1��/����ap�?���^�����6��vz���cJ�s��[m�������]�c���|6`Ypii���p*R����"���'���X��9������h����,pU�Q��L|C�Y{��n
@N�P.J��!O������ ��(X�b�i(��JAxD-�����33�yt���'MrgM4+!�����0�n?��P�2��e�l�x����ST��Q�MlEFr^<��a���C�3�pg����ce�Tg''g:DG���*\�����l��r�M�yhq��KX������Qi��?>r������U��K��-/g?E�����O���=���p�����
L�����b����:�]�v�U�V��&�l�(�/�����4L|�+;����"Ye\^�{|^Z\~���s�9���A	� E7t����X����K+��iA!�P�QC	E��(7y
7|�~9��4q�������hOv�(�;w/�z�}����9,�M��x�������N/�G0*��:��Q�>�t�Y�������oj��\Yh���_r��K�c��.��a?X���l�����&d`u�8H�?�Pv���%y��Eif��;�9�<�MR�eT�EJ���=��Y����	�����Bjoo��j��9��R�t�����E�@tMl������w:?8%xKJB���t���
!!���'b��tPk]]�:�
�8����ODD�g��5*(q�0}T���k�dPf%�FFF@�4|uk;���u?\����O��45�FGoe[��s�.J��������������Ya���{u���=�7���2_���%|�x	�<`���.�%�����������\��.�q��}�-�C�f�n��_�t�1����_���r��8������U�ZDR}}�]���������lZtddzO���SSb^�6Z�U��Yi$�<��[XX��_~y.��%������tr&)Vt���� ��[�}�{n�;	���K�8m�n��]����9��+����<�,�{n�yz���C������<����u�ZV;�����,�6��rof��,..�.��r~h��t������ju�jp@������5��!dD:�!lY��7ol��f���5��u�Bz��ee��rj�]!&]�L4�jW����Y����H�=��hhq���w� ������<�Li����+�	��Qu�&��
�A���
�-~Z�{�Zi��XV.�wt�	����N����.^ePJMT}39��"�u�^rH��� P,\�V+��������Pf!8dpC��P�5�_����d��ee�;6�s��K�	��_�~���-yia��C�������$&-O�n�Fc!-4�9��3������F����[�?~�����"dn��l,�u����yu����������o��GH1&������1$����Xy�O$xe(Z��!*- 
��4R���\R�o��@��~�c��l������M�M�4hbih��8�@���z��1�#��O�C��]?<���F����q��P��)M���u]��hF���FA��������S
I����?���(Ka�a�������Q0��G+�x����Sht�����k�Qz����X����7o��0������ ����v���e��*x%$�h_2���R(%�!~���zd�3Q�������EDD������8��[}|�M�7�(;���K@
��S�YVK��"�j���2�i�����g�������V���B��%��
;��[���P��8��y���wAaa[�1�I�mc�i����h��2ip�0����N4��Y��*k]����~�x�h������`����G]F�.��:)�^Y�E�C����s�H{*�2���~���aAAA�!�H��/��,����<�JH����������[�(^PP�������e�&���Z��{7�P���50x��*(/���/m����Nj��@fff�X�"H���!9#C�4T�?J��=�
��D�`�u��t����F[�x���RSS�t7�xWm��8��<��r�}���E�J;b�tF:\
T1��-��l9����d����@'��yM�
���-p�3�Ue�+�d�(N�d�du��,�B4��2j�����QJ�,L3�yY��sj��p/�*��R1���
(�&k8:v����h~.''g�����H���F�����@�K��E��nc�E���������j-
����-���Ds�6@]����G�iAg��u���<x�l	x
*P5������is�����0��KN#HLHH@��53B���aaT��r�l���z �KHHH��{?"
��iZ����t��{B���4?�v<�w�U�����+����C��
4@���fQ�����h����kPd�~�
M������t���-a\�|(�^4m7��BA�H���)"�N��[ZG��Wj����:p���:Lk/�,��4L�B��g�H�n�K��6"�B��N_�����G1�W[(N`�wvG(����x�H/�.��x�����@����GyYu���.��e06��P"0������UVVR����LPR����8�x��-�aQ��sa}������22�W}������ ����2Jz�|�����g���r��i��o��'t����� r![FV�F�]�?�.7�h����A>p7D���X�[1|G���8BOTeC�}�]����C�����ee�c#���|z}�*��[�pB�����M
]�i@��FI�(��L-�.4���6�A��|���Y:h�X
��6�tW3����Q5--����<�))��
�X��2Q��B�)e�N������18��^�f<X������ J/a�'��>���>�
^[��H
���E�����9������O����s�.��[��0F��9�*#!���T,G��Q`a��_K�� �;�V���4kmmE�
bF|"���w�l���|�Nv�4z!�����v�)v�]���~@�h4�*N_ TQV�^���4f��������^E�����	nnn*����\%�?�����Z~E4ZnT�q��sAg�����W���z��lo���[��f�6����	{�L"L�(	Q�+0,y��}��8A�3����}(��T:�!�C�+2DN���S�tY�N\��?���D}D�^3vSC��Q��+�9Z�y�m���F�!���@����3P�OYT��6R/={��<A&��H#F�!�sj(���M�555^���f�i��p8\.x�>'�FO�6��1u
:3�:�'����IOB<#�\��33��U�B ���p�������d��A7c"���m,��������yt�:�����@��g�<��{�@���4F������������PQ�������X~Yfd��%����JW��,����=���>U�=-�H����3�\8���S�.��R�_�����k�L�f�������\G��Q�-h�� �+9�"���������_��>��'(�o��Ni\�����Za��(���"2D��
��{��>|0@�l������"�x}t�8�0%��2�'��������'d��++��:d��WTW3�j�GG�lO���==z
�
��	i3��C����-��D�!��5�����[�7�^d����0"yX8�����|||j��+���7�q��LgF���oQ?W�![9��T��xO%U���sphDR������C���9�}�9K���9�W<�������Js>��YYY����7<�|���u����)(�����W{0����1��{_������T�*2�*�������RE*B�%*����'�V�(��,QQPY��C����Ee[X ����':�s��:}������JH�<��������=���++����>�x�"���fg}��1�4�F!3P����f��O���|��{-�E�W t�I��r������Fd�3�w��}�?������C,�$i�H�Y-BB�KJ>D�V��\7�vd��lg�����K*Z)N8��
4IEJZZ��g����S��B�����
BN,�$	y��I��S�F�$�45p�D{o����"�an��=�a�
7��[���I<F.�v~#
���A\9.��0�Ixre����e���*t�������5t���-R�P�������+tO@o�����.�?���F����R���R�0Y�����.W}0��dfq����1��[L��:��!����c��d����C�v}`*)�������+��p����B*���7o��0V-���P~����U>����Cl�����E2t�m�M,����#��=9��M��X%�o���&�:���\P���i�����$�j�zh���i���y���=�!�h���4���������������{>%e�>�mW+��,�5�
�L	2��<P�)[�j�&�=>���paPE�[0x��s��X�F_��;�RH��5�*j11��_�����bC��hht��2BA�
;��br����6�)�W���-jE����LL��b�V|�+�`e/B��{��\��<h�5�����[*))��,��"�7l�����0&�(�:�t�{���!w���~���u�J���au���.$-��	�R���L��N�A��hM���ow�����/�p�,T��n���7��uDp.
FA�����Ck�q/�]``�
e\�ei�M�b���� Al�t12�a�����#�_C�q�khi����&;�����i���X�Z�<���G�b�O�WvI,����@&�U�j�
c5$B���M2g@R&I�ut}8"����Y������ID�8jy���ZB���V���#
lqt4���aF{�u�%%%�Y��������=������?%\���)?��5d�o?2�����N��{63���a2��#��K�"��_III��i*��\'%�,e��h�l���Z���)����?� ���o~�����V216�1�m�����y8�se�>{������G9�1�'/����f.���v�	����$%W����9Qp�f��'�F�;����_
1���������55����l���t����[�0K�aA;=6��=++���?�P�i��q�����8��I��%�h�`�
�����I��W�z�-[��'������(�_�	yc8�����s��;vd��;-�Mb�=���JNEA!��x�p�Lqq1�t���b��+A�x�� �xo��6��[��,)XCmO�w������A6��p�Zv������#5�0�6�%A\M9n�yqa��V�H�*���=Y����������\is�a��e
�:���v�|���[yr��9Bx�_�f8r��Y�o���Z0$0�p����|���d&�(����w�?���A�Z���|�p���E�n�n��Vsv�&&$l���Wdll�.�15o���9P#	�\AA���dy��Z�w�\O�ON�%iu��/�""b@�	��I�6?��W0�����v%�����]���}r�zN_�v��*�������'3�Z!__\8�!d��$UFo�u�N�R���������X*m��������.�����6�T���.�����]����F�M��������)��~������HX"�~���K�m��������Phkcc�rTZ���k����[����1W�|�(i�����y�����������6w^�c���#���_��$i�}����5���A�yy�c���F���&��SP��ew�>v��<5w�@4��xp��RU�H���Dt��1�����q���v��'��F�?����sL������:�Fm��<7�(���"*O�����NF��F������0	u�v"4��O�H�a|�M��>����Q�_�x��f�5�z���d�����QQ�C[_x?��x��-_�6J�]Ml����y�d�R�
�Mb�^S����H�>B�����s����II������$Y3���g���&������wi�af��#-@-�q�,��G������(xfK�'���q�r�I��{��9|'��"`��;I���-}�6�^z�"� �(�>�F�����/�d��V8���w��3����x7i��������L/�6�5���@��e]�|��nUA�*�Ca��G�f���,Y��t���p�����>=�4Z�`'����|�c��{�����t5��w���7b�<8�)����O���������1���:�x������
��3G��P�#�-u�q4h|��i��4�hy���CZ[�#w��;��A7���V:�����;�_��RB����S���o3���e��7�|����p�G3KB��T6�U���}K2zwjhb��:��3���	�jt��C�^�+{S#e�P`��AsY�����D����Z��g�C���l>���lG�PId�#�X!�Z��Rm�[�+P�n����|k�iTN54��3yr����NX��J���
'5���Vm&����,u_���:�@@j����>-+;�W�,�#'���c�1���7�o�0kxsvv��hI���r�����I�(>Bk��3�o�:>��m�L�����-��H�������b��~7>^&�Oq���{8`���2m�0�������GR�A���W�S�d��A��t]���=�\u<���G����`�r�+a�)�%9�$}���������|@O�
�Z�b*�f��s%>�|B��RN�'\]]i<�������!��|*%�yQ��J��b�1_�nk���� 5�����V�v2��7m/	
���TT��Hd���(�q���S�}�>:���#��(<j�8z�����p�X�1�� ���T]d���H�����G�p�m��������?��]�j��Ipn��D����������<��*v�J{?`1�dR?���"���h�Q�B��,�N`����Nt�+V����xO�<=,��6zd��+0(���&�C�D�v�u������s��~~��q���V]�
�*�������
9D:�9)�8�
���VW���i.�)U���P��x9�UA�
��������F`�����Wr��W�-��%�U���<��AX�h�VV��n=����&8����	������������P�L���a��;2Z�'� g��\)LJU��v������<����
�:}��}@��X��kA�3���<�bh�����17��_��������$�����G���/����,,,t�*�1�H<x�S���}�lY����SY[�A�k��_o�C�&�8"rss-F�1U\�Bq3������z��/s��;v���xB	%�
��I��WA�U�/���M����K��8��"��$���HG4< �E����.����*��ul>(�:G����O�,9���tGu�>8Ehf����6�I�4�����_o��k���1|���~*es�,
��Z��������m����K�O8H���A1���TD�lW�@������@S����5���M�)�|�j���������-'��ug���-x��#8F��CcH����.%�	98���#>~��$�������������oy&hn�&���m�<dx�j���Ow�4;��Z���PP
R)���Q��dY���9��?��:�A�a���rPHyx��������������y�gWn�|��(�����R_�)�k'u�J�Y��;F�$�TGWE";p�ybd\�$��yd)NX��m�h��R������K���\���z�|[������@��BNv7a��^���S���X8\�����)��F_�a��IF�MF�7���vn��������~$.`�j���l����~����|�n��h% ��bU�>�ojj
M�/�?��{����@�lcs���� �/A&	��������"�}��d<����(���������M�O���jHHt����|���It��
�I#���x��h�� ��]�v
��@������ZAM��mm�z_��=�YI^w����l+���qg�tC[7h	'}j�����hl<�T�?����IC�u�7{�K�N�q88�����<W��o
t�333���%�������p�`�E�����n[��H�vMK)�������r<

L����������a=���������(#����]���h�����};�����uQ�\R�L�CVZJ-@�
T\�
�m+��6w��
��hA������BY�g�~&�Mb�D���}z��Y]��������0���0�p{������7���B\|���+�*3�H{��Ez�~ �,y��I�����N�������j_����:������E�������5���r�R��P'ZN�����w�r��	���k���'�V��)�rr$p����{
)��W�8��F�u%�u���94AWp�}�E
�?s���K�a/-����������~�IJ��9,:����(��0�9����I���&��XRK��Fd�y8����u2�\�3������;��Zu��K���!�����\����@�NV�� ��z����N����G���66�)�%��,���H������6\AK���g�3��@���{�QN��.	B�~��d����}�j#-)�n=?Bph���s����'������5�,$��z���Gw��-���C��G=�l������&x|	�|+����a�������K��O2�������a�B�aP���@��m#Z���M���w��X�.�z/V�.�1�������F�RF�����N���R:����?��E���sm����km�	������6�����]
�E�E���"^sS'���>�hj2FH]�q�12�Q��MR�BH��L=1�C�!C\:=�#rg/��O�$ �o��A��P���wR��m�O��!K����Ad4��\�Gk�a}��e0�P���Hm;�M���{��g�S�~�e�xm:j�V46l��[7�D@�QU�� ��'���
�����:������i���U�1����������� ����o���1��������Ou�M���_zV+�
I��,���R���u�s$��/�t�������W�^Ep*�f_um#���Q�(8XY��/u*-����>����
j����������4?��F�&6����'���A��E>�BXX����%�����y�����"n�������|���Ak��������;���KC�e
j��������8,����6��Z�\&m�Vl����p��ME�����>������1w�n��&o�_7	}Q�(+�m�������yn�R���hn$��F����5�m�`�\�����������=z��m����+s��>�6�N�����yE�~���v.^P��;�R����������=s�g L��X*��2���b���&
�Y�l���$�b'�HSbb�������W
K��6�4�ld���x�����.G��}��g*+*��G�tee�T�H�:��h�55�#,
�;P9:}����ms�b��m��YY��,Y��'m�����(/����������,
�����9X�P�'�����d�D�hC|�����Wrd��	�L��~��;E
oix$�..���Oe|�j�������g�P��������+�n�:*�}:�/���U@�o���F��lLIbb"
��dt�2��0�Ykk[�����R��,���=�
�b�����U�4Gutt@(��>����k^m�	�����Eaz�"�*�{����������){�L���f�o��/�B��~<���R>N�%i��@���B�������K@�p�%�;@���T���E���6��Co,T�{X���}� ju'n��=�a?L^�a�`��qT�����9��yF���P**�������3�W�_o�@*n�H��>���u}�~XB1�P���{���@����,hI�=�V���9��O�Gs�����H�� K�d�������9�Q?����>���{��r���3��=�Y4��55�2�if���#:�	����}��"��8b�����3P&��M��99%C�`����8�l�gH�u�ZE��q����At�?/���P
�~��A�H�Cl��;��3��W%��2z��?n�6r���|z1���g$SS�f�.>=84����z��qd�u?�)E�O��/(QZ����-��7�����%w����������P�|��8�C1����k$�$���S���e?��o���o��]���p��N<�.m�N�@�{1~���������p_�"�t���[�L��V�h#>��������
t�|����4�?o����`M���d���\tK��H����+I���4\Pk�y�)�i�8%�9|`����Y+�/8|S����O
����=�mI�����!mb��lXf �]TB�0�Q8.������i���#VW�;}�7-���)B������.un���i�7;)�������[�Z5�m����.���/�|��:7���� j��X��H�[+�]J*�4�����`;��Z��VF���V~/�"�w�^���l�����l�:$�Jm�1����zEg�u���n�PB�z~�6���d���^}o�CrB��,���lb�Ak<�\V\`G^(�>�c
�",���M��90�o���3&�a���2��W4�p������n�����1q��������[2��7b���6 ��f~��5�7���'��Ij�3��I+���
��y�r�����	r����r���v	�v(�W�\���y��A�D���'���,Y}%?�������M�m�����-z��rEJn��?��g�m�J��S��������jMb:.>�F��&�J1�l�h&��(s~��%r;����`y���oG����h'��b���D�����Jt
���D`9�q?*t�N�����|�cM��}�3�Z0�(x5p
����I��x��#��SQ!�����?�9���� �zw��^��)`�
���.����q�������\&*j�8V.
�X0�l�w����S��j�'{�YC�����hz�2��#�U�K�/��fR&��-��A�W6���<���c(C�;�U�Y���h>=N<2�#=��<��[9��T�-{��]l����8#�
DL���1��{�'qA3m
\4r.��MHV�K���JX������}���\�������Z=`#`�}�"�
�	dVr��%rj���I��S���{���xl�`J���s
a�x��
��2fcd��0�77?�9���,`*{<]i:Z��$�����/���\d� Q���:�<Wi�ijM�����FA�(�-�L��H�=k�9A/�f��~n��p�q���Jy_�3����^���j��^-�������x������h�K��-���L*�O��a��L?���c���M�����d�M��d����g�����}�S��2>���8y}>� ���Qk����[����=s��������,�K�&~�b��m���&\������
��&9���s���k�$��������s�7/���g�����b���X�.�H��+����z���x�o1�h��h����65��>�n�{&u��T��>7�l���rS1�DnN��uh-eN�`�"�I��:A��R6Q����j�x��c��CB<j������:�j�+�g����*1��Y�J�)�����{��k�o��ol��O�s?��.=��������e�DeDE5��<�T�<w�ttrp�o���z��>=�7>��|TS�����K����:��P���=��.�:�0p,�������mN�;�3�RO��yY�9�����t	���zi����}Z�"^�>�mOj^���M���
������e�j��e���2��;�s����"G��
o%b����Ke���5�A����+Q�A�} �~�8_;
�w�y��9���u������q�����z]�Z�V�W<4^������� d*����z2��	�_��lb+"��������vi�>�c:N�u�#-���i�%��MFXSK���}���o����y)*�U3��h�����#m�A3���FnFAJ��BD��dZ|*S��,s=�60���9������E�s�+�����i���c=9�:#f>�L����)��k���6�`���p~_�>w>�N?�����Lt������F�o�3��s�:f9�oZ��u]���2���p�{��q8Z��c�}�����$��*I��m������Q2)�p�Nh����L�v���)��<L�1�`�������k��N�}� ���'��\��������d�Bq%�=[h�q�`��P4��/�Q�vmmm�n<��S�V������E�'�2/�������$����x��X���er�������O	v�����,u���02Z
��uh�0K�����������b�������
+��f���I�QKf���S\k�����#L���}�'�gS��7���)a����=���G���^|]3�����g.sf��,�
p��O����a��TW���`���Y�m���F���,����ZS+?[>�����y��9�,�E�#�M�U���n���Er�_��b�Q[�x4���)��q%��j��qh�5�T�9��.��K;�2�g��_�Cc4�}�V�|Ej��������'������jN�g:O��������B@��~����Z���0������i��WZ0�w��t����
A��Q�HV��2%h��'�������t�oqu��;��g�.�x=��(J
�>�^,��9��&�}FVw@�jhh��$��w1o �����EW�����T 0 <��S��.vI�u��w�?�b	�[+��N�:[m5�Q��,7�k�����F�����������;?U4�M�E��uV��e�����t�����^�l*��c�vf�~���t�1d���t��nevT2'���p����4��g�����=6�Y���h�&JYh�����bF�L��irJ?5�RkH�y�K��[� V�*�m�G �+�"������{7>e�����^�,Uy�v������o��u��:8
� ��~>4'�^|��5

-W<������q����D����uj�c���+�_����Y;i4�zb~n��&�����nBC�L.�� /X�����I�1b�yw��k��}�J����W�:��=j*_����[*a����{�%7GS��@O�T��,�7I+���c^Kt������� �R0��O?|rr�<��fo`5�w'�+[r�8��8T����aF�g��i�\�������?�����Z�g�~�g*qW]��h�p�����2�.D����'3v:- (N�6<�K���:
��|uiii�+y�%�E�m�x�6�s�===33�r^�D�z�?L��n�l�/�	�j���%��������4��d���������jm����0?�������Y{s:���:�0�nStyqn�x:������Q,�.w����c���+�x���
����j��c�>NY���;C�E=+��n��v���#���j��������Q�QC��2Z'���V Z��V��W������&TU5�]J���
���\�x��(6��K`���������v<�2k�Q�7�I��cO~(��H�(����m�<o��������a��~���������w2�Y�t=�;!��
��Sa
!�B�C5��y���.��aMaP�cV+�8�^�3������}�#a�x�����.�q�et����� ��+��t���x�{��,����a4���J'���$��yE(,�������k���M7k�jT2���6��]��r����iO<��2�`��Oi/vS:W)��XV�5�!���O��4B>��m�����	=��%y�F��&G�j#h���hKEV	�]�*7�@oA����p,7[
F-����
�:Dj��{������#�0�N3uG�7
&T<j��h �I�cJ����.Z�s������;�V�9���g���%���o���������Xw��a�����}��l���?`�5�|��7�����n?�����|�[*C>��U��&.�(u�����F��=��]k"S���0�Xs�0���D���:M��eV
m����,���?%!�����so.m�������bm����_s��u���qyTmL�K�)v\�x�C�zn��H�����5���=R�1�g��K� �������YD#w�"b�o�y��cC�u>E�23�g����%U����>M����
h�w��\C��A��c��:M��P>Q��
B~�k�&/�;Ms�'z���AF�3�8?j�Wm��}�7������S��6*����!��l�e�A5����
���L������C�tW)8��d���>���	�/d�����3����Srt;���s]NLx���IO9t"��>�d(!��O	r�Tu:)�g��	|��~>z�@/�T1�����,Ec?#�l��@�>��B.Y�d5�H{�{��D��M��;By���(�Z��*���G:V�����*i���lv��Ns$9���D�B�4�����,�d\"��3��
�F]�<�+�z�'s�bU��������!VauC����4��f%p@�,��aV��}FL��m��
7�S��Sz�T������ih����h��2�`�@f��x��9d(^��S�Vz Jv��e����!��,�x�����-X�K�L��aa�������t���Pl���[��G�
ST�k� 7���|�o�Zn�g���f���pwE}�������D���qS�����^��������<��-C{`[X��I8�!�����H��NL�v������e��_���h�a6u�n�	�V��� 3�������� ����W�
��p�8���yDE�+�EZ��X�Wc'��O&����5�Rg�SK�������Y����g "��4��[���B���_�?|=����FP�	�1����-�������/�I�� >	%J�g`t��U�U��8=v<��G��U\E4CP��'K3�]���g#���!3�L��:,?7�1� ~��7{�$��B�[?0}��`����
�o]�����)UR�3�2�������9ww_t'tnF�]�5dD�T�}�4����F�Q������U�]�I$w"[$�m�lo&������e
�a5��,�<3)*��L�j��6
�<�o�/wu���������0C}�����r^�����"G��M��T"P�Q���Es������������u���U�2�$�c���T�����r��^9��k^#-�Kq�?3nh���2�b�A�R�t��x���� z�������X�i;�f�_����>V�>#��I����a^�p���~�hE���u�(�>�����,(�G=���E\����&�|SL�L����37�]*����?��������]�:G�r�:<(��;pN�?^$��� ��}��-�[���g���}E(��"�W����F����#T������bb���2��&����W������[�t}w/*U
:��}B�ng��:��vg���R���"��8�XH+$D�T=��������3| ���v�\����\h�����
�R
`Qy�:J���Gg���2��3�,@X�[G�-���:�8�0$i#)���j�2z�<~+t�c����SC�b����y�����]��fo�	\�3��J��F�2�.�g���RG'��v�{x ��S}C��3������x��`�hN�?��,3�:[;���6(�P��C4��gW��p�{e�y2��b����d������e�\���{��S�1�����,B����g�:�@�p)��+�V�-�kumS���7 �O�h)�Du�u���]r�&q��k�j���n�?t_��b���x�rXE�S'������^&�:�VG��D�0
��Xe����9�������q��UJ��$�� v��8A������#��t�7����|����������~��3g?$���E}�:�����L2�<��cTB�!��m�?Jg�M5�S����m�BF���!�����r������V�`�V?=h&����Y����,p���'�[)>K!�<u_�hh������N����rdk����u$���p�i�F�R3M�Y,�N$�����������ah�I����&�h�E����c���{���"d#�HM����:��j���V�9c�Df{���;�oN�����t��
@���
<�n{��`�Q����&:z���mj~"�47#���b��C5OV��7��$y��\h��u��@X������},b�IGd��1e�^O�����+���]=���Tl&�����0?7M����wJ��LR-� ���S(}�O5���	,u�Oz����0.�E�\Q|8��������q��3�9��9�z�CC`�Y�I����6�����b8}1��'���p5C���~� �[����K�Z��T��D�1�4�e�CH��:3��&Q f��#�G�NB
�/����������v7P�;+��\t�������_��X��3}k���QIC�6[��!���^Xi�~�i��?K��Q@;����vG �6D����xp�+��IIKW���~7�,t����9B��j����y�������{�����^���/�;���J���gb�m*�w)�����I���\�9,#��������Hx�o^��v]�z������DL�!8$$�s�q����i�rp�����Gu�g�����\��������R����g$!�����N���{c$�d/��@�Ga47���7(�e��#55v���z���i�R��������B�w��'����������%��T��s��&��T1;;{��L�C`�6�u/3�rm�T�����%������hW���[�;���mO�T������g ,I"���X���@���',���9�/�Y���aB�D�)��~l�~�4q��[��Qy�M��������x��������Q+�<O�e?��u�y�bj:���g�Wn��lm=�ZU�LTT��I4���gx�_��&0c��j��k����������LE**����v��}��5�rd�h����
����)K�K�!(��J��.�H��j����	c��Z�}1n����c��@`X�1�wr�:�S�n������bv��R	��%����N��[D��e|:�]>���#�Tf��%(z���w��%�MR��N�S��������KE���=&�2������w��}������[��BK0��r�'�*���744,�j�����HEl�B$on������1o�K���d��h��"��k�z$kC�������fNz�v��3��-�7�[%u{���������6D	���j`*� �Y�.��uG�e��5����_
k����\��w�>��y�
�6���X+�J��#����j2�wx�rf�����PE�Og���p���9�:���X����/
�=�O��5nv���#�^;�1���D�H�m���?���wW��x.M^��D^��I��������
���#�f�_��>`	���_9#Y��<��@���������?���������%��"*5hnH��ws��#�f_�n�4�X�`��/���}�ic�w���%o^�[=�db���pf��*��@��7���W����wZ����f���c��y�����C��oX[��U�%��\��/���uo
������q��������\�n�|�*ri5��>�W-�U�J����
Q��K�jj7P�0�����#�K2neg�o��_a�����wc������T��t���� @�8<~n��<��r��-���"��5����c���/�x�z�c���_m�@����K�|�jo>���������0o���m��y���b����m�����~��^{3��N����[,<[�����<���������-�O��vp��j�)NG��[�\
^3�t�,D�y���|�����}���~�f�jAK}zq����c-7U��C
rv�\[�G��-����o����;v��hO;�{C�V�~�p��k�e�>7�����	�-h���m+������?�:���T.O�	��k�]������x�U�_x������$(����[�F:���Z��;+
\�;!d�7\�����+���Y1�
V���I��mm'on����;���5��k��������w��;���F��?��m4F�xFW�VD��&/�p�#�3_T*p���c���=j�E(E��.�]w�sl�
��yv��v�G�Uc�Q�����I������<���3lJ�u��Ff��<�G�X111q-��x����22��o(Y����Drz{�a������H����Dr;����^�'�H�1\	��$�*���ZdP+N���i&"e�S��[�����Rg���vG��4\��o�X%��@a��(t�����!;�O#p]��
���sP��+����G <������W�\���5g���6��dHK��G��6����|��uM���<���hE�f��\�y�\{�HKJ�9	������~���j�bt)�p��q=�U'W���*�C��.]�g�O&} g��������i_���l��@��axM����cD�4��b	�q*n&#���������1
FV��P:\Y3	)�Q�������'��/"b��������?��i���R��*�0�/J(�����w/���[�x	w`[�_�Z$v~�IA�0�W�_�3����5��}�B�4I��g��M7j9�K+M�|�-��u>/h��x^�2��PM8��x����^�~�$�9\
�[��a
�[�����W�?��Z$;qf#�������A�C��w�i��^L#���e�Fw\���c��+��@��8�T���QU���A���Z_�.���x�j7�.��M���L��&N����]?�x�~o�cxZ���fq��#�2g�[�r��V���k���F����N/�~����	Y��b�fkk��j��HJ���|��+K���S��_�?��FR�����wsv����3�'m��Xj���~8�`��������J�A�H�uX�=���Qg���48{�$���$�F�X��Q�$T:A��Z�
���`g������P .��C����������^�<C]W��8�W�;�14p�>4p�}9/�����sXt:
j���BC��-�����������O<�wvQ�J���m`;������1�V�q��������;�A�jD�29L����9�jm�i6�N���_N�qn� ��3�����8�a:����u����|����R!�Z����d�*ZV�xStwGm�(�����}M�0���'��_]r����8U'��
���g���D��r<Tt�<����E���9�0��WM�?%,��[�k�H�J&�)�����u���|5�K��k��e����I�X?��]�~�)fxd�<(�;�Gp��y�$c�\c����B@'���3�a���g5#fA����r���u�X�U2i�'M�<���1�����I�R���{���(�
����k�&�N4��Wo�W�Hz>v�����%��8y�8�������Y�d��;������l�W���T�7g��o��:M�5]T��Gw�g{ic��rW��@�U����������6�p{z�z���6�7���1��#1f�QO�]v^�"����|���{��BF���.'�j�5�
����w�,�V����7f���#m���h�q��~���s�B���������h�&�,���)�M*��{a��[o9��Ei�C�P[�*t�F/R6��i��E��������K~�
�TV�>��[�����!&���K�}��aDi
�i�a)�_��������a�@8`���.1��{���^����c��+�d>76��� �w�Z,hP7�?��y��&~���=�kr���A-��"?���{Pt|[<X��t��~��Y�<(�$�wke��������`Qi&TJC�f�<T`
���>M��A� 2��_Q?����4Ev�8^j����]�u�5�� �6��]��4~�<����$�L��
�SSvf6F�������N":�!�7'1�%AR�P�	���N�sJ�����?)T��7��"�b�aq�d�s�#�f�tU(D��}���w�A�Blhh�u�B�����s�"\�y>dn���l�@���"��,��j�S�:��8�v���\�B������O�'-��~�}�mb��?�F-���)��*,
���MD���h�X��s���_B���Ja���1��B�K��-�\���n3Q�X�f���OL����T?�x���E�)L"V���s�j2+�C	�.>���P��G1��g`H��hA�X
�R� Gp�	���'?Y���H0e$l�C���'B���A#��hD�+��`FQ�C;(/\�S7+�]8�����!"]������a���3�e���s[?yr

���{4���<^6�i$��"��,��l9�J�FR�����rd���$ H#�*c�����!��8��Z7����v��P����?��o�����D���F=�8n���8�"m4�l*p����01�`���>����S<n5���X���B��:>�g�������������s&��+�tui%��=T)��VK�5R��=��s����a�
ef�c�*�'1�e�w�����;�)�������Y~i�K��������&�A��6����D�{��ny�M�y�8��P4W�(����?`G��-�.����i��foc#�0G]��}>�d����k�X�iBm�|���Q�����4����M��;<���k9�[i3����\&���;O���{q��e�����f��v�5�����~�w������/.2��ve��{F��E��pb��i�9�-������Ua�^�ffXK��U�x=m�G�H�/��n���'gGs�L����s��n/]�W�����	��[;��o-�cz���\�����`���.�F����������$�����[��ya���r������K%�b�?��adh����N�#!�&�����za���o�}��AC�|�;�zl��CC�<==?
��v�"(�>>��=?w��Q���S��&�b�/�kE�������osT0���J!�
�x������WY��B����&���U^����x��UH������$���a���x$�������j<s����E��~b�I��m~[��cBh}9f����o5G���%���?
���$|����x�7s'����W�'|���~Q���v��oQ���������I�8�g@�6�7d�����H�B�<��j���LzZ_�&�BhoZ,8�y��+/W�������<Ddh92���>�C��_J��(�����y�*�xk�����w�l1L�vr�����j�����U[�����������G����v�/��&eg+l�J��{�2�K��o���
����L�C���[��=��De�"���,?�iSw���ZpS| t���������=�����7�_|�9����������W'�5�M��vd1Bw_O"�:�>iy���Q������S^-�FY�������;Ge"J>*��C��Y���
a��f�,:��1	i�R����v0d���>R��!���c-�\E�~V�����C(�WA;Bv��K�:�P��o-�(E
��7�e�W��-F�C)���:?�{��e�X���(J�`����>��7��7��O��!F�,�D����b��:y�yQi5��&��������Z���}�y��.��},��/��W��q�E���W�_,��H�o�n.����C{��Q-l������b�Ey6 e��n6��6-���`���
M���
�[3�8�D��6�f�v�����Ek\�`��������O;��N���=y��|����������b�?p�Q�0����Y��-F����]��CD�FP)(�V�=4�����G�Y��U t.2&�=g(�&��� �a�T��&�Jl*��_,�����IhV��/7���v�����9 �!�.�+�d������_AU	?�$)'G��n��=p���F%����i���.��]���T_^oh5t��%�3�-�J7��O��qh�c���>���
���r&�7��c�Pw���*�Ye4{����Q
����
��v�*e+������!4�i"�w���4��6������Y���n�l�+�y��m���F&�L��P��8����A��n�:xB�G���!C�*�n��i-��EZ�������J���v]���;-�F�`�nmp��4�(�cEw���W[��C�3��cO7
y�j�kM�������j&����^E�����2������{F
��3�������h���j�B�����XF��w������V����2N4
�'�[��6���;Adt�n�J}"v~���E�9�I�W������%,�5'�*�3.����X����J4���0!�������F�t{����h�Y	
�[��|��T��W"��y	��������%;�X�����R������q�Z
bN"&�����������LRn��������L�v���j�88px[�'��v���-$Q9hh
f���F��VfE�n��N��o����-���=b�nc���:
J��ik�U4��9��j���������a��2�\�;h��zo�4���Rws���R��(J�
�����aM8���iq��g��3�Ob��+ m�Zx��-.�]�������$�?x�fI��&�.��������y�$4l�O���U[�tzE[bQ�J|%>�7���)zD�Eu����As��������5!�3�G�V��\Xv��l�S�����1�������b��	e��N���V<{|�k���X���Z�H$��oG�S�����#i�2�]9I-+��)������W�-�!2��
D����Ykn0>��{1�p�I�KcZ��}��G�O4�b��w�7�gr����7k�J�����vF����Z��Q@E�!uA�B�"����=VF���AYd���   �
���C"k�@"�,!!y���V�����������@�$�s�}����#�/������bv��fC�{P��;;lmmApL�����'�2�Jwz��D�w�?�U�CZKU����J�����
_ ��\��~��l����m������\2��W�FOz��FUF���^�v���G��I9�X�\C>mMHR�Kk��X��}r9��r<#��e����,���_!�E����+����u�����s�����,gQd�O�j������s�"�G�]��r���.v��[�������+�����455��)��	�K����?3�V����R������ �����`��M�+G��ww����a����y�p*5��	j�7jV6��x9��zEq��e�=��������:z/��r&z����y�5���xe�G�qU��8>]1�F����]�>�71��-.Y�~����U6��q����D-Bf���2~5n^2c����L����k��C�,Z�^����l��d������d���l�n7���������ZWW��F��&�����1-�]j�_}x_��B;����,������d"|e���+P��������6�_�j:9P��"���?�m�[�6��%�����R]��+VL#���cc
Yc��R��72�����-U�����Q(��f�������}�.�F�>�-�/-\E�E5����%�����"G����MnU6�9���;L�4�B<�^�C������0����T��n�*�^Qe#b�Dt4J�`;���S���~W��Sz���xT��:�mcLL}b�D�{�W$k�~1�%��
���(&)�����KR����M���i�Yx�(6����TD[lN])�r_ ����97�4�'89�A���o��Bx��k6�X�Cj���^B�6Wt��GsZ,�m��O����p����?�
�v_�>��3�@�#Z�a�	-�y<�2Fj�1��W\��E�
����=n%}���
�+���r�E�_(���
P��>�|��h��M1�����^kP������j��x�y����o�=e����r�]�d�-��,��V����������I��X������m>���X�E��@6����]:�b�1�"�����dq!z{�"S��	������6���,uI��l�����>bC�&w�}b�������/C�[���|���B�HK���-�C�~����:2�.��6��Fk�������zoa�8���,�b2X�D{�T��/�#����F�O��s���ou(��J8����C\0"i��>��lV�����K\�D�
Vh�|:�:^��_)�_\)}@C�Nc�R,��P�]��4
���x�M`�y��Ij�=f~��9Z~���ae��������b��������ot|���1��H�1
����8Gn�`�N�"�����^�[��_KPq��\�X0&v�N,���
��`4�r'��"S�{�������@��L���]�8���/(��EF�]Jq;
@9��L���.����������S}�;h�PMZ�0�������9`B�B�l������ `�`�����JY��~�HRRk�$L���s�g��~=Z>z�{m/c��'O��"K��r�y	o����A�����qZ�IQ��9���~�~����.��UH��V��Q&�1�U�u�Q-�1I�I
�E��>Q����)���(@���������
Ba�~l��.M8�8#w��C��F�w�(��OCZ
y�B&$��J�`,�����n�J"*U�8�d�>���O���!	N7 ��l.B�������rA%wp�SO�����uO����e_J	a������/�
�m����,��������:��/0wN0�6�	�c��)wp�@uUSnj^�8�/��Y�������Lxr �_`��
Ni�_LK����MH8==���������"G��#��q� @N�&�El���������avu����[�zpr��o
��������hP��e��[���z�T�
��y:k��>vt� ��<B��/���t���d��P c{*�,�V�t������U1�:���G�/�O�}��o��^Fy����P0%`�)�"�(J��XA�)���/�!&��}���fb�Z�|������V���	^@�m�i8l��3D�H���B%�RR�O���2��e�	>x���;����v���U,���(YT0\��X��P�����F�3�p<��)��&�3�$���3z���*=	��cA%������	�OV�1=�l�D=�NY���1�����;E��n�ZI���)�50���@N'���Sc�?0���h��VA�{�:�D�d:�1�|�}��g���*Ou?�6��81��:��g�C��=�l_�W�V�w�r�<�s��%��P{ih��K@YYJ�oG��P��c9������"��E`��6��^�����%�=��� ���b��<oEK����R'*X?2Y�P���~j �3�
pz{��j���t�s�y���n2e�k@%�b'������T6m:vt�xC��#�$u����n��g�+<�~�9�:aI��c�>������5��0�zg���M���2^����|Xde�O�(,�#X.�sM�%5���F�����P�{�$_K�mV�s;���<��I�i�5�S�-�f��y%���]����
W����Al���}LX,�k�f[������yg�3�-]�'�o�N�fi��q
����-U�g�9�V`��b���ym:6����b��~��&J�[�o�E�4��|�n�'��{�����~���k;i{���c��s��GAG�?�CK�������g�\��.+���	t�@��x��7���X��;^h���v�N}��w�?����v��
����~����t���$��*�&���\)��x�"##{��
� ��`��P���<���m���L__�b�X*��S�P�������;<9�n���(��o�$��r"�X~[-,���a?	�9�B����Z/:�	���br��c�Nl�oF�1f��"��"=����H�;eH�_������������4g������O���EYp�0k�az1"u�(���m��T���w�m��yF����,���
�P�����F^^K@�2��F�=����0o.0����UU\p�V�6���*�j�X�L��e�����	�<
�30HD�(U�*�.���bN��GT����b
m�p��$���X�'[������h�ohp�W�P
b0�0�.j����sJsG���z]�u4�P�Rf%1����F,���?K�{f���7-X8^�/*WS�Te�>�.1z�O��O�/����*[��
��es����>3V����0.�p�������-��yK�O���b���VR�������b\/����:��-���>h|���:_�k{��7�������<7�i��������_-����?/ �?���<�W���d�����f�?��)#��?�������#s��z������].��_�vG�(
��Q����1s�f������C���a$�������W�W�L���U)�g��Jy���������
��eh�F�H����`�\���!����W����r%q�
������y����F"�i�T.��^�rh]�,��>�<���bW�
W������(?���Q>y������GT��W��m^������k�������']N����n�A;1ct�����~�����8�}����r��H�yow2��\w�:��ec���m�^��~��c�hX&a��$�������m�YD������L�8g��i��y`������n��Y4i
m�_�T/���}�v;WW�A�73�;���}��iK��[c 9'�fMM���i�����sTz��]�Q*^g����eQ-�<��5�5i���.��n%��B����W�#�cqh�v���wG��p�9��yx��,v!#����!�E9�UVV.�e��u��U��H�7g�����&�bd-�;I�b�u�������������O:����k���Yv{�#2t�1��8�h��u#��8r���h�5���C{q_
F��:�v�	�t����G���hJDT@�$�[CQmt��&��oS�'�`k�K�O�m������P ����`�xda�WBf�p-�����b+�!Q�esan�Vb�td]U}�/�1a<���\��y���r&�Aj�*h��u�Q)����h�Zb&�r�����+�N�Q��+!,��V���BUs��8�A��+��~����{���K��o��
�!��NOu�����=$�]RBh��C7�\���z���>0%l�����7�e��/�������sOG��8<�-��K�G\gH<q�u�B��k���������<1��d}����4�Gk~��+����r�I�~���?1�����sio��o:W?�:��8���r�Y����������3�<��52�|��?�)�~�n�
��ylI_3������*�������W�y�&"C����L������K��z�>�����/���U����e$
���N�}v((�`1�����[�.�.�W��z�q�~�;$��~�
e�C����6�����-EO��vBwZbn`��)=���Z6C����
����A�3����������?dL��\de��k������>M:q����|���k�p>/�������:�0�����r���V�(��#�~���t���F�S�uh�L`��r�����)��J!�v'��|�K�_�t����[S*�Wmo�z}�L��O\��Uq��VF�������~�3|��8l8w#:�A3
3���,�`�~���|�6`A���(��C���Gi��q�i�!���9v-�^a���>�a�C~�C��p$�Pk��UX��T��2\����������K��,�	���1���cnGg��fsI���s�jc7�e6��R3=���i�o'_�p�b�x�9
��)��NQRN^*�W��>�&���+U�Z��kWF�}(k����s�
{{�����N�z��B��LJ�{�"J�*:�|��Xg�z��J�����t��>��K�s����P_�P���pUm���_�9Fq�I�����FB�q�jR�����nk��v#Z�vc0z��L@Aij�]�Y�:�	�;I��Z��M���BIXwUw�iL������y�5A����A����?�M}��#�'4�=���u��[������j��W��Me)�gw�������4hQ���`�u0��r99Je��>|���\q^4f��W�T��A�pv������������
�a����5�|z�^j��m��z�A���zD`W�1�|7�|<�A���h�������9�h9Zk��������gi]���\����"�����nZ*�%�b@�U�Y=<
1�^����-��	J���-�f{%��u��(�����b�����^Q!������q��lg���� 6]p���k��',����1�b����t��Q�jC�b������S�������'a�]�56w�<X]��5�x;������F������21�����@|�T��v}�l<��.����qz�	�K��}=�7w\�]���yC��<�y�vww7t!�y���8���M��k�/75c����A���{�/��2I_�������I�k;N�
0�>����b?`����j��7�]c�P�e��'g��r��<�3�,T�����|�a#���%���<B9�d�G{�:�r)�7�����Q�O����'a4�`TJ��^q��`�x�B�T6]�����:�������^�[���T�U*�Y�L���wi�m-:�x�K@g�!E��|yq�IN����p�u(�p�����[�@�G�3��s�^k
��jCw9I�C��_��E�b��(�-������4N\A�*�Ca��p�h2Kt4����l4����>��d�~)t�[QN�s��Q��IF�e�
�@��pT��7��4Yx�@g����LBe��F���~�6W�+k{t�� T���J�yf�v^��$�a������i��*c!������p_��U�@���/�n�,�����l���TD���5J8)�`Fj��;�������o�N�����X������w-;=#7N���h���w���!�+��F[E����R�Z.1��(��	�
�P`��r�Q.��L��50����"h����v����\�i���(������Pk�BE:�:������H����j�E����[Q���������e.EWX����������8m�mA��Ony��M<�.����Y�eQBX���S��F���G�J4�!�|n����I������):���.�=�����o
7���o���<2bw��_�;���k>uy���q��V�
�1�F��i�U�=Y�{`8��K��b2��fbz��5q���'�E���c���/�T2�U�B�������\�C�}X�p!�d��I��,���"��k�0�<�6W��lc{koLvjBv�w�fi���C�	���<A��+@�����/���g5P�d^���_��@��Ij:=lhkHUM[��"��N��8��5�i�k�{�$�����u��+'Y����#��)A#��*�O���2�>	�U R{F'�q�������Y��r�m�W|^��2�R��i-���T�g�A��*�WO�*�wx�3��5VqS�t�{^�;�j�������V��:9�#��y���O*�H �6i�
r�����}����7_�0T�<X���� �h�������|�#I�!����z(����l��}��f�$����&�9������r����{c����*���\t;��p������Wz�K���Ny��#�#�����N�@��t������4��5i|S���%/�)'ON����|g��Xv�����M���JvoFGN(���kj��V�6&��}e������c�(1��d���B��E�P*����U�rr��(�&�Pp�=+�O_��ZT[edr����G�&����z��+/�L�O/�U�����w��/��GoX���"a�!	% ��-E��:��zzbM��|61&
��G`C	4�mP�Ma���J��
9 }�(�j���'N������z@P^>��W�%������2,5�	"[��U�B�X_�R�4��>�#�`����1N������C"�������oYF7t��wC�X��k+G�R3��vx��e�f�T��)�G�������M����|������R�	������zw���i�,t:�B����CZ&!=���f=M^���do�#�!C�rI�o��8S���W2�[p��&f����X����8M��_����o���V�C2j�1����
���j��1�([����sY8��.�L��V/�����!4H�����H�
x����VC0�A��zV,(�����V��x!%P|&����)	�:</��B�TEd��A����q�N�����2�$�O�����n7�"�y�j
�y
�X���[��9���J���G,w����7�u3���O�_�Iw1$�����$�<s�7�3����%2=��j8kj��'7�C&��<s���������j�/����;�����"6K���ek����67�����>�gM�d	�IQ~�:;���%�CJS���CC���
)���*2�Q|��3��l���%4�Ry�R);���!19Y����h��ui���h��#��jY����7/��N+y���0����B��W��\��;r�u;B�8�e�]%����<F�5��9t3JQ$q�PZ����jA.�����f������c*�j���~f�
�t��v}^
M�fN�{�w��v�3���O�:Y���m�0	��h�4RN�Nx4�v��3��t��(7����,���2�k�J6��r�yU������"�
�Y�����L:��tFkQ����r�}/�7�EX����[�Km$���+�o�
�
Z=�-bTwhr�ZgH:u2|�����	��5���L�+���6��7'��mJ����f��Vt�@9���"���pi�Ghsl������K��W�����\�������J��!-�K��*�ta5*��M�����)#��
�������S.VNmk�F����Y��>o�9/����K�� ;�gK�e&�����+�����o?>Q�����9��M���:��o�(D$d{������R����7��
�(��M�������e��xZ?�����C��2�[*���x��f�|����������w�Z�����<�A��X��rhH2�?���o�q��������P���0���>�;���
w��h�jn�4�b^�J��6�<b#���)M������g�����9�-d�+lh�>5F�_�M�S3h��1�������Hr}%���P��t�:��s(��/�dMjg�Ag0��7s_�������L�:�9�Z=�G\1v+�, n��1�b��PP^P���R�%s�X���6���R�R���J7n��$d�U�M�����2xaQ����T��,6����t���,K�QJ��������k���?����J���e�[J����G}Ml\( I�,�ul����I����w�^��9m`��8%IMYn��@���?I���������c���`�6��&@9����D����^t�7���\K���u�T��u����R<�8%�s{�TP����}c���|�����=xtV���a_�.���+�l�Zm�W�����=�X�mM���#s�L��Q@�u������w�3K���2^��G�1��OUZ��|�K�#��N1�����0��H�����\<�d��0	jk�ku�.�I�D��3�`���U+�\�9�2��.c�^�,&������
��N�>���p=^��4(�p���.��2��5��=����i"�I��m��������K�N�0:�m����3����ww��c��O����GR�F�e�c2pN�����ssF�����g�dPJ�+m[�|�k�������;�U���p�X������^x�
����m,�]��[�?�>�CK�Le������=�	P+��	h�)�&��*���GM�La;~](�<���*T���c���=���
��~/D�>~tB��P8�5���(nlfmV*����K������Fe������;����B����L;��7`1�1%���������`(�G�;�3U�5���T�����h�f�?X�:��Q�����2�������{.H�8A����V '�z&�bMtG<=������?8����W.!�/��R�}�&N{5�B|\k(���^���#'�]_�D�A�
�k1���M!�UtX�G������.e��K��;�Wa�b-����#��!��v
�*������3����Q��`Z;7l�
�D��e�������us����N
�0�)�yFIZ��S
`�����N
��+�����=6��"�9	�����f�<t
��D�D�af�� �+x��������^{(�6t/���B"����nm�lc8�W����(<�~I"�bA��#x9<x0��j:�^t��3��7jn)���P r�a�������^9���<�r0>|0,fN�[��//e�@��A�3k���~�&�4
��%'����x�If�p�g�M}uI<NQ�S*}�,���g�N#��#r�
���!1g�#��GW�
�'���p#�T�XP�!��e�]��-�,��PM�~�?�������-�6���T9PG"�m�P��M���I�����A9�������Qw����\�`�6���t�5����"�r��9�Q[�zj����(�k���o��T��
}&17Z�m��&���	:`��J8x��oDY�p��
0�6�Lfw<;-�E��{D���.�G�/)�yqL^���M��%���0D�Y�f������������.�F�\P,�����A��T��kU�S,���. 5F�o��B���R!i�=����eB^=M�� ?�*����'z���k�h�u�����"�Q��Tb���/A�P%�����7.��$3�m{��q��������NLn�G�|Vp�Z@8ep5`^����V}d���HH ewn�[gFB��ud�����~���mP�]>�^^���'�<���T��A����jn��d;��X?q������%��bV��Z�(�k=�\���C�4n��\CRLp������i������5x�b�W�&@e����.�^��"�`?��=�t�����RT�i����o����T�V���	�PF���P���<����t25��3/t����8���BoT"��������OZ�$�����o��?w�Wa�&�j�9i�_���l>�H)��0����~��Onx��P��pVF�4�j��f��uK-,{p��$^�{JT��`�8�����Z�O��(�'L�+�V��&��w�����o	i�����h�b�@a@�nQ	����]���4���u�E�s�e|���������"��L�{���QN��"�VV@�<[9��;`����R����.������G�FG`ju&]{`A������h����4[I���	�|Vj!T>m|Ec�8.b���W�9v���x9���u�im�f��]��2�i-OR�X�\��{s 3�:�R�������7���=8���7S�yn����/;��bB!�>i_K���T9���q�t�}�%	=���b7�V+$h��Dy�@���5�n��al����5�d���
L�~3��u}A���z��$�%b����Fjp�b�D<Q�x���%5��T��f��~
#S�t<�w��$��);�:6]�!�UE�z*NN�b�G�?F3F	�9��v�������l��� � M	
�u�$���2h�Y�G��ck���Xs���������
��'���=���~�R�a?����x���N���7�acB��f��I���������A�_}p��Yu�e+�����!zNw����H��l~�I>n�?�+h^�I�_����J���!�.�D����]������QF��A��`�^��>���t�~�p�B��-]���31���������1?�������M���L4;&�w�����A����
QUy(Vl#&��^p"eWh���"��Z���BG^��"RI�d��u�����
���{�l�
_2��U���
�� �W�$����RI��,�Te�fgg�t������_��Uln����G2 �W^c���^��+Fa�j`d�"W��&����%�e�?�\����ck~�Y,_;�u����_L\���\z���7�3�(����7�g����I)*�s��i�E���8�����?��4��b��R��N�{��n�*�;5
�������L
2~/�������6S�k��{�g��L �_i	����n�����t��N��~Bh�l������6h�}���/�����5�w�*A���Sz�<�"����2��s�j4���z�����3��7]-��~P���������!�f(��`;�S���$��4d85��T��Z�4��1�6�P:o@<��%_0k�
F��i������ �-�>�R�cJ�������	r0���t�$���_V�!����vq�����J��k�<L�Jh��C��FG[��uz=Z�3e��*8D������$����Ey�Sq���$�vq��Z*���z�!���<��K�q�]���z�����������1NSy�}�{��^���Z��J��j��^�\�k}��HFNf���t��+I���;�fF���dW�K-���	kxx8
x����b|�v��%v��$���W�@�(��z6�)Hv�_�~�&�.�U���l�S�[�����������&������T���/G��������T���!���r�.qX�n}����z�@X�S��J�v�4�V�����B��4�^|����!t�$�W���p���
K�G?�^_{�,��Kdb�As��n���eKZP)�_��Z����9���i�FW}1��Ds�z�!��Xd[1~(7<N���F��M�!��y���E!6F�F�!8SM��~�Gp����2�n�l�>;����(>��&
������z�������r`f�x7>�������''|�����<�n�����G��L���Cu��g���b���df�7�����BP�+����S���E������C��77��#{�i������M==v�f���F��{����)������r�x�{N�9C� ���M^C�M�f��#K�.��O=	U�*���T�3�������1�:�5�@��|wn���u���}���O�����������Y� T'���E�'q"���,�En����v��;��)%�m�u$�QW�����#��i�c[R�1T"'V���5��
�����i+F��i�{_���~z�	2��H���I���M�5�+��/f���y�����TZN���Z�&a�^2d�\#M�x��%�n��	�t�d��s��P�8���3����P�*Py�R��zu�����'�FC���Qd�����@h:�*�R����K8D��.k�_�{���>��o4g����������S�d2��f���L�PH���1���6�WO��AHx�
��v�5d��}��Q@�������_�a�����^��#�t`�N�>J�@��.�����)�o����z���#�U:>&����y7�P�GMwww���4GR��R������
)g0����'��67�1R�0�,D��2����z�Pd��^~�/W�����?=y��-��#����F���`����L�P�J(t�@���@�Dy����`���\�b�Jv�_��|��\s�Ci��{V��	 ?�|:�X>����Q�m�e~�!">�\�K*O\~�\���M�����=�i���.�����{�PT����ar��A,����(����Mk��s�|�!_���b�%8�h��Ls��$��@��.�X{�i�B�h�<�BR�����,�y�:-07&%��9����s�4c���������C����{��<�`�U�A�V�������ij�����:��t����W�9�U�X@����*,�}:<#`���GT;,L~C�5���a��\�Z���0���	���D��	��u�����9i���Ls�e|u������J1�|����.`)���35Yw�9�P5�B��7 �����������@��y�rn
��I���cj�����P�����
��@�HD1lC3�h�:3wU�O���2�(���V$a|�9���vEC����}�YA��P�5o��������?������`�����S��[���3�
*����.67��F�B�p�2�|a�
��fn�cp3(�\�����B��������b����1(����Z`��'�)7�,n�d�x
�G����s��!G���t������d�k7���#
F�!��I��|�W8�$`��&�4�Ps�Z�2,C����>��i�W]]���Vmt�����(�=1��2!������?�`9��C���|�H�����`���dH�k����HQ�7�m����n���Mf���	�@Dq�����������J����]���0��FWw�j�U4[*��Z\�C��m�
����.���K�j=�k���j�/�O��r��R	�*�++d5J��a���#�����0-K��������k1���"�������6/���97�_h�??al�,��e79��}!�(m��"��N��!�������q�]B��������ZQ�)X*�� uE75s*zo���*�k@���(B�y��3�@2�t-�kZQY����}�����b��T�w#�i����$kx��``%�Z��!�&9��5��g�r5���"�1����5�	M@�G���;+�?s)x<�[��v���7�5���B��J�_"�^����];�^:�d�}��%�n_����0���+wG ]D_���^�hf��o�a�����<�XS����@F������`�����@0��Mp��l���NF�.���i�x	1�O#����#�I���k�J���.Y~�#~�B�������vp����td�Z������	_F���W����iwu��h���isk��,�-���~�������.X�3�b��y�XA�J<��I�%

:+��p�	%�� ����q�!I>F����9��o����{�r/���UT����u��r�P�B��R�kvc�&�2]�y"�*�2u����F3	�c�uGQg��%7��fR<���9�c�q�������{^�BP��;��h�7/�z�C��qF�xsz�����������|��HiB@��L�����f29�M���$T?b���A��;�j�����e����)/�>��\.$�����v_
d�������E�{�
H��S������������y��w�rj8w�t�Sj�	j�����=H���2`k���W]Y��8e�����}J�8@����������e��F$@���%���~$�"��Uyx����/���|n��(���C�!9&c����������=\Id���D���j<���>W���V�����������1:����V���Fa*��e�7����7�d=��5���aL��F�1��b����2�v�.������nC����'���L"V�[4�����Ui<�O������V��Xwz���:��ms��nGG�O�`�Ov���_��~	��D�����,��}y&7���B:�mc����a�c�	#r�~�+t(1!��w���K�������}�7+�5��d�k���4s>�E�129JT��o*�������@E���;
.�C�T�f�s=esf/!���H	s>IK_��#�����92G����#
���z��������n0���K�zr��o��7��,<JG#SsQG�$���ywwb&a���V��5{��[������Vk�Ns���|��l���>73L7�I�W�r����S7r���[���\�U�D����q���6�U�h��%jO����y_S�dry	\H�f�m$Y�p��+��ZW'u5����BU}p*"���D=%3�!po�SZ7��[������]���Wu]�����+4s_�}
y�,���n���Z@����
Bq������Z��>�}�(�?�h������)]W/>���[�8�����i�����z�HP��E�k�]*��x�_���1|h[�T�&�{��_n�\��,���K���;CZ6gZ?�.+K��lx��:�%��J�4W������P������i��)s�:�B3nE��j����=�qJ)�6�m��������m.D��7ar���#�FG�0�U=�����lf0\����*F�������'���R�w����_�fn�Jd�v�)@n,zn�h��$\5d�P�����E����+��b(�",�.[$d3C���h	��+�:��E^M�MpuC)��K!?=�	0n:���J��<j���92�^�V��oK�G�TA�J������l1$���^���Gag|���vkPT�^�����d��(0Z�[
�#���f����(����U*�I�9M����|f���6��y�NY����Z��^�q����4~�������nd�G3�����"����W&kx�|>��kOn�lIV�w���*I6�1���(z@7u P�x(�ZUCG}��(-����P,�|)q���A�B�k*'��l��$����Rh����b'�^��;������S�CJ���2rQ��o\`<��*��,����\�j��_^=	�B����
i��/kT�u�
����Fv\�g�.A&���\��
x�w�k�a�@,�j�s�T�`9�VlC��Y����I���
�5��b�|��Q<��fJ�BM^��a^ue#N�p�}b�Sq����0���Nh�B���F��}~j�
�9�i
���M4��`~�2^�+�T	E����Vy�87;&dHSZ5|Z��/��
	��V���O}-�����k����c��Z�#���e|���*N�Zy�`}�
U ��������~Kmf=���N�O
kY�u�T��?af�6��3Q:�c^���d�P%�t��V=�V�fK�O)*�����,����a��xv�itz� �e�� ��:���I1���E'�jCI�����]'P>���L���	�.�i/��E�Q�HV�����}"X�����1���X�"��0�n]{�':�@d�������7�If������/]�L]�d���{��{�BR���D��*����@�������=(D���P�"7qw��1�,��k� ��y[/��
��#���9���@bm^#%�j������4@�._�t��}���1�� o���4T���(���ZJ��{��q�"rF��:h�(��:+F����hh�� 7���&�����"�0yy��XaLuIA��X
nQ����s��w�f���������$c�P9:
 �
�S
_e��tG�ZC��lR�������/�_���j�zZ��w��o["��y-p�Q�y���:�z�����o��(���V��U�h	{�d����le���	����}t�0[y��#;�^����8���4h���b^�`&
"��$�����t�C���&~j�$=N���Y24	m��X��������K���G��C��Vc��+	�S�������X-����q��8r����/LH�5���_1a6z�7GyhCP�yd�`�/&T4��qI�w��K!^���gZ�-��|c>-�	�� ��z�j�1�`��^��1�����R�)��#��mi��`��X��(�7���������USO/8��*}���\��)�p�-6� ;7x��N�������3[�N��f������}|�)�@(������*��2^�B��L�<`�����Ej����(g���
���g�G��Sca<�*=�C	r������(IZ����v0~s��+j��j�\�fE���Y���`���	m�>����n��D�3^��������6���� N���n�_�u������K��I�b��*�X��NkYwy�I��{�-*-
I��t{t{G���D�}�~��b�{G{HFy�v�O=�n�D���I}9n�?���	���	����~V��CY���Dg�����z0$^�x������,��D�Pd����#��p{��il�����/��SWy�]�4W��� �,!��!&�\&h����kY����
#-	�\�].�����������_��a<h���*���&��
ayc�nA�X�	�2/R�n��AO�I���zR:>���X�8�)Y����+
Q��Y>��V]��w�joFBb���|@���!�G5�b��p2�GA��Cxgtt�mY�����D���������
�t5�����H�������_� �%+�"��Q��~����������I��U|H|�T���=��G���Q�C��:8:��{�������L���6@a��~r���n����������U�^PBRO���$"�`��E��I������Y�MfZ_'�5���<����:e��?�������=�R�c��/]�tup
�D�h���L\���E��r�g���QIhw+�*��(*GG��+!%0]�^Y[+��I�v/E�{�X�~~@�����������"��?��U���2c�K�P�K�l��EA���7l��V'}��p�������;�Bd�1�m3&Ev�57o�n�����>9����S�����*��$��}U�.
��`��"�cF3'N���yN�e���]��d����?:0�B`���H b���I%���=0(�����p(n��g�nN�j��-v<N�����u�������d�0��������s0"N�j�m��(i��A�x	#�w�K��W�jQ2�������M��+M�;����$�&j���r�{��8;W�-W�+r��]1"[�D��������CtaT���=G��O������	y����q���f��^H��@+�`�w�G
��}��m�mm]�ZW�V�a�	F8O�u
�0o��q��y,�ZWa���]�Y9��25������9����S����$F��$1|E����R���?a��-�nth��5
::���d�����y���5VS��N��\�q^����W&$ BU�dT	/���P��[���~��Y;�[th�ndx5�1��e��F�	���*Q1<�	���.���kb������K26��lp�S�:$� ����TO~�������w���a=���>���%�����������R�j��^a�O�����X�k��p�B�k��t�z�^o�Jb.�������e�;;��q�7�����;F�~
��:�n�8e,G�]�]�������@D������F�,b����*v���k�
�%���W��4����8��[6�(����6��w��!dTT����x�-xLA��U4���:����%VwN��ucX�i)��<=�y�?��4�g�,�A��������Xvw��z��g�@�L!�
`?=0��	�iM��Z�M441rA�����9iK�m[K�K���U+�����!'|�I]M����v�z����b�IT�U]����if�v[Z'}�aU����(��&����TD�"������&����Q�K�i����k�|E��`�?�R~ZK����dT3~�������!����1�zsUDJ��0#u9`d;q>���44�����^o�����[��(n]��D���+s��V����
��?�q.Ao���|�����~����]���q�P��A��������b�|$��O����`J[�����?,Sj��q�)I���? S0���S�z���cH��BFj@�
��������O��)��>��dG+	���������7}J�b�u	� @�vT���T`B�=��S��v����Q�)�X��&�_�8�C��g���m=���e��o������N�db1I��>��UU?��D�1�
uNO����4��Ek9�d��>s�d��r�c���D���4��N�l�9��]�������.���_���y�!Y�/H���Q��h�Q�R���ig�����6��-��nb�+r�Fe�r��������e�������V�T��M���i������N�t��Lx��O}��@�W
�0zA�S<��	��Q)EZ�������	�N����,�wD��\~���	�[�"G6-��=_�.�Ih)�2��>���M�+N]X��,���<����_/�����s�����g������y��@���x��3����w<v���7J�l;��G�N�����"�����Z7�/H�u��K�={��F7���C.7��["�{����
�}�������vU�_������������aqG�����]ka�bw�z���������?v�������5L_�i�/�x�d�G�p�����_0��U����=��WS.���;���1Go��e��aXH�
:�6�E=\�C��n��^�3k����]M��U�)//�K$�Kz=I�(.&��%{�'O�,H2�8Q4��	$�>|8�������Xw>��BN�I�n���Z�FW����;	�E��]�	�E����`~;��~��+94�x�:Z��`+��#	�^wn36��y���#��M�#�?��G���fCV;�=*j����;X@�2a�)�1�C��c�`�(xA��9.��Y�����Y���*�F=%�������m������/KD�[V���������L�E�p�������q#	&�S��&^$���+(@J}�h�IUH����M~
���������X�=��<-i��
����x"^�}�r��d,�\��0�#:bC/n�z4&��
��y�M%'F���R���5�V�Y�KN��+��n/������	G��ttRd��p��x�D�I������===�������TU_}l��s\3����[�~��	����sY9�9K$BYf0�>�P��,�<^;�oQC_�5�����y:N<[�/����Z�eL�9��=����tQ����
����h�	��c.{uY�� �������>��� �M��W���R���}wX�W�7��mh�@��J��)Sd�T�"
mmD�E@�*
*-"+������$ #,Ya�0�By��P[}�^�/����9������5������I��� _�D
�z`�`y�@�)�a�?����{`Y����Ua�dfCM��0{�Q�bC>�kl��[�,��u21n�@"
�`���&�����^2sXgJ5�����/��Ixk+��]U�c��������X jC��A���f�O�5v���0,�[!)�����97?�<��>�~Id�E�����s�y��S����:����fS4�����%s�~��_�w�V� �+��2���,q���n�����E�u����c'`V��z��;w6����t���������'��;�ww���/���y����+�+�;�XZ����8���H&��W������5om�������*7��;vu��Q��6v�������n3���=h��3[��6�y�*]Q_���.����������On@�gW��H!��|O��w.���F.[���=���������O����������$���
���c��u��7L�����c@QQ��n�eH;{�"���m���#L�i3`F�o��U�[��@d�vK&,p"� �L���0J��2�:W%���G,��������e��l��GVN��\������L�c�����hB�����4�����������eeerLAgx�0S�L�o����� ��~>*$�.�d�W��8���J���x�h�a,��oC*A��o�A����.�M��0J��
'�J��b����]�-d���y��t-kb�
�2��S�������N�R��'Oe62��$���~T����(<Xn��OR�<�+J��'��E���:T��*!�����__�b��X��yN��|���b�k�����
��x�vz��������h�P'@��a�}��Z%b,1��}���5��OD��K��Ce,-�!��m�T��$n���v����

�����n��ST�q��S��{��O�������l��;��%�����bQ���Ka��c5��vgo��c�4��I���B���������x��l�0q����a�Ht�C%��{\�L�q]QWS��qwCJ��r:��l�R�du���������3o#HA0^�d�C��r�)?�:	DKb9���6m�}l9��(/	�M+7R���'Q[�ds������(�G��K��HK���R3�'V��8�
�����D���{�A�a��E������P�I
��G}2'g��
h�pH�B����[��v���� ���BC����	
�
Me���E%>}E;�f�3^�"%fnbe}�����Y��F4��sE2�[a7������	 (�����c2�[��O ��-�o���*���
�1�%AYq���&��Z������
 F�vA����B���/�X�*�|��w����0P��!1�N����I���:hL�a����|'�L����bQ\�`�41���(�,�<�gwy���k���a�[`#	�L�0��e������0������)@e0`�>�}�BDs�Z�����]^�"1����z{��?�;w����PC�!��6m*h.+������c�0�-���*n�b��1��K4����<R')v��)@
����xw�6�����	��L���.^��N���!!2�y�Nbr9�?��p��[���a�2c�4�1hs�k�B&;���!����y�
gP�-�S�e"6�1����9�9<0��Y'�<��K2��O������+%�^�\O[ �0GuH��
�A@?��D�����
~q�C����z������#�����{�����/�Cw��@r��'�kc��`=.�y�^�znY��#p4U�e����c23�03�����U {F�N�BEEE-��t�XD���9L�F"U���g�?��aV$������"�����F����R�
t;>�B�/c���{��[��J�$����
4��l�m��^����0~U��z�k�r�<@�S(vx@�AJh|�v�D����}��f\����(T������q
(������f���O���+����s�^�T����T_��K�;�g�b����>�.	Fx����a������0l�F�e��T��-���\�D�������U�������������>�~Ye���&0�`�2�����������`�Fc
3�I���8��\G��C�(�0�"��9��Sap��y��z%J���pt�.��e�7��e&��S/�+�\#���;�I��)���#f��W���\�X?}���c>����Jrv@�'�b�u6T�0���5C[WW��91��i���?����.x����0��K.c�gS���8�I��G���p�s������c���hH2��P*����FL,%�$��j��k�������)���+���}�kI�W4��:�K����$N���F���4�]��#���M����u���<@���m�L�{X�]�Wz�
�T*�����K0��� �w��"l�5��/���Jx>Jv <�����3'^��8;_�c���x�������h�4�����A�"�'1���A���]��p�f�/(6S����y����.w}R�aq���-�����1��0���m�w��U�\���B"�g4��NR'e4m��f��o9C��N�\��TS�k���c�\���.��Ni�����k)�������!x�~"�8g���x���&�i��`�U���T��j �6�+��{]�o�����Uf��$��*�����'S,����"`�
��,��do���bJ�v��h���U<Ft��e*��Jr�JrxM�|G�Of2T��LO��QjA?	������_M�;�1r*��7:��&������p�[bl�#hX$�{�F�f�L�TyD��p�`k��]B�
��qi������]]w�������P���b\�N$���k=E�n����1N/�3R
��I�1*lg�',���b&~�1����	��ZqE�	e%���"g��M��u.r������"o�7F��U ��o�v0����.[�������y��������@{Amw��8��^i'�fm@9�c�x%k)�w�P�=9��OtG�b�����xS�~���7��c0�f���KW�
���C��T�g���b�;�*����,��%tJe�;��zQb]d;��)�����n�n�)�a��W)����4����G�=�����'���W2*��Hz����l��}T�J�K*�	�����s��cI����<�DE���e�����'��(/Z�����,/�����/��e`���"�x��V�Li$!��
'?�WW�od��j����4Z�����|L�*K�k�����a����k���p���y
����k��7
�x*@���Z;��i\\�`�yD�&�=,\zF	�����-�q|gW����A�[�|m!���[�(�@���R���J��M*���I����D�X�S��P(�]�o��~�^��x������C6�l����4��N:Yd�d6�2e@_�52��s��,`j\�M~U���Gq�mF�!�U�mA��`�,�8]j�'!h�n�`���N�q�ORu��T66)R��:�wx��������W���$~��3G�������N�r��l��y]� A�i�95195N���dV���(��>)���P����A/��*�.H�h[?	���F�#"��//������:D&�a���������4'J��u��Z~��� 2�6���c�%��*\��?� "3�99 ���@T��dR�{����Ab������t����G���
��v����`�W��V���8}e{���5W>p m�\�8y�e����s��:sD��|��r�*�5(��l6��U��k�KPN����~����3H�T���x����4��Y�����������;�lIL6/������%���[��P �X6'f�1�m�v7�/!
���]�@�&���tT6�3�v�Q�4,�zM~q��W�������-l�^r��m�t&_���/Z����.�s}}����x`j�Ig��NT�a&���@��?N��o�*-:<��Lr��@�C�#4��yk�y,�u=��@��2�s����QQ�h(\���
��<z+++������4�x�����?�$�h���^V���S�M��)')���X�zm���y�����jZ��������)`e:8����zHM��c=&�����M�>��w�r]�9����9���2'�)��#��S�p�SqL_Q��������-�x����������+�{7���)SyA��1!)]�DUJI
U<77�RcE�����f8��q�U��fZy{������Y������ac;��IGM�U]��J���%��������&���>�c�u9F3�S-�2���N8,�?��(#�p����>��wy��6���-����)0�1�cD����qm�D5_��V���d��~4�g��{�����L�n���H�M��=Q�u��T������

lSd���oNLKk��j�D����� L�.N��^����uu����{�T��Z��4���*S�)����kjj�<���[���W��I�	��n7��z�_"�I%��?dD%��(���KP�(����������������2z��T���???�+��Wdx1�^|4�]��y���-��w�-���gou�_a�/=���oZ�-`�;�����j��V������]]&yx���������]�2_�p�;@����nI�������$m7��bi���sd��[tN����������7;}�?@=|�������{|B{x��"�!���?z�*�}U�l���?�x�?~�I�z��z�Z��~N�g�-��O�����~�ueA�d����\{Y�01���9j�&���3��1������0"�m�"!F�������
}�2%��������>Y{a��Z�qW��9������	Lg-|�s�z�N����F��Goz���*i������d<��������+'�%W�}}�W�d�������7<B��az�~�S<�����Z�95o-����;���N���lhy[7��_��\O��8�������9����g_������__+~"O���Cq�!���H����	55;��?344�7]���;��+�)���#�h��������$���JC�Ve�L����DJ��\�~&�(�;/�`�Dk�v3$���'�u<�PH�v���H��"EPeg�|d���<�@o�;�����j���,;�����>>*�)��7�X%79�@���#>[�g���Z3]'q�����k�c���c��5d��$������:�O|�NL�������Oh"���c9	###����#��e}0����(K,_S�U�}�hT���;��L���[����J�����U�&V�����8���N8������������#�Q�����E���ue�gZ��UP�������z�������if������������r��C�p����Bo����K��x����S����!�����n3(��m�q-���}~J�����D��>��3E�!b?�j�������k���.�L�f.������Fi��@XC��o5^�[�1by���eT�1��7�[�?J���@�5�Y�[K<n���<B)�<Z��������FE%m���T������h���������|������;_�lr�XwJ�h8�+���yl����D���{���#�s�V�
w��L>>�ml���Bs����������Y�O���9���_�<������&NC9����[��j���gr�A���V(:KJ��J�������UT��:	�&�(���*�h�������Y��E
���+���`�����.���A�6e���q��T�3l[LMg���:�����H���Hp�;Dr���VY~~+qM�u�8������b�s�B�IpmE��|��%�������i������K��}�9��������w5x������rqO�I(��������}��W}+���B�7;�wn/���>>�	�ABJ�hT�:w��7�����>��J���hA����~������2Y-%~<���
z�#�����N�h���p@���\��i����������������]����Ot215_�_Bp�R�tVig{�v[��8Y��9.��	����J��y����'�>�3Z#{����3�����P�����X�{��{[�_V�{)��N��X�,^v��o���������k����p�L��<���*(\�U���HN_�z�B_0���t9��E����E: E�E�>����5���}�������(�G�w�1������K�]GC3nIx����d�3��?�<!�}���?s{�����A�NcU�A���f��D�OT�b��.7����X����'g��<2����������7w����z��-�~�La���M���m��i�7�<K�,������6�W�=��	�������M_���k[��`��3B��J^�Y��FHN��8+4��.�p+c�r��j)���	l���z��`j����R�(���)�t�x���v�)��*���l�?#?��K������3��v<��
�;y��`�3�T�C������7�93�����4�p�FzX�F��t���!B����"���R������w<kU'�Yr�[2��i;u�I��
uJ��I.�����������J��T��\T.�!SNLfOGD���x�L���MD����_>UKKP$�wJ��{��~�����j�=�0 �eM/���PH�+���K��)=��K�P����Y#�S��L� �2�G���x
aH�Z�N�~��}���#��,��}�'pk
��&�w�<^�����9��JY���N��p �
Q�? �(���\����]��R,�������4uf�bR�����N���R��`�g���'q���ab�$79F�����-#���4C
$��y���
���)'����*X�n��.������.(��h�i\�R��T�1��0a�8�RtrKfr"��������D\&���qC*���|au:�"��G��+�M
�������=����8�����909������YB�`��Hw���Gh���c�h���&zzSh*Uz�B����C1�3s�9�
A��y��y(�!�(�SW�CO�!�����4~�)8�	��T��O�
����&'�_��-�[u�C�,KL��,^�0D�����U�S��'_��i>d�Ck&�������2X(��@�AN��@���[���k�1�0�U�a�!K��p�4H:�c�!?��+s�Q�^K(1�q2�T������8�NtbS�������UnE�`O�u4��o�,m�m@����y0��|�p�_%^/�3gb�?r��p�C=��fT��@[�R�F
�#����h��/����p�Vl�y�M���;T�bg}gpL,M����� ��������K,9R{u]�;/�!wF�{�s�N��##�dX�Fobb�!�8����SDlK�HD������!<p2.��������r6Jq�[i�iK`���<+s��[�]WQe�c�nv��M{�(6�`03�Fg
��3Y�Q;��Oax��r84�3&�-I1S=1�c�_T�?�@��>�;�<}���:Wy	_F���rtHCz��XW[�o�`����c��{c�gI����NS`i.���Ybi�����'�+�<j!��5��~����!�n�F����������8"p� ll�n�.)���V?Y���V�����.W(n����nA��}��qJ��"�'�6������Y]����`��D�����s�!E1j����L�ts�[�2X�"yZ{ �����Hp/Rr�������nw+��E������$�"�{��%�OM�z�A�=j`l�7}�#�bj���>��>���r^�j�>��W��=r��U����F�Z'����5t)9��Q��RoE:��n>�&:�2o*�X��	K�1��HN7���*-���::�7�A�"��&I���d����1��z8T��B�=��>0J��^����j����3���'�Sj�
E]��nu�B<R�n����y���ee�b����"�	���.��X�Y��]1�X�4�^�g[g��pA���tMd8ez��9�I1's��R��O#!*)}�
��j�V�����\���;���\�G��P�����7���![�`��W��!����\���x�^������pl��=4�)M$'
3�(!�D2Z+�|�?��	%�*`K�$�j��?y���%�.	�
��r���s[^_}�y����[L2�9�e���j�@��\�2�z��e �G�rj��
�������,F����.I����L�b�W�
�k5i�Y`�D���P�WC�����X�����<B��4x�1I��<i"�I^���+e"��ZM���	��f4������\Jh1�%�RG���������+22G��T�{"c1���q��t�����0�@���To:�Bfr$�,���$�eS�h#���B�D�}�n�b\}���u�������j����N�������T�0�xaWG��"��������
P���"0��U�Z@��S����~GLr��`�j��j���J�g0N$'�b���5��j��'��\��v37�)�i�ri��j����)k '������x#0'Jl�qw�p�X��~�X�8a���l�tmF��\_�9qC�5���>�L�ZB�;�I�YqtOh)���y�����`�`��y�m��u&g*X����'>��.�K*%�!��������f����jBZ��AB}	D�:
�4��i����R���N1��'�W�2wM��N)�G��	�T��3���� ����	�����fbaM:�]@�&��B�O�s��T�TS ��.R�
d���U�P���q���u2B�:BCf���A#��N���0�*�!�i;D�Wo���l�
CuV5�UQ?9���P���6�����-�l��=�"�~Mt���-G_h��;�_��J�W��i��c�9k�L�/*�2����=�
���vA@=${�u��]�(X�����wX�'����.���U��rb� \�/�8�+���p�1}������2���bA��CX���7%0?H�V�����Bz�z ���DMm
����l���9]�����D`]��>k������1��+yJq�B��n�ZH�{R5y4�r��S����o�,�P�^��6���7*�g�n0�(��w3�t��^�i�?����>,�������%v�m�}��9��"�������8
��?����~�{�L�	�s�>1�<J���R�;o���n\m���$�O���Z8�aM�c���w��O�7MR�6��;`
8d��y8E`�i4,��.�d����@ R���H��# 8f�.}5uuc �6TH�G2��M��=�T0������7�n�?�����������_�4����:�UU<F��#�uU��V�Xu���h��,�<���|��r�FFF��3��8��ylD
+Rn2KZ`���-�,���4�2������HS>z��~D�_3�au���p�%z?�t�|p;�������'�Y��2�niNb���H���V��7�\���H ��)�b*A"���QgD6�)j����Ko���8�b)
! l�S���K�!T�g�A}tAE���SE';����+7x���2T@�[�&E$m���B#L"1r9�\n!�
� �<bERP��TG�j-�JX��������n��HT����Y�����Dr�����q@�?Q�9?�V��Vm��C�^u=W=�/�PRk�
G�/����Q�bM��N�R!���q"�;�f�+�-��i�8v��F���L�s�����������7B�m�-�Nc	����ntl��C�KG�,���A�BMhp/6��tm^�bnC4O�H����u'3�{���1����Y����	�����|�{0mR}�D!�\����R.��<R���������8�@H������{���`lm����
�}?�3�C���J��4�g@Bx�������^v���N�#�Vu�0��jX�lA�<a0��Q�%3��a0��R�R�b�r.{W�
����� L	�[0��?����mC����D4��~B�*w�	��[~v)�
B��������!-��
���S���vOg��v����1�e�|�0/�p������?
`6
i�T�t������|�B��
6hbT(N�<h,�	���k����W �YqDI�O��E�~^��P�l?Wl(�}jC�4��q��xR��]����t:,lO&Z�?:<��(�6�s���K��U+��o`c;�%�3~\�C���h�_�^!Ee����n�H?1<�*��J�4��!�]-.�g��f�2X�a��<�Ewt��l����bq�_9�de!��+o*<[�����u��m��g����)!����3�F����n�v������!o��M�E�I�{�"���>���H��V���A������w�vL�j�z_�����������.7�y:s�n�;���Q�l����;����B�4�cq��������z��O+������pa>����v��i���:��nP}�j�5���G�����2e���y�%8��J������p�	���%9n��}��f�7"�q#����p���A�&��.%mY�|���������s����g!�������qg �\�� ��c��,LM���*+[�g�1�B��{������Y�xOq?)o����q��iid}��[�S�n� ���<{���2o�iN��$���������O�]�f`?P���D����1�����vwaa��.����W�	n�������8Y[�*=������u��
�>���.}�H�T��n��f�R����K��	�
/F�b>�E�X���<D��.��l{�y�q\ysD������}X��R�da�L+�/
����,���������o�6"s��������`9�EvJ!�\��m������J����[��d��
�k8��=�p@"�Cr���������H� |��Pi�bb������-�V�{��u8c{r���Lo�_�`�@���J�OK���������BVPHD��Z ��n���y�g��S���$����3�d��T��{���z������r���L�O��s���:s(�r�}�����[t���LN�����
���t���\)����o������>��������1�����V���V<-�{){K�_��|������w������M�?Ki��p�����������h������<{��������p�>��M�/�+�J+��}|�������i�����i��x\������qNU���l6(�B#�"�u����y����O3�r�
K�g��j
	hA%����1z����[���k<�=�0l��$��CoCL^���?F�mf�%�[R�1W�J��GvJy�2�����Y!8�`�]��B�����i����a5����?8��Ks��y���������Gw|�6�����7��{nWo����q0�%8�se�Q`�J��_������bo���ykdaf������4Q�����l�$9�S�<,�8Wa�;�Q�#>���r�j����N������\�����E��m\�;T��������U8z����h�2���%n���>,<z�]�����
�#�&Q�������	��8�Z�#����{^�O�';�Sf�s�qs?9��J�@���p�Br^U����Zgt�B������(�{��`VxN�q���}�in+��0���8�h���Pg�e�l�`�t��Q,���x�����0��|3��p�r�n���S��,,��a�Z�MG_M��0q!Q�f��.����@���_>t����S2d����y��0y4yw������$IBB�����(%3�|	�7=�'����y]��a��'1N�:���"��4�~��av`�YZ)[`iX@������7�.��|>�dA��]�����$%�+
,h��LWQ����Y;d���K�A�����U�7D���5��oK����~����aQ?��Z���?���4��Z
���
�w��*�o�fS�Y�n_g�5�PF�����'{u���u�v�DufD�e�n�g��o<K�r�P1r���g�o9��b�^����#{��}����o���>DZ� ���`��1�,���p���7_1���f��hu�~����6jH~S��Q���H��*�k	��t����V�+�+��"����>H|A(�jr�2�������*���d��9����T�l�S���O���<S�	%����P�-�eo�`� q#Zi��P��t#5���#^�Qn�a�����9��7AM�
�Id�c���;|���b�/�p�F�j��nv��Ru>3�6�h���{�
���JY��
�����=�.���fL
01���R��Ge/��D&�Ebx�
p�)�����=�i�cI1'G \���>��d�M{u����S{�P$S.�I��"��U���w�C��H�O�R�yB���ZV�k�D�����
}����g����� OZ�~�W�@�'�!��&�)��3�E�
��"���:A@�"UHe2���m+��!�#]r���
uxM��\���"���a���%����M���3(�^�g�S�����V:A���Tf��L�*A9yd�s��g5�fN51]�\[���s{!y"y�4�X�$,�ve����4���s���x>�lN��`71���������v�����84�@f<r�m�b��~!���1��:�=�n�[���!����M�y�����Vnw+P�r���zZUJ�_�E}���a%����������s��6���~������/��FN�KZP���4Kf���t.�M
�9|�lh�l�����
5Y�2�lg��p�����S��5T������+**T 1m��9���Y��Aj��1�u1����'n6�YF��EFm�ho5_��������W
�<v�������0-\���n?DxgA�s4��l������C%; ���drs��� ���	����w��`���8��0�#N�k'�����U������U���`�(#�K��(~sM���"a�{�T�GC
~1���ZX)�)m��KaWT��qH�����8}�p �����p����3��������P���J��)��I���1�0����
�����MS��T��w�4�5q�[�M?w`�h��(����z�
Y�)8��J����	@���i��{�%��D:|������c�c
$HD,���b������JSO@A����%��d�a���iK	�"#��:�"��1�Sj-�������0`�
%�A��	�V�oH�������*	����"�Nn�\�b������>���6�&�'�Hr#���o`C9m��8`;	��O 8�xIl��2���������v@�xv�0#����W&���{/�t��S}��j:����-����+���cf�M1�9�Q��j�	�o��4�p1��R��!���eN�|d@}nWT=��No��p�e~f�

-�y���z�����E5���jUC��S����e��1|f������^n+�{�$�T����"�;E�R�V)����>kKts)y� O7����a�aw-������]�s\��}�B��XtI_P(�@��XF��g$�`A��q�
'���D����;��#6�>}�E��7�Vu��i����
����IU����$���e�H/E}���M��<�� �@�DU�X(�s2
��S��|vM�� ��o��,
��W��<���s	��U�XJfzC����`��MI��F�'�
���hE�cFKW���9�@j��)�D��:���CEN�z�>3ZFS�
�k5$:�Q��d��:�Vdd�r�e���VwT�Huj�Ig������B���=�j�+|~ l�\�F��l9�;L��h�5P7y�b
)���MVu{��J�Q+:s�z���&�sb�[��zX\$M�f�6�O_5o��b0W!�w�w��Z�f/��6:��@95u|J����U�+:I}�����N��y��jV�6����m����(t���t��k�+�����l}*
.l��lrj����?�X]D�Mrun�c.+�A
%���ld�3L]�X����fd�/8����NYb����X�sD������S�>a���7!��1s���E��,
-���<�D����x+��0
�.B�ES���Hz�kx8K���a����$��(y�&m]�p�q�9Z7������<o��:������n�������_�z�'>&��!��u|p�[I�@2��P1�^'
Iz�@	����w;�jo�|�6gYN.p��'�A�����qh����rm�VMC�v�/�0(8u��}'l`�7���S����S�~LG�>2�������~I\Y
d���v|n#e�\}����L����+�1��p<��>>�Z[v����`�UgHVz�+@P2�7�������������NY\�<�w���"�����9ds���4V__V��u�1���G����L1��������t�W��/v���P��H������rF������#Db��_PP	���6��~�nc�//������<�����=G�	�Y�z���zX���gK�r������`D��s�{��{�SM����!������j����b	9;\�:����UO�,�y���i'�Js�J���s��dq�)��a���`.!�Io5FG��&�>��r�S�d���k��7���=�����yU�hW�j/�TV�c��s��K�*�&b�'\��\�)"�N*~�n�1�d�q;x"i����z�ovB&�����3����\N�5]��+��<���WV����4������G�_�����d��������
f^n�����B�M(����]3� �!��#9B&�����Fa����������U��
��(�z�N1*	s�y�5� ������7rR��BB%���>�w�p�or��t�	N��6 &5����f�>���#Y��^~�����*������z������K����:f���Q3b��#j7S���E�	iuZ����h���d��2��~�q]��)�j
#)Pq�(��(4�J���Njb��1�� -��3�S[�#"�C���(�7��N�����8����M����C�7����qFp*���w���B��S�X*�_�O}�J�6�b�!"O����Z���7�����t\���]�p�]/������5f%�?b�@�08`�)�K�O$���+����O��E��xC��a�a��[;��������������s���%��K������V���x|lunL���Z�
�b�).�k��fc��?}~�l5���G�(�}�_$v]��;�H��f������4�s�w�G�1�8�.������w��
��jY����08��y��@��_ F�� B���O������! ���iB;p��G�����q���Z���L�����\M�>�\���	S���y)���H����h���-U ��\�@�9��:���e��qP4(��=���OVx�C��n&���N�aA�D@Z��N1�
cq~�E���'�?�?��/Y�l*[��|�^�k�_Lo�v�P��0�)G:����
<�G$�}�H���$��N6 Dd��;���`'~�I5��6hk�T�����!��d��������.F
��`k,�b&w)@y�R�����A-����"����0��������j�-]�Uu�zoS`���l�_��z���A���y�KL��`F�N�_�kim�300p���#��:c�!�0*jIN@\\�v�i�$��Y�'�]��yS����[tc����e��lZ�_(\8>����S`W�$6�����f[��������	�o���:/�`����)�~��o,2h�a��~t��3V��t*�������Ni��������3q���������bHL���V�Pg�m;�����
�W	l6�%���J�__��7�)����[�t��w�	}����M����������"�2��T-����e��<(�	+joo�P����#C�����V�������Qq���������������v��O���������_��x�������~��)#? ��*A�m��I�
������?KS�inS����j7���J�)x�����3HE
6���|�O���(]\��Z�s(�������7�oGp|ku��NC��=el<�,k��5a������Y[�]l=�fl�v*�}�k�g��*�qn
���d*u��nm���u|�\u���W���Y����82V�
J���<��9�#r/�����L�[���S��A�sN�������PB�BZ����������	-6��^\�p����89���a���$��
�|��S����������I(yU}��Uue\����7|AV���n���)U����<O�-p��R���>c=� ��x�NtW������_���?���J�d_�L��m���������	A����V�lk��}Ms�c����O�vn�-��yCz�g�����n��fR����]�oyDn�	>����L�7n����m���AG�]�j�����/J����W�}��I��9?��������b���4fW�.��N�]�2��w�}W���Oq�����s�}�{_�wUZ�_�5�i�����������������:O7n�*Z���#E�����W#�����K���e�}��8S��+�Ym���f�����p�L
��7��+W+�*~���?��2�����bb�c���U�7A�+pF���3��Q�w�^��gGG�/���[n��Q��@���?Q
�~�`U"_Jf�I��m+��[�.�����;�2���.�K���t�Jr�X�6�fWg��9T0�7���[����~�q�<2�h����l�WF�����M\e;|����Ee��{��_Qa��m%27�x���0����D���mf,o���;;W3r�������w��1k��]m�P��]��L���fi��=��o�%�;|�����hn�L.�z���<��M��]����5�5�B�"9�<w���*��{�������Zd��}�s`�~D�y�OB�~��A����+�Pf�Y�>|�*�����}�>���_�W�<K4�y<��*��yYa}|��-�w��]B�Fi~b�1w	`���J���s�������HM�n�}����������]��wVQ�L�����`������>�Df�j$V��������Y��\�+O@ZD��(/���tB��k��g�s�Sp���b�FQ���������%l��_���l�D	��������K��9YOK���F��+������W�t3/j�Lx��G���Py)*�!���?�W������>�m�aX��J����G^��@~���M�X��k�QNN2{7�}Q*����wWs����8���_k����^�{^g��L��������U�G�ov�S]�31��O����31]L;�����H���?&:���(�p����f���pN�T�i�\Ss	�;$�g���f�.���������n�m�o��4�%_������n��EN�������u[<���d�}�] �����8��/��~8������%t�]��3�l��3Cm��[kl�4��OJAHCO��p�� �k�O��y���g��S�A��U����1k�������B~(Z�vQa����|Q��i��e��{��F��i��i����9���7��_8o�����O�T��/������Ao�"�9Yk2����������2-s>��-�X0��L��=P&�����l9������!��U�����~y�S�_�y��l��z�)�+�����:��N�����S�x������Me]����2�U�2[A8�u���v��Wq�
"������W����>���q|v�����tI����#'?����Z$�KS�KpyM�+�$���+|}��.��
�3���U-DCDE�m���X���
��%o}].�4C��7oh���3pv����������(b��qc��m����������&W���o��y��7�V��P��wB�����W�%U���={��<�����9.��/=��\�%*�;�?lhG`�r5�G"���Od-��'(O�6��$N;�:�����pQ�#
|g���?�������9%�N�En�F��I�]�pJn�x���c��R���m�&?��x���>�&m���E�b�.��d�`�%3�u����]+�����������-�s��l]}e^����[����u�M��?�w���m�|�&����^o����oznR,�KN1�x4���5�o�~��������<���-w�VJ�m�N��y��|�6�F�"����*Q5��zwV�������o~����\8X����f�9X��{�>����j���e7Fo����E�)�n�.)
�����^�r��[�}NB�������P���0N~�[^[�?������|��W{LLL�8w��g���w��,��G��E?��=��	�������-;7�h��"�����]�C�m��	R�<(S�W�����������ef����0�?
~��l_�Gr�3�w�`��,�����������G��o�M
��]>��|����n���,�8�d��t��]�q660������I�&�����gs)��%O��b-�����&]��������Q����R$3q�s*
�v�{��[I�,~H���L�����,�6o��.�	���6�$�56?e���e�2��.�-�������w��v^b�Y��G��4�o�Q���x5���R0�>�p���
;���:�/G��������s�j�P[/���ny�������+--��3��s�wX�T/S�����IxM�?�_�#��M7-�f8���
�z������ spl����{9B�+����p�>����/\��f�G��r�(�A�g����1&�i��+�2�:3>��6����R����I�O��X�P4yf�����$:���yCMGg�a	F�i��xc
j�wJ��OB�M-L:{��oV��C�v�����
�_��3��*J�������q�����"*�M��������$0i |m�WH�0<���w��r60Mg���]3>="��z��8}<W����d��ts�k3����z�7���vN��C�;���n��3���������i�W�w�����oP|R�R#�����#	��TE�M��-��w�c���c�������5?k�����#������7�7�e�r�R8����~Lj�V}�������S��HO�M����d-]vF�T'�p:	�bR���A���hc���Y�������C�cL�E�����
$U��F��#����9V9�F��,�+�0	�����j�9�3k�������U�)���p�r���|�&�R�U�������26�&���w�#�6\�-y�q�![��,�-�V�'���Q��65�������i8���+_�Lm���e_���IN$sx�yF��8`���?l�s�Hwz>}���B�E3B���J�9��0IW�?���������u�N�?���Cue�T-��R����{�s��(+u �n���'dG��ei/Cf�b��E.��>� Z>8�t����o�����n)u�_l�������S��;��4����w�Q����L�KCOA�M��G�%�3�
�Nn�����~������o}��z�&�Y�s�������/G�6�>E��`^7�
���i�A�$���sNp53����O�_�}�1���L�h��b��)��/���V�����Wj7.�g�Jm/Q�7����Z)/�� ���g��e�Ou���	����Y�����IQ���1B�{�"��DV�4���I��}p�8�:��u�����>������������z_�����u~��L��a�w��������r���x�.��=����k�yc��;������H��o���kp���6�3{+o�y8�)�������<9����y�M)N]]R�������-�\4��o��'�f����2�3��i�?�D��Q�����$��go��]�
��"O�����fU���(�u?��w7������[M-��JD��N&�@J�9��g2,��K	F�f��eZ}b�����BD�����C�*}��l
�+�|6�����/��H���t���4��B����p�v��Y����%����IpF�VRqT#33�'�����`�b��v&��t����~w)f7''fzq�6V��9U[2�G����.�n����Q](�����w97����BQX$�7$��=PV�T��lC]�P��|���k�#<��y'n_�S���E��]��n�L�X����k�vq�k-r<2VJ����$�WG�R�<r AN��@c�Um�����juZ�[������\a��?�yp���Kg��B����[/�3�J�P��H'���������#q���tXj>]����|�6�n[~����Y������n�{��m�0T��)�����������n#����5��������^b����&�*���k�=J'��
k�8��X&2c|���o7�zTB.��1���x@��y��x��� jO���fhT�xO�*�?��^�1�OK����#;��R�sR��hh�^��3(�� on0g����5����9}����^p��Z�b�5F�w��������E����%�2���cN_��/���x����{�a�m���������D3�,NZ��j{��V���p.A����U����&-�H��ricDc����;1��B�e���r�,���5�!�T�|��v~;Z��Zg����;�J/�B��-pk��d����
 �1��f]�������S�o4��Z�g �tc�����3E�_�a]t=�T�����s[�q?R�e��o���~s>L�'���'���)�[*x�I�p�LK�a�@ ���5����m�������e��?$���gff�V��`�?�]�9����������R=�z��;a|_zs��}[�oMSN�za02���=Jw~}TUW����<r��������CG�&�(
��>��!��lO���#���r���E��|��d��6���g�Y#��79�T�@o��u�A9L;���v�H�Cfav��PY�Y�~.dP��p�������E��r)����B�]*&�W7�z{Ugg���0�*{w�Qc��W��?u���c����es�;00��6X�+�#K�]��_tr�P�R�N�]l��C��wLhxF%������tv��I*�p�hZ�a^�z*�����gfpzv6��zV}�j�[O��Ccr�p��?�����e=
8,�e�/�?.@K
����$�+?3,��D[\<�g�u�ej�\{���:��������������nnU�
#7<o�/Nhk��HR���~qvAev�'�Y����A*��_�f�s�M����t����||��=�1�,B0M�8�����{�Y�Ty��l��s�'kH�����b�.<�<�#4(*���0�����l�fIk��\+�������vv2��;<==���_Xz�
������/���1���m������
��C��<V��n��45��}����!9Y�0Y�x������woR�}l}��p��l�>zkio�)p���*��e
7��A2X��0~h���� �]�u*�^n�3c?��:������2���C�M/,<01=�0R^j_�5�|X;���.�S5{	��u)�����I����c�m5��eKD+�k7#�;��:��X�=���s�����\��f_���o��,�Z���o
��;#`K�����k�3��}�W��9�R�Qf��$�YX	[���	[[[��<���;~&z�]�A��R����n��pB'��w���[��
���_��w6��1.^�x�K�K�6�#��Q��������I7BQ�sB���Q�'�vk�Z�	������gWVuv�����>Pf��-���'��v�$����6�#�-�/o�R���1���	by�66</,km��G���|�o��9�V`�-
mB���L�z��5��0�O�d��u;I�u������/�WvO����Z��k���3�@\v�c�k9��	��X���L�I��TC�jd��"W����1��=lA��>�/�6��a�(��z��*�����V������D��v5�����QK���"��b���hM.!��Lrs�)9T3��e��O�X���p�e��r�G'S�#�A���q[[�:Q�X^��9��T���-��"������R�q9r������D�-7JOO�J5���������\(u�������[�+}=i>�����iq�������]bk,��'����f�����f��b�F/7	�JJ�����(EE��I��-��"+J���p��g��:HO�:{��l;}��*��x1S�so�A��S$1������lt1���v�kOfyh������Ge��%�:,�x���u���kQ�;�dQ&5Mu�>@p/�q;-Q��ci�2���}�^_����:\DY��Qb��g6O�	�}U����Vy��>3��bU���	���%������T��-���)"���w0&�G�
������,,�E�(+q�EAu)���2V:[����UK���&�,��d��U*��1Q���L��a
?rU��$�ia�_N=��L5*��.#�	�)~�������P�L���p�g"��L����1����`f����9��@�{��q����[i:/�"��T��`�������k������^M#�1���g��?���\�C�sI�E�o��t��/������Y����.�����u������'g0��?}b��	�?<��~���r{jz��R�2h���_�2��QC��'�m�e��Z�I�^z��.�����
��Nxu��q��n~���M�}!v�D����.�S�����aK�8uG��C�>���!gC/�����[�R���N��B�������q��
��8�owaAE�l��v����66�nn�E������B������M�(#w���������0�JJ�h���j.��;���Uxsc.�S�8i�-cH��g$4<������gV���������z�?]�,�X:�?W���W��a�S|
�p;�qP�ES)d�����m����Da��g�&��m����P���],�Y�J*��eO�aaaFn9��"��{mG�-\_���q��3�^\\���dB����H0�����K{_��r�>�1��{u`G���T'�E4;������@��H��,�	a�|F:f���AlW>^BG5-@������hw�������Nfv	���ns#�?�������uz�b�u�3��Y.d�bG�����{�\N����������^Iz�"���[���AF�oE��;��K�NRa���hG��k�j�d�mF1���=�_������=��z3-p�A�m�_����������[Y]MR`bWp�x3�wv�[�����0��������2k������_.d~w~v����*�H}+]o������O����o�K\DE�cm��=�e����o��k���-����o<����lg?�R��?���k�tQ;6)��hS�i!N=���v��s���I#<��fL/-��C�%'���4���4�V~zH�r������lb�ML�3��)2���6=wN���D�mHT���������������v�\��%r/.%o.���-����N
��}����BJh/���G�+�
�V�b�3u��1sQ�L�lccc��{O+++aVQ���o
�-�:�?��#m����80Z��+�^���"O|�����`v?�	ibW�3��9\3���zJ�L��N�gQ�p�B��c�""�f���J�0$LA�=�T)^����@��A���>���|�/^���p5��;�;��;��sZ��p5<���g����\!$�9���(�;�{}+��uc��o��Q���<=��([|�LP�^���g��].�����/�yB=�����������f�7,L]G�9,�}X,����C�r�����aJ#��M��
�u�>�f,��%�t���a%\���M�mn�M���ks����~Y8<���JQr�#�V��b�j����	f7��:�(-
�GDI���*?��,�b{W_��1�iK��q�*;��x)����ix��y��0�/z^�ym��I��������}������i�vf�-�A�K�c�F�q))V `�F�89'1���%	���ro��vVa-@2}��;��D���]/-
>�����P���4,���u|\j�������D���.?���z��'�
bj��MA1q!DMJ�ncrM�#����'O���y}����p���p��?Z����m������ik�x�������{���EG�Yh���*��I���JK��u�C��������6
la98��i�����2K�8�L������8)�;:�����4'����������.e�������,&������b��n�:����m���x����ZwD�����i�����ev��/��z5���R�u�hm�Bn�����!n�.���S����>�d�(wRD��!�.�T���PF0�Z��n�4�_�R�v���� h�()����������'^��!��p����n�[V=^���3��o|�����U�0E.�)M��������z�)j����3+��f�+�T��C�wBCGPo'E��������E���0��������#m,7�g�x333�������E�����)��������T���wl�5�c-T�'�b��bouu[0������u���(va��1R���^�{�_��V��3t8go/��/t���\��G��m���g�uY�+��K���/n�Ub����g��%p�L�o���jE+�����0����`�Lg�u���z@C���|HM��w�`���8���
�[�8d\|�Dh�;�y%���l����=���/�"E
C��]�����=�I��o���/
wsr��x�����.���z�N�^^�6���m�>�������u�
X}k����	��4<�)�i7�jLj�H��e�7ZR�����f�A��d�lN'���6�+�t�����p�������t�%�t����.;��V4�=������i�vvh�k~�SC�@{-mC����|�J�r.{���]��5<���o]WpzV �i62Fo-�[9=��r���p7�C/?V	B[=Z������l����p�����g���4���_�T��'F���c������T@��G\c���{R����7I� ���4��x��K1�����B�R���b��n_���W��������b8��r�n��4����F�^7��W���}S�uMq�d�n�6�+��u�=�~~��@��u���}�.K7wN��������n)�e�
-:�*��(`k�v��.i���YY���@�Y,	���1���,�����������<��q���?Q���O,-����8h�6��o����h_����{S����{~��B
�������������P>!!z���57�(q��|��yB_�	�5����o�(����y����&u��M�b�~7}��}I|��Y�_����/`�[�62Xn�q�N/�KJQ�gLi�V(mV5���>��2<�%sYf�z��xM���	�������]�.������9�CR�>�`����W��Nc84�X>7c�/��������X,{��II��d�5H�n����]��n����>�^HI���@J�7�F��
�4n��x+��wg������]�b�
��6@g�gG.���)�7+���O7�]o+��OiLi��,�x��J�"����)�@�����\2���C�/�DD�Q���C�����l����/ ���V���F@:�{�	t�5�_�����"�fXu}�����T%��5wn����7����Y����o�<nC{�����Z%���������3]g�1�!��R4p����O�����JLLD;�[����M������o5fL�KUK`���<L�of%��I.�����<	��:������[�r4�L��������
:Z���@�*�o��f�
b���J���>������RS+���6�Z�|��_��"��^����3��yYK6�e]��}�>������RX�v�����@�����������/=|�����Z�o\����#�����$��T����k~���xEN ]������f������8eq4x�t�<Y�g�\�Y-�y�����F�[&%�L��z�f���P��y"�����������=��f��>�����ZC�
Z�*��f�CJ���gG����D�K�7aT��hw������I�,��f�R�gn�����h��d�5������p����s;�e3�4���L j�v����N�Ymc�C�����z{{���t���w�cg������v���K�.y3O���@����2Uv�����(�7�?�����F6$<|��lm�)
l
�WWG��1 g~�
��[�=����"�r-���#Q����3g��2�C���\��8�������^2e�{���K:�G���o�$�����G�f�	h��^��2�%�RZ����f=�W�
P�c���9h�;'c�����w��)/i*��r5~�����V���h�T	-�����l���B����%��hI�i>�#�����j��o�����M�����7a��\�����
Z��]�������t��z�������rmz���X�{�V�}w�4��GV!N�y�LY��5�k��6���u��K��3�4��&�ZyB`8�X`K�k������v+)+`2�
_��
������P|������j/v�tQ��:SC��Iw���<Y��Ai��P(x1F�@���Fk�nP������x)����b��s��J��q?�t�zJ\�q���r.$X?W�8�N
Nks%�@F��"X�r�~ua|h��V��(�.z|�NWo����Q�8mL�!����,af�0�m����k�L��'\Y]YID����������
b=��������7����u��9����A�{��cW����Fn_�X~�c�&~���|f�������`�����
()qw�88��p}4��	T��?���q�=D�*�!}�vv~{����K��
�'�>�P���C���Q�����cx����t+������T����thO��l�T�����$v�[��9���np����&!�B��z�C�~m��f�C���(u�{bM K��G�ZvV|y"���&T�Q~P�������KF� x	��y,+>yh���F��0�'t�k�-Wr-���:��E����q@���)�)����'de����t�",+�N?y�D
 `)��b�T 7�!%����2�1��9��UP�����'�u��P�j*.����[�q!�=��k
$�t�y �g����O�@`��}������$l��9�|��.j�\75�:�pm��E������A}KG��j]�O���[�x0��8=V����?�K��Nm���@5
b��������@B�	�/��GG-P��EP��n���s}�MC���u{f��3hn���
"�sa<�i���X��t�v��)"��L':��i������3n��������#�#I �F;r��d|�����\p�X�{��:GJ�-�����W3]����F3�������.�*�����Pw������g��a�����2y�����h�*���;�$�|M�,��I ����7R���T��/��[@4u�f�e���\[���Xs4,�������zBg��yH_��JJ`�E���9U��~�����f������V	]����\�{�u�_8`�L���"#[��<
�j��$V��"�I.������[�hUwuuc�<h���cG�)�Z��[�<e�PQ�$������yx�)��`����[L�F�sm�x��|.tM�m�p������G��������;1Z$� \�X*��y
�N�2�b2Xh�W���>~b��g-v�jb}D�1�Uu���B���+N�����$j\��c��a�4u�v��k�~��u$�	�`v�m`-��a2�����W�����r��'(Z�i����6��'-|_�~me��vB����Kyy�+\Qg�j�q�M���f�fZ�����Z�����e�0��X0,w\�0��Ur���4�_H�u?x�/-��l�B��F���A����\�6�f�\�eK����}KP��/v��(v�qhhm�hE0�t����y�o�N5������s������=d`����E����;C��M���s�����2	����,������^lx����D�.��+��E��4f[�>\G��&8��@@�6Q
n��0��L������L@�i���r�:�����SSS�����Z�\NV}��p����M�co_f�_�?rI������{�Y���K��PNp��d',R���>??o
��R��e���V�������6���6�(7��e<)$�@��{���W�&�9�5S�N��c?�����\������
P���Aaa�?k�L>��
'
^����Q.V�A�s��4��������,wU&��?~d��ga�c3p��?�D��^��Hc�	\�uu,9[�@ZE�f�Sz��(T�'�'��G���M�Sl`����E�|���P-�$�\���Fk4�-:�u���`��s����%r�D��QJ>����E
�=k�)<�W�0�m���^���'�Or3h�F��,--m.��8i���S���X��Ub��1O3(�\�hI�,���X���{��N@
����
32D����������#�%h^�@�*��#�_<��y[���Z����R��A����q�G����������R��F�RVQ�\���%*{�x����������Z��k��*l�<��e��3��������l�qS[��5P~���Nn%J��RnS�5y�h|�xHMq��\H���tR��r��_�&��'zJ���Xz��U�"���KI3��v��-$���a��/��J�NY"��mll��f������x���2R�p���<G����k�����T�Q�z'�0��X;�Q��I���d���_�/��(�R���tb�'`����C��W�����
�{dz�L���6k��������?e��#l����
���1�R�	�K�
�vs^�9	��������������i~{��z��vvr^���_����4����/����b��w���PG��������R8�m1��a$n��nx��K�*����F�N0�#9�t|���C(w��ja�0cZ�����!&���1&���t0���m�o����o(��9�,�*fH�-@�vz������+6)J����T���M�
8�������/�UK�P�K���r�������Q	�Zj�z�&d��uu��it211�J���<Y��L���A.c�r��2��+��z��#���]7�[4e5v�]���iM������2\\\\C��4����s
��s{��s�~���H}����6�[���8���9UHJ)�Q]q�+�}JM�h��A^�72��A����2�snM�/����S�����~C�!Lt]��K#���v�~����XEV�-�N�Q��r:�$�8�y'�����������9rx�+C,���nG�u��~�/����9��c�V�z���CWJcl��4��j�'N]��ITHe6�,�y��N=zW.��L�h}��;�c]��_�>��F�/��Wt�'wpJYU�������+�J���������)Y�RRk�C�v��JS���~zHE�k��D���t=YT~�);q�8�j��v�
R�����~I��!R��M>+)N��qX���8�?��p91T~)S���tyN�:O�{���p� K���,��e��oc�[���+�}Z��'�����q* +�mR*6N�y2�b]��>�[��T���`)#��y�NZ>#������,����e�8��e�\3�$	�a,zKe�@e�����;�=g�j>�U?��������#���L����;�*�&?k��-7c�� ��Ff�	��TZ?���p)ev�{|@<�mc^N��cxo����a���D't����+��D�9��m�	f���2���9#�����i�l+ztBa&��Ee��MY���[l+�i�����>/��&O.e��9������\gP-�������D���E�(��.q�Ov��������!�h{�/����Z���[��"�����"�H_+���}9Vl��}9�K#*�#�Q<�h���hw=h����{1�=.��8An�k�e��9�T��!+�'����=iOO��45mm��9S��������4�������Pe;7;T�^`���ksm���0��A���a<�u�����b��Y������y��@�D����1�U���M��.��<��8�����S�OW^�:�^�������������*����S �|�����6�]�R�-e-�]�++�����_�^:�?d�&T��Q F�<���a��va���8��)"�^�
�����5��f�5���o����x�i���9�����2,�����)V�^1=}���U����\��K��������3D�F���[7�R��"�5�9��l��K�1�W��s3se�c����1������,�~���(�rbn|Lrt��tn����0pB3��J!W�bu(�u��e�Q����7���U}k��kwk�IK��8�K��]��fV��4�7����`�D
�cR�_q��,���i���5��6������o�eH_�tO�w�����fc"�f�A��}qmj�l"z�8�h�o��I�R��ku��@�[���7MI���?�7�g��a~�J@����=�IV`k!��>\t�L<�
t�yW�S#r�	�ym�`5�}6�����1���GJ�|������E�kC���Hf*������}�dR�!W���h�����g�-�	�}��1�e{���0�0Tr�il/�*Y�+5���\��%c�NV�4.���WnNB ���?�VRO����B�[A3����������o��b�����3�H�!'`���5����'_�6����fT������	X`����`�_y��{���2K����2G��
�|�y�(��5
�
�������7����O�t�Em*������;���D������28���z���F�J�'��q����w����L9�H�l�;�������p�?D���7���x��1��c7SG�����V��\����&'�W���
�v
�#�o����F)�ug@�������>`���B����l���n���M�
R4]��N��/v��{u�tp_����� �_�%�0wi$(>G���[n�`�p�_I�&�����������.V�V���6h�T�9���r&S�������c{�b!p�M<�9��	�i�%5�a�xAU�2��bD'��0�	�q��=��*����<��
`(�leDn���u�X1F��O��i���o�ee;>�b(����E���~���E{���53������Q���K�������]_���+�i�q�����?qSIII���+��������Ab��(vN����zR&�j��|XWq�H��Q����aT�i��M���PW���B�in�f�P���$$����X���_n�V>��U��&� 4�����uK/&�i�2#��� ��vD������,���s�z�f	U�����)�����1B�p����J�q!�Jo|��J
��zo���pb�(;�{b�u�S[v]���	��~�&�|�=���3���\[W��]>En�}�St���f��@s��z��%p���Q������*@+/�c���J���"������J�(ut���)�7PM������M��F�m�6���������e]��B�e+o���<z����?�b��#5^j�t�&�Y����0\&~fz���9���� �B��%��?�����]=V�8$�$$WhR�-BcR�\H
v��)���O�R&uD-�$���?���.^=���a��xOMKn_����Q#	%u�����+��Z��Fk	"A�r�D��S���)���^���?;b7�u�'\Ri�&��sE�@2�kU�d�������g3��k>.Y{�:|�^UU�(�Z/�\�bS����7;?���������5��+#s��/��-<�6��Tbb+�����x���
��H!G����Tx�@�D$���^q��Z0��r�~l�@��'� ���V}+.� �x���{��	������$��[�zUs�00'���������@��'t&��v�Z�p��H��L|Ih����S����K�L���[*�[�,�"���M�k��;g���QN��$Tek��o��:�	]��I�O�N��	��>��\Hl���OQ	^�&<$	��)��z�i������[������H���"�j�I�PJ�8q�#`�����*�qd�����A��\���{���}i� ����S6����M��,F�[��i4ty�����*"��[Iq�9~��f+�L������)�5����V��6m�C[;��E�����\{��q����\S�<	qX�6�������,K:�8���5bg����`l��^�X_i����!�M��~s~l��f_�2$�����[sna~2���@K%J�XY����hI�M+�~�����E�������A����+yQ�R�������]���|Qdf�aqe$y�TC�m"�.�x��;�����w��3�P�oV~�[ ��<�"����UK�F-����K�~�y�j�h����r"��1��+�~�������t�\��w?���@�Hw���
.�X��y�����2(�������.N����W����d�����
�
��x���q�$�fQ����E�����se�+����a��������$���<��l�	�}�^�W�YN���l�z�|��h��-���+��5�x5N�e$&�|[�>:���?
D:�6:j���������.��m49
�&�y+ih�m�����I�{��G��R�������`%�d|=�����^XPqu�)_�}< ^�aDY{,�v�
���eK����i��&��A��t��eQ��6�oNVcI���uo*!����5�g.G
2�Ir)�.3������� +GY��9����i�R8�/ygv>�)#�1"�%MC{����L
�V:�K���x�R(K�vKe�����2`�@�yBc�R���������E#��s�Or��6��*��F����c������GV5�)e
"�����2����@�T��Y{�����&n����,,~<��F�':x��E�-�QMM�iW4iC���Q���,G��p���S��F54w0|���|y7�hi��UVf���E�y�;z�"3��e�����e��9��.���!I�,"�EQJV������_x���9R%�8?���������<w5X�	\Q8/��t���=-@����e�;^|)���%�b�OREuP%�??���c���a�Pk�$����
)�B�>���y�9������X��'��"�c�����?P�.F�cu����������z�6x&l�����W[czq�����
���
�}�.=f�n��Xi)��W�c�O����|~��DP`^�!�������"4G>a�D����)��2a�=������s�3[�������h_
i���e{f��
�_���1��[e��z��;��22��v����bBE����O��W!Oh0�K=.��z3���8��Nk��]�����o/��3q�83��w�l���?-�����x��#��nkjUA�w(�D�����uH>?v����H������#��-����W�6������#�#e}��^�J������t%���������N��q���A`s��"���nP��Y}�ug.U�l�@�Cq���wO+H�$��he?��z���-	�������'���6�����9MW3��0������c���o��Dno�au"I#��g��u�����/nX-�����d�����.T#��6��gvu��\Fq'nRk�:?�q��@!�����K���
��
N�w�����7���9G"�U������ ���U���>��-A*f�?Nv�^�y/XsR����5����"�A�tff�������y�>K�L�bC�/#H?]�v���i3����E~������U�p::-d��
�4������
�m����DR�^��W
��)��	9� �Q�E������!��^CX�&��A��8������>������`d��q�x���}�*1 �� G[�t��PL\�0�>��&��)�����a��n��j���)U�����a�4�S��2��J��b��>���3����5�'�W���;���O ]������W�-n�������4�����;l��~c���W�6
��8����9h�������f����G�e�<�{[?����}L$j"�]X%���* .�)����d~��uX��z��������4�9��?7?k����`���N-B �����C��gphW2Q���oG�~{�{�B�}+�����f���������B Cw�55��P����/S}y{��E��z�`�\g^)swj��W�8��;���������<�
"DF35bX��[��n\F���;�5�O�K
�O*R:[���f�����i��t��#����=\B
	�����d���:��lJvmll<~���C�Y�Uoi������k�M�Y��C�)�5��4]�}JhR0���:�6TzU�V��Mb�����[��Tv&�l�^t�R���s���������@!K�b�7J��
�3?�i��b �$?�W%S*����og�_��4�N������gs9��P^���������s���y��{c1'��2��WVW>%�SJ�f���o�d=%E���~P���B�X,*��{�Z�?)8/x�T�\W���^��o7;�c�_x�Y\\\�a�x3������_F��?��K��T��p�:~Py7/�������"�����%h���V��0�A-���U��Jw��8O�& t�'Lq������z���<��V_
�A��X��]������o/�D��XZU��F��������%;��@K���		�#Wv)sH
(�#JP�EMG�uq�#'e��2h�=��! &H�la�������U4��.��z������!RGB#�(_=�B����\����	.`�Q3d�J�����������M����2�������Z���dd�/��!�M��X��?�����-jU����p���t��n����E�9�)�#��t�m�#�)�A���"�Vz	t�@'�*�d|�hg�q�����0:Y���U���`>����q����R�a�L����O�#�O$�]ysnm>FK��*,D�G�s��@��mK7>^�j�2�^�4���������P
���*��	RF��/���Z�
�p�����9��<=�~�bw����6
Y5�����������\�m��E�
��O��;�n�H[�ja��	GW��*�����{Cy�^����A'����h�b�k����D�(+#�'��^���z���X������f����M�'@
[���� ��C�VpD��s�"0�Y--�t�m�6z^�n;i�Wa6;��3���uz��&{�]/t=���?K����sQ���T#��7���~��V:J����o{������u)�o�p�t�x[P��W�
���Olh��	���C-R��S���.�~����.��;���B;OcKo�t��kV���0eM`d���NL��!2����={���'H������yv�����Yk�C�U~t���Ql_�������Aq�����u��hs�h{�atH^+ @�vT!X��������:��a-��]������V����������T�d�����
��V5��Y��:����5�CM�ea��:� �W�o��w�����������4��	�����Zyw������Akk8c���3d�k{���I�����=������>��6Cn�������������_��P����H
PeqB�\��=����[���t#��������}}�>X�o�Mr�?���y��k�&I7w��`���BC����pb)>G��a�3OX4;2���_����,MH�-�X�YK�)eum�������jh,6%�R����A�k��������������[�5C�]���\D�@������:�|OefH�R���PI���hv�?��88�{�q��������#
��^��=u�:�3�.s��Mk�v�?�C�����ef����v�U�Su�)o�Ta@1��;xc��Q��7pp2�
:J��2t9�u�T?�WUU=�����@O]8"���,�>��PK �tL+��������+H���i�������������a1�?�����C�k�$
��~O?�]��L���������Q![�y�����G�p��!��1�I"��	��7M������>"�vi^��V}�i���^���\�B�,8a�|�<M�i?�U���>�3�����sh�����~��C��m[v����X0xb�Z
��-�0 ��B���'�av��M����"�9������ ���/�0(w^��F��u��.+)����WP��&Y�f����b��)=�u���"6�����+Ig�Q��Z���h:y\���_�����q�L������<��V����t�zv���!p�����.x?����?�H��C�	B��2�Y?�������!!�`v <P�m�hu���1j��+�:]E'�x���c��3�����x�����a G��kL���~o��Yg�w�����X3��z?\#N��$
|2�k����<���B����aCC�@���jy�����Md
�o�$B�i�����qX�����E��J����:w��>�qK�&=^�8�E3�8/~��\�Zmq/f|�����H������~�(��V8�c[nW��F[R�a���w�
��!�u����y��8�n+�)^,[���/*�[z���%5�#�������?���=�JD\9���^�Z.�#�������^���L^����_N<@ (Nz8_������(.��w����0!��`6W>� �\����w4v;2�Yv�s�0h���4\2Q������nWD��N���Kr���^����?K�B����_{��"�TLx�H����cw����^s}~�x��T�	/��'��/Oe<������`�S|�
X��Q�r�by����~�r�<��W�ZH�Mj��`���i_AV������9p�	j�z��)��x��E�m��q+��=���-�����f�4��;����|4RM���$�����]K��mWm<��r�(�g���i����w��K���E0oF�__<��C�<���c�u������+���T���jkc������������z\H���U����w ��)�P~����>���w���O�Kc��"Wl������;$�5D�����=���O�z����P�����_Pw����X��X3fjJ�5OLLl���*b��� 3S�WL��q�J���^as����!���
�5�����^���:$:X<$��+�
Y�@c����n%�z�A���w1�b�Q=B?��u`�f��3V=�������c�3�y�bX��	
o��&%�G�'����2�	�(E�|'6B*��=��B��n�D3��������2&�����M)��s�abw~x|<%�3:f�[�7���}<������-H_��g0��\�����u41 u��s
�K�r����hO��2������G#1����&(�e��M3��k��*��G�	���z�x*�/|X�)��P����2S���d��2��6��J!s�y�<�Yb�����i�m���;��{�?�����s��������u�{�u��=��_>�r|!//%�?'&.AH�����s��eT����p�Y~�/�'��=��Mv�����!��2��+����$�=���D 3&��}�����1x���os��s�pe ~����w�l����E� .�t2�C����.�!N�����?�WD�C�y��b?6�(�	S"H��LV��v-�f%B�9�^.�I�j��k���O.�����{����_B�q�9���g�\O�P�6�9.���Z���vr�������
�!�������z��"���F3MP;+*�������[ZE?��v�K���w<<]��d���'�W^�z�Q�.L�����ps�E�h��sQS�v?�E`��-��f�x��9�	���)�
-h���h�V���kC���w�7�G
Cw�S�X�,��n��������FP2��Y��j�;c��Q� �iZA�o�Y��3o��v4�
'�B�4������3`���+������c���oX�gKV
�t}F=�no�\o�bN����$h�(�>v�6�iY���\�o��)��A�|PJ��O���)"5>��?�G(��=����j��	�X�'����.{":���0+(�}�v��	x+*W��}��zV33s�R�x���_]9����
#W���p�Et�h{�������V����S������e�$�
T�_SS�+[Gu$MW�4hz�@��:������u��"(Q���nl@�Tmh���k��bk�dRz�
qqq�}T���e��q������2.�r���$��Q��q[����m���~��[�����A�.��nm���q��w�.cb����	������5����#����7qw���������S�����v��bk���h�mb�(:��	����F��4���A!����j������V���LJ���{�l��"�Q�%��rb�����;1�%�A�PXi�cn�x�!�{A������hQ�����?��S�s��a�Z�QC=D\$D�o"�OY��!�/�,hJ�#��A�;�V�h�H�AX7�5t`�t�;kzO<���B���o���=V"�{�"�7`���s}�BvLcA,����3>��[W!��I]���%$b�L�Z7����r_�3�� �Y>���bO�^�o/���i:����w�����f��8�����'������
P������+x��4a�QN~������1�O���59A-��P�5��um�P��Ha��3����D(�������v<XB�r6��z�����6�p���)�Y�]��x�I�����%e�J��O�X5���L�>$�^~��}>}�T��Gx:�Z�wj��J7�3���B��`/2������9�o�t�����*���U�)gA���Yx�t����F��
N�x��5\P|��_�T^��my�"�o���[#y����0�U�Kv�_	w��iW�u�y�����E$�Ld�+�G�A���{p���
Z�O��,1��fcCNP��)3����{�X,W'>ef]��~�/`@�#�C���\�����yw����R_D��&��
�Uq������G��������������i�|�1�q�$���=����V��RJ}U"
4�L����By0@�;�'�(�l����$%����7/s*!J��U�Z��B�[Q1/��F�Az@w��<�}O���A��+WBhA�N�����`t��8�v�eUj[]��??�Qb���9Pdy����`�HP��2:�����;���s����W��������_���S���9$�������J�Ee�$_��E�g_aa��D���t�,B���5�U<T��$a���%���y�lS���%l�`��?���G'{�_J.�*�V����^0e}s(��1��p?���P������|���(*�EgU�T\F�%�������=w�D������p^������������.��0��h<)�P�te���E��SFF���*��
�o51 ��i���c7&�[��
�X�{����1������(*��R�#e������{^b�d?Rn<4����7���I��x$�i��g�{�;�������:�e�9��6b�e��u��E=���'�m��"J�v��J�IJ�X�W5�!�)J�����W�!1	������S~3�����W�5��5�V�	<�)����������� �U��." �W	8�����UG��.�m+1��1Ph�W��EZ�s�JI�o
@�4�
�	�AS�
0���@�?#r��ul��a���D�wO������Y���a����F�g t�����e���9����zww�?���(Y9��CK#�Q����A8��$<�������v�p����x��~��8!�
��6�lZ�`1��n�9���CN.��#���x<���X�|���g�7��V�_��yS?�����k��������5E�.�p\�vb���u`�Cm�{{{qm�G����B�s�������!)�j3h{��n�()�%������i	���z.WSMm�����v���7�n��A�7��@g���)%�SRF��l�j+�,��&�%<�l��hN�Q�#��������:{Ze'����14�W�S�'L��A"!!A+���<vTbg��5���2��<{��$Q�<9��{����64�������L���a��
�c������@��r}O��gO/%%5&���ib�*WU�U����}����=�3g�@J"��Iv��.`��_������ �&���HN�9�G>�"y��>�y�����'�v��y���+(Kk���)�Y��;��;�
4��y�xFen����T6��{���[I�����zyy���7����#�Q�(*`ddD��V��i��|f�e$|�<��jj�A���[��D0�z�FuJ=�������j�Y�lA���@2���K%������HI1��j�)�i����*���D= =:PG�mdeeSU��"�}��_������v
7Y���
�z:��Mc������ ��r:�`������mH�E4�u|B92��@f�-�/���/\�I�p�X��x@^:/>I�	��z"V�>�����x�d�|��`�H���m����U��C���=x��T����+P��\������Rv��"�=�� E��k(qM��+Ul�C]����wA�&H�9�Rv�E���#kf8D ���`v�=:aI�j�upT���Y��w�iK�=x���'C.$_��,nB�x:Z�
�!}� �%��n��i�_=�B���L�M���GZ_>u�)IX�N�G�f�d�	��o&"&&@m1����!o����/o��3-���c=ma�;J�u�N4�a���(h)nf�2��`Z0�`�l���PE�t�$3����l��L���4���jY5 O�������U`�Ht�O"���������o�z�����i�?�;p-$$F�P�F���eU���}ET���|�v6���n��f\"���/��������+�)��a:�r��r��1����bh�F��9	�i��Sb��0Fn6`P����#�p�;�d(3?%l�t
���9���U+'4Fn�j��,���h��?�Ah������^�����~{~y-.�ks��F��M��ww��G��4��h�*D�����m�����^t�g����l�����V~��A�����KQe&O�p���Y� �����X����)��5����c!������E	�X�!%|��'~�=BeI��i���:~���Q��x�D#�k�N+�������3j�����1�A-<�P-+������{���>l�K�j���:u~Xj&%:<6���1#��ox���,`��$��r`��s�kIH�����SSPx�8t�)�(�����d��2x$����G
B�Xg.�
j���O���X1��q��6������S�������{n5OR�k������6xi}���A����]���W�m�C��8�&N�3���O�O��>)u�y�����?�����d7}�����>v�n�5�w�	W����X\Y���~����L7���\���R^a��l��)��������	XSo�m�������^�[�~�L�y��
"yoUa���^�P6�)�w�q�w�����������?�JhB�7�V���	X
����%�51�;���� 0��C�.:y>F�������s�i��R,��",,�����*Z;4���5��[	�gO^�qx�%���
>��y%Ev�%����V����7x��y����(~�����������{'�cD0�`xr���G)��,�LL#�9�
/������v��~����n���aG	;4�%=�����Q������T��G'���Q��h��g���8����rg�mq%��ft���|���9|$~�@\e�������H���rP�GI��2���}�<���[D�[[Z��u(��E�;K+��Z3I��;rx��=��z����pB��x��G!{��/�C�����d�H�8���������`x��-�
0��7
���t�@g�������u��m�m�v��L�p���������X���oH���_fckzFU������gx�M\\�#�gG�?y�����-Bq��:m?��,�"��r*TR��`W��:#I��&���T5
o>�MLR�0�;CQN.|&�H�����xwS�O4"��p���B\��@PGj^#2 o����w���7l���
7+���2�L.��}��p6�����T���6�m�0S����=#y����1:�".�����o���������Y�G��$�nI��R�PC�x��d�-J<��OC(J��}�����w��=���z��u���0?/��Gn���f�;
BL��z�����z0���X��A��1��n)�XA(\.�����6x������X/��������D�fT�BV���C���gA	F�Qh@%:�r/p$B��;����0"�����8H�!����c���F�0������	����oq�����RO,����.|	C�"�����f���<�7��H�Z�!�����~���/�2��������nv.;���?9���`�o�|�.:�E��\���$T��������v�P�ak��TOu�������hz�#/
���%S�.s��~����n,�G�WfT<f�$���k"�$��p�g�Iwf���D�a����co
�g��S#V[#-�hJ��hRY�3�����
����v������	v������PT=�2�|���`0�F �c$�o�� 8#��o��N�5�	�U���766��>]�����.�W��0W�'���H7+���%|M���u_��=4�A�����
5�'��H��p^m�7:;m���L�+F�0������v�=����G������?/���I�����*�����m�l�|���
66�g��������!XS���$������`�z��P��a�}�������A���%qq����i�x�9Ku�2�U���~�������S��X ��k�����s�,�x�z��E�IGf\Z�:+wXl87:�����:����z���A@�ize��0iX���'����733�|@�`��J���Z�m���0k�
���Qx���O^�7�IB#b�
��D<z9����d�SiyOA0G9���4>CC�=��U���hg��=�?W��`-�����}��T,�W��D/P�*�\G�N_
��^ r7[�yo��U��S5��������N�.1�c1C^���M����w�~����`}����fs(�34�I����Wdoa����%�����.w~�iX|������]������?������&A5_B!|C�(�)M��W��g�;����M�6������l8*sl`�_�H�{�e���_�i�O-7:D,P��n�A{�b<��t��
��E'0/�T�x�M���*;���]���7?��(1��M@���4!���"�	��c�����m�������9�~O*e���p����"��Mqgko{a�k��������
�	�h*RTA�h�1W�NG��LO��%��>@eb�8�"� sr6N�@��>5JOTmNE��> ��"�����(jf]n�"t3���MPE�}��m�"�����4{������9�a��J��y2Z��>��ks�q��?�g�=_�����{�x��n���s�>p�|���'6������6��V���}g�}������WJvt��K��r���|�yt�Mc �R����M�9����2��`GP�	��
V���Q7-O�U�Cs$���?�������jYv�v����Pb<GTN�?�?���HF�y�}{N�S����K��V��(��w�tX�s���^q���&�A�r�����G�4w��]f����Y���o~�))!�-V*��i�=���W��=DI]]]j1W>]���Ee�������WUchV�s��8���BPj*�l����qo�����[�L��&��8MB\���q���!t���(��g�����-�;�I�"N���^����2����6=�]�V������nY\��}�����/�~'��f���������M;P���q�=����|NL���c�c�WQBB����nA
���#!n>�y��#S3�a���$�4��1	q����B��O��0�	�E��6�Jr�e�����M;��?���]u�y`5]��Q�n���(�`����8�/�+)��\�dH&�V���s�D���U4�"G~���1�X�1kkkT��-p/��!r]4�Jb'�o��`�(�w��V�� ?���<�*������m�������N���$����S��F��3�iO�����,z����Z���Z��I�9��.gO�o\:KA���g�#��Q�����>��=~]3T�v���x>�k=
{|��5�L��
�|�*P����cYS�Tl���=~�xn�E�������7���-�)�w>FF'|x�����|aOG�D����|��zWK���wx	�-�p}��-��
Fy����~��Ag������'#�2�,�:p���������&���M���0xn$<cQ������q6G,	�S�������7�'����u����j�����!���=���S�����@����rQ��_N�����+���F�GX��\��;1pwE������C����A��n�F�������������V����*��otr}��������Abh���4�dp�Z���H;������5
��c��Ecn���Xmw:����|\��1'�_J�����Gl5?R�C�z�NU��u���fY����8�@��<��#0����`Eh��Eo�|�J��������p�p�:���2�)(�K W*���v��P���c�[-��D�kh��&�����%�,U&���a�h;���r[�D'�J����[?����	k�v�,+Vt���m��L�
���C�DE�h�"f�%���R�?4iuJ������ly9I�#�3%j��~�c�=f���9<���P�@��p?b0��!���{�F�h��g���^`��A��NY�!�Y�C��xr�����qT�5���jfK�=��:oNF�SE��Fp
��K���W�:�+_��O����+����ol|��8�F����;��6�O�8��M��l�}�#�<O�	2�<yc����1������ z1Tv8�w}J�V�s�0l����L����L�t��P�_��]�[��:}��%��v�NfN���4���Z��!_���"B��X
�k���<�����3�5n����Z�RjS���1�j0�0��J7Lr�^���S�������P�FJ(�|<R��J���s���kY}'�q����P���ng�	/7���i���)�hh��N����M�{��g������9<��Y�_2<���DJd�a+�bR���y�����P�e&N6#�-��5�QqO��R�x)�;�*a<i�H�.B����BIAE<0�ko�s9T~Ek����k��~�21aC��!Q��M7#����oDq[��#x�R�u�fFe���]��7)��������	T'K���j�[T�myh��Db��1��	������~�����S�Ko%�~O`ai&O����5f�>����`~xBC������xm�������=w�1_	i��C���"8J��(eY5�_h�4���X�P_�o:�m�{NT'z^����5�+��7,�[�~��-��vz!.V/�k~Sl	5��S_��i|w�;N��H���z�����KLLu���y����f	����{n����U�Ns���%����S���+r�m7O����:��������>Kz��Ig�ItBX�ZH�V���I~�t)B�����t���3U��+G�,�^�B�7o���!���������;��ys�hi��r�E�����n[�C����]�����XqT�
_�H,��j��s��[�{�<f��fg���?�0|�x�*Hp����8��c��_6��~J�]*���R&������������Pb``@W6��w;����p�2��b��	'7���k��O�����!"$����Y�NP�� |���p���T����V�;�o����@)��}�-+^�,�#R��'�m�L�%�ndt���5�_��o���� ���5X>��v9���6%I#:Xy�!TN���h��W�F���~�~��Ly�D��xw��A�s��k�����`���.���C��&��6�����+`��N;����U�;��A�i4�	�/��|"X����E�_��0���I���{��]������2�7����U1�N���9�{5��8#��WD8Z^&�:�C�l�9t��.����2�����L�3��3������p����/_AUv(0022N�=s:U�0�G��G�-����P4�����r����9�m�}4-��||F%�7O�� �J`b��
�A���6����s#���bwww�����VZu�9��j$����r���=�����S;6���(��D��������!A���
*��.::z���dfaA����Q��o�2#b��&�#�-dW�����r�g?{�eG�������L�lp��z{���{��R�.����?�"��F|�?"���H��"5��W��T�_A,������V�PC�"�Ep�������	���?����:3��v��h�;!�]�E��!w�/v�����}���M��FYp�r���hRIV�d\I��Z�����J���(p�+W�6'�����������+����!������c����2s�kO9�����������(Mn�X�c�Q���'��:_hGJ�J�'%���+�l��J�����H�9P/d��A� �b&�����s����Q������U��Cb�t�@B�\_>��h��x����m}����%��M��}���b�3������������k��;Yrh�^j��+t�iA����>�9��-����f����0C����yl;��&�<
���D���n���"����n<�E��e�E����*P�y���O$�����o�Gs��eM��-���C��=�Lq�c��H���=��U�++�b��`^h.�iD:��~���B�q�/�.E�
�W��xO��&9��D����~�'[G�.�5���`{\���&�'��DGq��<�]�AX�>O,,~"�EEi4A�ko^��8P5v�|8���HLP��L��<'�l��1P�HN�|�����]14���g���W���������<z������?�'��K��'q�NO6vc�j#�&�\p�=�?������)���j��r?���AOIF%�r�dEYY�R��?���
q'k��]W��1��Uq��wN�����}�|����Ry/d��;�.�����s'(O�&�v���W,��On?�^�}����I�j��r��&
�c�9���O	�}1����|,!8A�������}*j��C�Gq/������O��y��X��$�0�[VCp��I
�$��
��_1��*sd�J���)Z0�W��nZ���X\�}J�M�t�g
RL/��[22s�rt:d9Xb� �w���x�c����%�����^���U������{�@�=�V�w�_���\��@�BQ�4q��c{=�4���K��L�c�ah7��c9�b�������������>�P��Z�%��c.���pY�$6��:Yy8K'�:Nw�-r��r[�G3%%���m���o�T8���%[��
M�?�o!�������vd���c��TNz���h��9�x1���J���������}�.UuQ�O�er`�����y�jc6���@�-Uz[	666����
��b)���M�����x��~zW~��J����tJ���:�Y����]�����6F��Kl�>{���l��bM�l�^M��L��j3Zc�;58J�:a��cp;�l���~��pt�Z�A���[k���U�����"��x���`dI�D����KH���,�.o�^{�,���Y��/��p3,]�O�b��,_���9������/*EIF�?��7��F}iD��q<J~���������k�S�_��0�5���$;L�$n��w]���B�LV��6�&sf�����5>�H����(�M��WEUO�����O�	���H�F��z8^A���y3/����} .f�����T����XF��9���� nt����)�N�f��{�Io��wwS(����l����M4��������,������&��E.�
����G��b���Olk2�=������>o%l��#O��WU���w2�c� ��a�^�T�&���>��Fm�x���h�J������
WUzn�[��~'E16����8���l�[��>�������)^����|����m�?W�G��%Lh�s��!����)pJF���������`�c�H��~r���";���0)2&k7G���)�����s�����R�����!�8^�Q��!(a1ul���-P�] �^�d0Hx���?�����KQ�S�V%��$�����Z��SNK��g���]��H�{���(K�;l{us{\�����Wea!-�����,W*H���w�e:�Nb��)����m��o
-nf��������S^�L���U��&����!�d�\H�#���x���$�|�����<zU�-\���X��ebH��c��7����I��;����u[#�� ���tge����7���.���z�����O/�	8����&A&A���G��I����;v�^��s�w����������<�.O
6A�}�g��f���L^#�=E��O�F�e��=�R�
f�}���]IC0?�z���[��
e��??`��h������T:_�{�E��`�eEg��P�]�jr�L��l���s3}T0�����
�.D�+���bU�I��cZ�+i�MY���)����_�U��>W�*����1a����si�k3I�[9��-�Aj��^��G3�]���>U�rw	���%�0���|����M��3+uu�7\Ca���9H�k>=O1p��60Gh�
F�k����[�-���n�V��&����]��e�qM1m���-\�1S��W�"DcN�k�$������c��)I������uQ����z��YI��k5�Z������kW>f�?	����
t�����F&+S�q���;H�*>����#�&6��zwg�
���������sTT)��]��0���1C.�����
�|?���	~,2S���=��>Lx�,^[�6�2t�b(�T��T��kvW�U1��v��_���7���hmP�������[h=��M\����|������#e�5k2�"0�A�M��������@s_nHt�>���79U�]�A��b�t����X0���e�Vq���mk[c�\��������.\i����/�+m"J��������W�,��~�E�gx��]�?��{��g:��g~�Qt�����n|�3h*�z�U`��tm�V�[+���i��U�q�qQ {���zNl��S����c����p��@D���j���1%*'��Z%}�K��5�B��Y=[�<
zB�c����_D6Pl��V`��XGmW]�n�z���Y��}�dP���B"7ovg9yt*$i��F�y����03S��L����M�5�mYp�H1?#��7
���j)�Re1N�>��rU�qaH�q�����yl��.p�?Q��K�������?��������y�o�K�g.���i7v'��G�1`a������;�56F���
�Z��&��N)�����a:�o�e���>���Q�j��(A��ccc|�6�\�#��q�Ul�����y���������w�g@�Y�NR:�����z/�<?p���#U�{G��b��OA�"���'es���P��"�����TAOZ�F^�>j(y�U�WY`�I��{�X1��=X�44��~m�$��������>������B���A���:Yr��cc��|H�B����C?��C�i����B��)Vm�	���0Q\�<��`
�O�B��g����oQ�@|���I�l���c����+=��]=[�uV�[k��2@x���8c��l��U�{�,��m�H8[�8-�T�2����G���Q�F����*NB#6�3��"o����'�u�O{"���sq���G0]%�3"�?�\Q4s$j������o�=.�K�i5��UjW����c���u�������',�m��[<�����*���f�a_��-��{L��q�Q��o�3;��;����������>����~��o���-|�?�X)��C���a�������>I����*��$�-'�����"_�s3s��-����JGE8���
�	��EV�]�F^I��{ �r��kQ�����d�lR�.��/�+x����(p��8���
�z�� ���Zt���;l�;�"��x�/��x<�F���R<k��+]��qVm�/��s��?���������6��|A�wt\����?���c|G�I��kg'�����Z8��{t�������d��B������w���u�!������I�qr*���=��'��g3r��H]�pN�t�����mc�0��g�Oa#�P��k�$(�=����|l]�����uE���;��+\�����1x�x;��*��~������g���e�)^����t�d�8f6X���JH�s�8��=��p��n!H��Va��?i�N�V8���DT��J1na~�j���S�4&�f�8����-F(.�.��'Z�1)OlO�R���UD��s��U5��w1M�YL�Z�����\�a�J6�v��-O���A����A��U�����]t��1��f��W�.���k�N�,����:}2aey{��g?�^��!�y�#���r�<�����=��W��5��rj�Q`o��wW��sH�M;-��I��n�\Y3}��X7%t���

yW-4S���[���7#�b�H�bJ����\��k��=%��R)����x	r	7+�V�X���\��8���J7��=r~��*�������,H������O$i�u�t��@�A�����M��;�B��<�X���@'-��m��2��CWX�{g>�s*��V.����]g��uB��o����j�(o�I0P]�C�PB�j-o�jv�Em�����]2W��9@�?����q��U
22�lz4���CJ_C��|���V����d��"  |wx��u����wXJzo�@p�m�-�d*
�GH)Kh������b�����Y=�T	�<<0��Z�cU�5�5j|eW����?_d��fj<������7��������C�R�\����5��.�T��*s�\~��a�42���<a���qq��n���S�PS��uM�i=4����� c���Gi�k��>�fPn	c�@Hmq�P� ��F���n?��(s�X�j����v�����F���D�4���D?PN�kx�e�|O��	���<�����f&�]%�=D���,-s�v�x]uo(�P�������]
����6������-t]��W�F����I�����)[���x1i���[��J��kfD1���O�>]f�'|_O�cog�q�u@�������V�������T,�]�cs�!���#�{�5�KT�������Y#�
4�Hn�u{Y�������j���Y��&�R%�8%���Ktb�*��+)L���+m�n�k�,:_�� ���H�v�����;�Y�����4_��[��y����7��WZUa#�[���������M ����Z��a�w��|y�D������|�YQKJ�����0;����+/G��������������K�u�x@���C�I����[��&����=���25xd�a���]W����	=92[�B&P�P�����������{��j{���q�`L:���0mNM�b~U#u��l�yO�W����,���wLA��%���������ok��Z���
f��S+"Q��=	�Yc �kO��{�u��=�U���#��J���g��"��S����~Ib��0�~�~�����e�e���������}��"��|� $�2���g�
�X-S#�����gi�o1NF�!�mq���Z�)C�e����{biV&�A��{���[��E��+��=�_�|�2=�����W�H��7���wO��ejV�\5��!iE�4�n6�3�l�(������`�������Z�����6�|	{s/��r>�}�g�*�{������ kE�g���Lz�*_Ul��?7�$�S
~�X���4V���j�2m5&��d�%i|#_�����]��������g�O��!��Z������p�5 ��eQ�q(f?%_�8/�3>x�Z!����32��2~���F��>��]I�[�7��O\��k*��(�K������;P�oP�TQ:t*������o�;5�/����6��g��	t��H^c_y���(�>�Z�7�5��of4�*��5S�,�S�}TyYR��Sd��"����<<�
_�G�Q)��-�ga�4h�������9�>.0	N�"~����eq�1?��S�~���
�<w����g����������#m�y����>������sbHy���h��8����_@�D�5lO9�����Uf��
�`Jw��N�H�������$To��B���A�?��W�F��9��X~~�!��L��o��k���*]�'nzF��gj���������t�������Yodn^9��+�_��h�)cl��?v����S�M��Ps��y��)-
�1wc�����N<O�r��KH���M�K��Fi#�"+��r�yQ��kOA�Qd�-�o9�sF�#VH����)���IDWP�V�0��k���?�?��pX�9�����'&�	��b<<*VQ���v�c�iA����G�/���r<w�:����}�]K.��u������g��I�����&0!OG��&{�[��K�����4�\�X��K]/v�PB�_�����E�������d���G�+X	$�P���Qj+���� !���������y�P�;K�3�-Ad���t���!�l�P�����7L�]�����&�bt:�%R�*���R�i������4�8�$�J�qC�H�FVNQ4������T�sj�h�����,R&~�t��7�y���"���|�~N^�q�?��&-�*A���F��T���#�z������:��Ck5!���;y�3�7p1o����������3��a��4�)gG�b
i!���k�6!-����jKFr�0�#�y��!��+���g������@3(�>���2�n�;�s6�:���?V������	tD������~�9ZHnz��?�/���6���,x��]�7��M�9;�4�<�@J��IcUr� #�.���Fn
�6��{^w�M^���	�c���O����R�W�J��a.o��T�J�E�|<0� ������x���#����.mC8����*��'��[�G����x��U�f4;4��:�?��C
8�-V^w����G�B)���u��]]����p���m�9��g�4�e�����A{� B����:���Z0��9�����M�*f�n>�~����S�����hm�V������h�2Y��a���k�B�Q��y���������ux��j��~�]���u���0�Sb�\�+S�����x�tQ)�T�2d�>h�3p����?��R%]�Ig}�h|�2��`���T��;j-���u��[U�u��usj�\��Hyj��N:{'��Ze!���l��V��[7�����~]��Ms����	��������JX�R{-MV��V�&���3}m
��u���}�}�
j�!�'V6
�lB����n�z���S����h��z����q�w.�0�:���^:�GS�l����jJ�bf �`�O
^�^P���<�u� ���V^i����/�bK�0J�e��L!��6C���PHD�����zIP,���h�6����B��!Z�E
�w<����C���5<����>��fa��k�+�hg��49`]}����M�t��))���{���@Z\�K
������@�����w	�$�f����w	*b��3���G�`����oZ��*<��F??1.��@,���xmn��"6�h�G�If
{t;C����K���i�8ZW8�v+��0��L>N����
e�+����:��� �������F��.u�B�*%�H����LA���Q�L��{u���1K��q,�_�j�]�m����e� n'��8Ot���VI�������z�$�j�@���Bj�|��~���+�Q>���������l��kd9��r�Y3&8bxA��A�{��������	��!t�U:]����EfU�y���1w�P
����<2�"�����#t�o�)I��@������]d�f�	�|S/��a[jLl��(J�t�u��o�^+x,F�����)��*|�h��W����L��Avei�-<�=La�����{%�y������a�6����������mjZ��=$��fg�Se������8��<S%�bI���fnh��v��a��>�1<T�?	�]�^@�D����	�k�������R����������A�������xOe�<SE�W�J�ra�@����ym�J%|�15)%�/��?,B��1�E����X+�@�k������&&���q��;icz�e�Y��w=���(�����'�23���F�9f'"�U���MV<��z#$U��N�S;Q:@x�lI\��YA�X�I������(�[U#;D�eJJ�����\�K�O��d��(%vW;_�q�v$��{r������V����C^������F,t�Z�
i4����e�f�������F���:FF�~�#(|�o�G�\��d�^:�>F���q���_]�&�Fy�C�v=�Sn
�N:($��J�S���tv`���M�6�N
�B�+Q�Rv���SW�x��K���#1-��m�����JH&�s���.���ZU�}Ng���0^�2;��}e��'X<�V��,�&��+�T���m���N!����*��=���6Z���J�tcl��J���_�-�U����N�Q�@%qh�o!����<-��(�5Tn��#��5����$w����4�.g((������P���2�^����mA��X �|�,�Eh.��n���1(I��_)����b|,N����tW5��u�vg��x0��YsIII
"�D�IG����D�z��X�����g"��9���n!�@�x,��I������r���cC-?@3�	����wxZd����C�r+��m�RM���0��C���z��v%,b�f������#au��y��I��7�Ft��S���)"�$W'��.�B�$~�����+��d=.�	D���&�-zQ?�����9��V'T���5�C�����q����5|G2�}?X�+;�$��z��a�0-A�G����Sd�W�4cl\9&�!�!��zW
��D)�5Sl��>�q4�M���xg7]5CtX���M���0�q���Rt(�������%e�k�����:f�2��$��s��b���
?r��Y����bc����E����g���v���Q��S��(L�S-�3�\�7���)�p�
m����f�}���LB��������[B�����T��r��Ftd��U�|�;�b�A�����:iO��No��n0B��
Mrv��L��Tz*��F�5��p[�]��wd9_�T����j}�'W7w����k}O����f��G81{��mb�,�ea
����:u���g�����uK�L��|t������;42�F�Z������eN��K9Tx#,�:,@�+Yxy��l���a�?�B��}@LLS�,J���*:F�;W�UwV�F�.��3�3��3������
���!!�^�+_��!j�Y�>���Ld���sC`~��W�*��q�q��������x i�	��.;G��?��8I���K�R^+ws,J7N���!t$�O�����;(��k�4����D��$C�(YA	MEr��d"A�FDhI�s�
P�	"D�F�JP<k�3:���W_�=�������i�_�{��Yi�M��-���Ll[S���	p)`��%���6Yza4�c�������:��!*��������~k�xq���%9'�%��"����4�k�Sw
��uppH���+l}+��"8���70����x���o��c��4���������5����B&�:�?��$i�03����� ��Ys1�U��J:�+�#�j{��	�%
w6�L�`J�<�e�m9;�����I��v���
v����p��GV|���G	�3��4��)�E@b��N����9i�q�l<-���M}�Kl�J��Ns���i�0@,��(�����?��nTF,�Z�
���������F	��oc=��y�
9���F^�Y��D����6�<�$�������?�e��=��6n�~|�+�t�=QJ��
w����t��7��*�r�,��2��nKE��r�������Xi ������4�@�x�{�]dW�o5��aZ��a����|���9g�Qj��9�v�qY�����lNE7ve�.X5:�������1*�=���{w��!-���--�}/��s�.��	N����5�$� ky4�����*]��+����_>n�C&k�F?��*5�+in�D������T�5�i�[�zy-�-@:�1&	vc��6�������7���A���i'y��j�d�F�@smJ-NT�d�@������v�O?��^�O�D|"�4���HX�b�	4}�nI��(�U�[������
��1��F$�34rs,�L���G�M��h��
�*E���Tn��L�3z��}*	V�4��#"Z��UFNx]��������|�����r���/���>�.��-�pM��=h�a��z�z7p����k=�nV�`��c4��A�F�`L�����DO������*��x
O:�GKX����N�9��?	�N�����d)�t?�����S���@(�,�vJ{DGl�b:+v
��f�*+X<e���{�e�7���5_�jv���;�N�]�����+	����dgX�ZaS2����ub�#7c��*�f
=�,�\�����2�_=W\y�	��l�')@���L�\G;��H�V������}yt�*g[���8'�w>a~z��a:tQ�_,��&5�7��j�:��vxb�*>w��A�R'��3�������z�xo 7�����t`e��a;���I�C�2�b���3��o��^@��O.,[�L#�l|!g����?�G��7%������u�'�6�t�8������{����cz�����TJ���m�Y%4��R���{��!FR���a���i�s���jWQ#��S����������z_&A�O��q��n�s����:��t����ek*=g�R��Si��x��oo]�F4�jVu��M���KQ9���Z���t{����d,�������'?F$�s�R{o��xx44�C�
��CM�����I����(���2y���C���6&���O�y������� �Z�g���A^f�
���0�D0�8@W�q�Z�_� ���Qi��,:6��r&~��$�����K>���l��z3G�M/����_��.�b�[�q�Fn+�����k(>�J`>^�S����W���N�jK�j+w;�=� �i�cFJ�h�n��uy,7P����B��H��w�k�n����< !�j]���<x*�J���V)s,]j��I��������,�����d�t����2������
����x�w��_�T������x����	W_e�!Q_x�� 8R����J�*�MG�����P���a@
8�PO�z�r���`�]t�H_�&��s�J�o���J���>��yw�V��nK�x� #�:���GN�y�WR��k���S��nN�RNcE��R���
��#at�C�o�i {�DC��9s��1]���A����v���k9?P����~��m"�c)���yd;F(�z%�����|���I�e���W���rL��	���:I�����/�B���}qS���p�������N���W��%o�Ge,����O%���������8����������	
���eu���P�?���K�����/��0�X*���=�������T�����*�q�r�u�����R�T�d�~w�d��Y��&��!(4�T��o����K����2"
Ewb�����������-�);����.
w�'cj^�j�WQ����Q�f���L0m�#����}}��f���}�z���������9&�\�+^T�+6�"���ZG�kI^�POO��s{n����2�����G3�_{}y�����������xe����C�E�a���nd�����Qx�����)B���~��\<E���Se���	0�-����+>
��zq^e�Fm��iK*f�+�j�����+���?c�f�k�������?�jej:F��]E����$�i���G;+����Y�������~<W����=m��C�]�H�����M�@�6�bL����.��c�s�H_���S~�C2�U�6���2�+����%a6aA��[+be8��W����g?r5����(,�q;y� ��XT(V�{
�ggvW�gkty�bt����j^���f��L�
#��V;������{��������	C�X�D��t��F��):�6,l����2��#A1���q$XH���z~7�m}���J-X����������T��Q��f�ZY}|��h�BP	�L3��;�B�w�4�/K��4JNH�>d����
_��Ks���g&O��S�Wn����=����v�%�r����g{V�H�������y�^{(�Wc�X��B���FF�-��R<��U��;q��UC�s��������M3���
z�<=
�JX�vR���+% ,�AW��r�J_m���M�n�R�Z �	.�C����h��P��4��pI������S����	��)���J���o��sy�t�l~?�>�����^�I��m��em0q��8����W�R�M���3�L�3���
����ye����M���@�6��������2���Z�K{�,����<�HH������~���l2�[JW(Y��^]���F����
2���$����������=��?Ed�{��g�� �����������O�0y�������Bf����d�n�=M|������bh���++E��K{�L��������]�����??z���Q���a��M� �B]]� �v�u�se��t?j$�������w�]/j�=�����1��[�0��g����:�w�XKt�\�Av�g�[Llf�{������tf��F�q���y�8L��+66�6h�r�b��!.~1���~�*�����m����ea����Ni��cE���z� k�nn�y���6�u�T���l�������#�[�������	�{2��XU
�~
k�Vo��,f�
@Dm������C�-S�c��i��x~,�=��4H,{�m�����}BVA`JE��w���~c>�It�*G��l��sU�;m�pe��KtK[U��������y�3�{�\�$���F���0I��!����,O����SN���x�l�j��!�D�����XLv��X�2�W�o���w�k�x=p��z_�dr��iM���(���BZB{O��jg���:�>0;
H|j��m�`��R�����QL�m%|����)����Be�U���g� �A+8����t����V��v5��L�~�.�x]�nu�����X�'�������(qq�����2 ,�������h�����&�-}���,+�&WE�s��'���]�=<r '�MN�F���$��(ikiq��W��{w��yq���q$��3o���s��"��t�����L��i�:��c�u��Yni-�l����[B�����'\�0^�a��)����#���-&���m�����yW�m`�o�'|xy����|���<s����HXB��0&�?4tz�9�}�T�
�"{������d@#3�@�g:����;6YU��6���wj*�fafl\���G��y��#�1s��Y��(!�%���E+
�T�#������_���{�J8��'1$���y�W�p=�V)���d�������	J}�C�X\���O*wR#W�YA��z��vs��L�R�6*�tF����M��>Z�����5U;;�v�!!����y/ZJ���	�����M�����y�Z4�j(�}��'(�J����:k<���v!�����^^��
}
h��c�@#<<�*�*������;l����K)��l�gsin7��� =u���k)�����.�yj�$����~�~�Tv��]����a�N���i���s�����n�=����I_�O�����D����J{��=�����O��7WSSz������6���
W��������+~V1�]&Z�<�KBk��nDM�8^1�����i"�������Ep�*e@Q���
��)>S�U�F�� ��5��Z�"���������l�
����c0�6��'}���������6�Z������
 ��#�h��,@��\WW��n��D��t�X`m�����K��^qXS���M�g��L��Z����5��Y���SG�����	<��f���o�N�g�X4����Hog4F6I�q��8&0���@��5__q�3�G��_c��X��5,)������I���`T~m��w��'��r%�m���{BX���������`�F��|����;��=��=�������s����
�3�;_������$��pDX�_���A!���N���'���V��m���R���5t]��D��7<������	��X�Y�>�v�����@��n�M9u ��x���N@��]5��i�\��������N���mJ9��{�&q��V�U�)F�������X�-�W����4���Xa�p�����D��r6g��EQ�����/|����� �g���t����^���{^�Mm�W� ��Z�R� �v=b����5x5X��s��D�8�Y�J/�t{zg�����>0��������'V�}��6��D���d�6�t��=���2��,����Ik}�`X� �~�(!fye.�6HY<��f�o*^{��tc����e8�
!q(���/X���P"��s���&�]�*����S������G���A��e.��2�1�9�E��e�@K�\P����@A��+c�Z}�OZ���������Y��>��N��+�.vLk�������/�����I��(j��0
��td��K���=X�������p�ip�z����'��k�7h��w;�F����?���J�vO��c��n���G@�4��Z�1���b�s
�n���_��i��M�(���)\��+����.�����/�`�t�h�Es����Q@X}�P}�T�o�[�+���W�^�W����d�{A���U7f�H���#����z��>U3U���L7uO�G�~i�~k��v�TlT��,%�R�c���G���SO+�X��`�m1v��N*��6DV�py[�V�3u.5����~dZ����,B#R]��K)�;�*x�R��$��pNz�L=-n�������y&��T3[z{��=�?|�[�S[��U/�{�P�-n�s�6����g�'Aw9fb��(2]��/|�x��Q���
�x�s�R_�M��*$'�q4��2����
�W�/��V��|��L��'�v���������h=m��S��|�9���[5�v����`�e}�-���L�-q��+�h������S�j��A���%%blk����a��q���������rYR#��L�������������3�;�o�#
x��&����V+Fi
�bb�-�;�'�Ks���El:^��w���Y����'O��i���0�E4(44TGxcm��7�?nS}t��_�����u���_< Q�����(���_!����}��4]R<.V�}q!���	��F�5���Ev�����6�
Vs����V�)�a���v�x 4n����888f<�-U$b�+^��Q&�����]w�^��Iw����j�)R_?��s��Q|
�T��Y�`0j{+���1�xB,[����`�q����C<��R��l-�
�,j��|�XT<Ok��M�=����v5����x��Q�o���m�g�"������Ux5�xL�����j����=��	j�XO����o�f����1����K����#]����������E�)������$��x����a%l���-����E6�8���Cw�9m`����S+~)�������xFn�!��b<&����������4M�'W���gnb�k(����L&k���jJ2�9=���
�"Ep!f/n�)�����3���:����TA��L���*�yx��w�\�z�?��
q`��'�4
@�R\�nZ9�9�8����d�
&��8��WN�6���M�Z��g�2�������;����d�_������w�M{r<f:r�/�$)�-��c�	c�aR`C��z"�?��S��Ag0�h�,`X��c��"�I��>����t[���=��
���Ui�E�a�)B���r{��6x��b_�p�����#�;��>N��W���.b��g��1*�N�����p.�U��wn�����T��d[���������g��
����m�����
�,w��q�&-D����N�F�.��g�S��/������5F��5�m9����tQ�.�����e����@ X��`.��U�-�wCO��K�����QcY��;B]E�������^7,��N��M���8B��F�Z��nadL������o��f�i��[���}P6<�O��]�8z�����n��}`��;-�d��c�����<+p��3$�_���\e��
������W���a/��y����b�F��s��+@s��N
X7�2I��@+��U��||���z'�N���i*�2f��~_����Hx��y����y�#$*=��:������"2|&*g�������[�v�G6H��z�HU�����&N@�+���Sd���_���Y�vN��������qi�Ep�3_�h�n��w1U
�|x��`��x}��|5���;a!���$����>����C�q�	|~�%=��B�Y���M�Rg��}��L�=�/Lu��/����9-�^���hQ-��;r$��,[sD'3��U�����J���b
�����S��������mB�
�*Uh�y���c57x�������W`�z��;���s�`&+,e=��F�9p���_�-H�c��JY��^Q�����o]����m�)r�O�5&:�����.Zi��>��
���~��ZgW�V���Vy����
�>���h��A����A.-j��'�'2=�&C0��l�3�W�(�u�+O}�RY�N�Y���w��xZi,�����4��T?��GEb��/�8��g������8������O��ugz�g_f:"��wK\F�&KT��-�?6E~Z�GN��y���$'$���U��)��4p���&�e���5	���\��:�����SM��n�7�*t
�"���Rf���/0������\��������9�>w#Pc���y���%�Y���4���\�
x
A��]����lC8�����R�s���:#v]i0��K�{=lGF_2yi������Y������j���1[m�������#o�>'��U���E�b������p/<�b����e��%�u3�x���w�F��)`l����s4��q�W�B����o��Yfl�����~�������m���Z�d^\�pe
�T��5�x+�bo+�KO�"
@|�����������*c	�*I!��;M��vSK���cZ�[��A���J��97R��"�������x
�m!�������Nx�T06=���KWZ�����\�-������� }T����hx�����_?	�������Wx}����JGk�3�:;�^��,`x�|b���S@���_f���x�������4f>�h��ED)���O�=\08����_i7���;�qLv����cd�.P�#�6w|��60���=X�������/\��y�>p7]�*i�'N��h��}k,��<�]G��:��������[
O�=�g��*OS�;=���B��~CB��M�����'6bJP2����]b^r�i�����5��
���	��u��N1�	�3ws`���nn����H@���|�U�1)��&u��������~,I���`n~�&NPoKE&�%Q�`���w6�����b>`�������� e�=L�,���\��������]~�}[�h]W4�tn�h���q�
�h�n48�FF�)��
��YM�q��rd��H2u��'(#5��_le���=��f�Eu�
�������LZ��2�;���"�d�q��{�k�P���Q��|#F�Is��FF1�J��K���Jo~<����������(���%ocm�n"���|Ax��)��6��C_���Eo$-\4��Tz6���2��E�'Q�vvkl�-]��~bv��|��aq*0�y��b��38il������o�>@�!�hP~�����f��&���~�!��������3�oT�g��$�������W#�{s.@z��t0�����������p^��DLWv�����OiN��a�������F���9�"��������������[����#@nLR����*l�t�*5��F��Yl����=�@�hO��Cq�V>�|���M�Z������9K����|�o���|��?f���1��x��{��m����K5Ug�e$�\j�yh����
����*T��L�`������,������s�7��`����\0
��:���,/�'H������!X�'�v���\�n�A�g8`Zq���	@I�3��m�w�r��������u���3�.7�[|�E�>�1��7�������-�.��NT��;��"��b��8Um+v��h�LF��h�c�^@m�}V�y�`�<�;.�!l+������ �a��a���������7��]���x�jV2�^D�!`�pn�-��Lw;��,E�8W���A���3�5S������-k��`�Eo���Wl��Ycc����j�+��T:�i��}���
y��Dl�����s��Z����}��������Q����?�24`cx�6sO oB�Q����mW�u����G�����a6S��>{���{j�q��{:�RRf�Q�Z�K���eg�),�>�+}w�Z�����:���|���r���\��F��`7�O�]����@������!�������o�	�\������aR�fh��q��2�h�}\w;3���I4�Ze��5��2�����Dy�K����:;���?n���#�0�����5�?��R;�a�pf����T,�Ev��e�Kk�����XP�u�������;sA����9��YU�����u����9�}�H�ll{��_��4�V��IH���G��\A��zy�����j�Vn=��r*@�@n-�-l;]{�	'=�7C�r/.(9���W�![��W����=E9�w���]	@���7�`?ru��:	3�C��6mlEUj�5�����)q���@�rT��
Q�����e���
��b�q(����l�1b����<��L��~b�C�&�^z�������� ���e8_����cs�l�g6��z��{�\���b�#�a�F���@<�E������O�O����i�E\�;cj�Op�p�m��g�ktO����Jy���l�+���$.%����>�����VD����OG_qG�j9��=Uv00,�;����r��4�}WM���)�yXi��u O����:���G��2�^��$��^�����Q�u4��?���4�Z�(q���Mg�t�k�pX`�������� ~�yB�7�f��5u����j�;a)M��{���l����a�3

����9��������y�����l;&i�H0�����m�{O�_�i�`+Y���pd�H�S-RXh<����D�\��du{ry+���T������'�dQ/q68��s���z��Aj,^����4��{��}�M_���u��<N���0(9���9�y�4�f�es�/���/��-�����=��v������|����O�S����<28	�����7q��k�:1l�^{(�O�Th��k
��{������$��c6<ot��;�#��������I�E����{w�>"V��*H�r��-|f��Rc�7��[��y0��;�L�������f�x��o�����C�m�!��`�>Yb�9�����6�d��#`���ow���5+��Y�9��1=�J/��k��mWb���s
�T��"�Nu����m�iT{�u�b�l�I��]����B�9;�5w�wa����l��0�;�/;eK[mf�
SdWb��O�6��.�U~��`hd}W$H_��-��������J�c����b6_�
�/�������a��x�B�K����i�
�5+�������`u����!��;�\�^��D��qVQ�Hv5��Ag�����P�fRWMM�
�?����;A!�=�/�Zl���k�^���b�>��]�[���s7���U*�{�"u��C�����g�X|����`c�'�Z%i�xwq6���a{���:*��������n�����~���uJ�9�?.J�/Ih��bJ���������
����O�(���t`�j_W�*��4���a2���d��� �������X���y���,]E�@7���2<���X�G����i�������U�R�5On��O��c���@Qd�sl�i�	h���Wr*`�o0��a��L�m��d�-��w|)����C�\��G������b2z���h�Y�&&~�0�����F�����/0��O��I�%*��*���Ga�0�5�fP�/"�0X�&n��#y�L��3`����@S`�J�Y�z�J
���}��S�T$___gi��~�J��f~5	�(+��{����M��=��I�e�<�l���9�?���'�4<J��"��S�N7�dZ2�KN����8��y�a��k-���73��s}z)kz����M�
K]�^�2R@7���a�m<u7o������Q
n6�����������D���OQ5�:��Sb��f�=�cK��]����QIzpi ��&,y,�<A��&���J�ab��������z=~��#��.���Zb�X/6o�k�_I���o:�S�9�z���A!x�%Y�>��7�>0�
����u�O#Q�����N����+f#~�jP��A �{��l�����[�b�}V3MS	xk8A@7�p�.�V�7��Tw��1��$���>���A����@��y�x����s?Q�h�Ksp��B+.���\u��h����,	i�h������������IW�yx	�!�k7`�QK]��]eo�����;V
�TX���c�����%K�]]����������\$&!mX���[</�c��
or
H��gj�"��������_^�F�)���r�_g�N��������Y#�t�MO����P��e-�5R�g�0[O���F��CvJ��J�����8v��u����
�5G�P��I/	~^/�����m`Q~����D�e��5��_�qP�p�B��}��A��t���s�`�p������j������9k�S
�a�s|��HK5��u5��{�]�Q�Z:����'~m�o�%I����u<�Q�y�1M����r�#d����p�yb�8��QM*,�/��LM��Y�0�����4�Zi%��s�"s�c1�h6���G!V/ev�=�8c�L0�v���b��+~���hS�O6g���o�����"������ek�}o����=w�u��pz�!1���*��������@�4B/���*'C�a�f�;}�����m$\�G�vw��'��76?iQ�f3=���N���%B���6Z���Q���FM���9�$�H��w�`�w���}T�����|������������,�K��_�2�'7�l��/	�n�� �����T'����sc�Ol��7������4�I��A��`����UE/��'x	LA���5A=��x���~�NigM��,��CMq8�����AsY�5l���DX��:�u�,����#�
-���^��&g��3���3-��}�(�_b�	�o���������jW����
�>����7/4U��f��6$��U������G�6�k�s��S�G)b���%*�+:��W�.B����Y����.�f�^_�Y�^��� }��K������zt��%'r���0�[�ej���, �R�m&)�M���@��x�Y��2s4�L��Q���#.H6�7s�3�Oz{�O,,��#�DJ���a�)E1X�?"l;����_�D��Z�?w�P�.��#W�k����j�.J�5N�Z�8
;'�\W�P�Nn</)c��d�$��
0�-�j��O�r��D P��prX+B�f�
���l9�<�<��//sv�7�D8R-���+��'�E��*-H���_p���r������W����O,�@��]P������9~3�u�
����tY"���}�m�\#S�&&{�cku�s���8F��i<J�0J��$���V�?��s^�AK�5W��!�%w�N
�l��k"|�L����=\��a��z�c���aw1�Qc����_��<\�|T��iI�#�n��\[&�_d4NM���������2#-���I�]8+�H���+�+!��D�d~|�������zm	���#�]��3@4Eu�j�RX{���Jp�
����������b�����C�������W��?~.�\����$��qew�m�hg��y#�mW����(&!K^�����h�W�p{v�r�������M.|[�X����\���o�w���X�-���������;S��_����uc8
�I��w��F�LkIR����*��d4H�re��m���l$�<~��o������UX�m��]�]�����=/�&��
�����JbS�������pN�.l�\t��g3q"������V�4�t�����1��G#�O��u%�?~9��gF;���I����q�B�o�cW�;��V8(m?`����kXQ�8�5.�Lf`d��{S���������?W@�������IU,O��`����S'�7����e��`��g[I�KV��|r}������QB��8��A�?�1m:�����Y�$�	�[5Zq�E����t>\i�;����:���j(l��<�I�|s5� �8����9A��c.����FY����������[�a�==���E<��;d#��T�M�G-b���l0Dr��8����<�����y�c��X3i�"��^��Ld����2>�3{�s����O++*����=+��l�D`b
������Z���oP!c���
�������8�k����|xKA%N�/��F���;'�]�H&`S�h��e<8c����
��IU^s%,t������g�M{z�FQ!g�
�
[���1�Vm79>3��*�?Ah	���A:)SJ��Gi4-�g�����z��N�ROR�J�HR�r��A%26=z�!>H��������V@��Y�WQe.#�a�f-�����9���8�RC������"�i����~��^��}�#������n}87�=�����@d�OV`#R�\Ain��R�+���j��n�m-��~O�:'{��x��
��(��E���F��J�.u���5o��~�V9F����G�����������={�u�C3=��pW[�q�ws��y�bEs��^]��s��s��u����"�?�����C_A�D��T�y�
,b7��s�&�������$O��h��$�Y@E���84�=�����=O�~�!-����U@�v�J�:�2���K����}{�����9!��?W�]�-��
��'�ql '�����}~G7
�_���������o��Y������]�D����������d�gZ�����_��� ����7������:��h�
�_��Y�������F�d��p�0�W��C������fg��{J��dWRi��e��
^��ecE��bf�_���2�����(q�g'f�B0r��U�5�����~t���,��zJ[���5�`�
,��Y��*�8�E<_8p�-�\d��6��i��.,�J��ly�cL�7��g�����;��7��S���10�aX)1D�3}n����@ ���p���t�E1�����>>%eeeu���'�l���Jdt��������e{��~w�5'2�������p,��b���D�����`��J����P�����+h9���D�Y2$�=!��4�������M���\�����hT��/�4�6�A�0	|����R����7u7h��x�^��gJ��r[w�hi��R����|�(!�9���S��9�U�����V:G���F9q�L��_����C�?�}d�
�H|���������~���`��gg���
��1����+�#�g������o����,W�e��������v�S��<����X+����2R�K�8D0�y���G3(sN-��$��wy�����d�[q�-��=������� ������#`���������],�N���_���7�AAAX���F������o�E�n�;::R������zk}���#�G��tqh��5k�)�J��j%��#�C.0���*9n��~�*���]����b����
��j����8-�����l#x�gUB!xj�YccX"k�v������p���#AmK`�>��g�� �8\N������^0t[���)�:Q����Z�|`�6�j�����~;'�K<>�(��<��M���z��(���B��������)s�FO�fU/z��$,b40�Fxy���'oasN������������
�T(���QnK���%@o�y.PKmWL;�Jr�����L��J�u�'sy��_"w�,H�EC���`~
�bJY���!�CwqvW���,@L�����	��������Vi����\��J��j�8���[=(���������36�10�t5tO��<=���M�����V#�2g�'�0>d�f�M�n��h/p;��t
�����>a���}lR���|�`�WG55������]!��de��!�k�b�i�4�S����]��S>vl�D�[<0M�l�C������"��{DDHx����%L����n�j���~�b��Lz�����a�A�q��vwQ�y�{���V�fK�Tc$�m����.�U��O���:�MM�����s�||.����
�m�`"����qzaK�z`�Tn��O�w�0�Q�M�\�]s��RD?,=�c�V��|�F��j�?��k�va���`�����1�o��������7	�"���/�<�2u��?�}�Z�62��������s�_���@3��}���M�l�*�Q��mj���Ps��9���u���u����Ei���8�t����L�kP$co<�L��2tnr��N���?N�>R����w������:��[K��}
�8�/��@4X2�sz������C����f�?��/^��I��7����2���L�xn�Jr�G�d�\�_PK ���*PK�i�ZM�G���8� ��dst_100.pngUT
~h�D~h�D~hux��PKDs�ZXF�S��� ��F�dst_1000.pngUT
�#~h�D~h�D~hux��PK9v�Z ���*
 ����dst_10000.pngUT
_)~h�D~h�D~hux��PK'�
v1-0001-Optimize-selectivity-estimation-for-Var-Var-clauses.patchtext/x-patch; charset=UTF-8; name=v1-0001-Optimize-selectivity-estimation-for-Var-Var-clauses.patchDownload
From ecd195fd8f2a1404c0416e6ec4476a8b3de461c3 Mon Sep 17 00:00:00 2001
From: Evdokimov Ilia <ilya.evdokimov@tantorlabs.com>
Date: Mon, 21 Jul 2025 15:26:46 +0300
Subject: [PATCH v1] Optimize selectivity estimation for Var = Var clauses
 using merge-based MCV comparison
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Previously, selectivity estimation for join and semi-join clauses of the form
Var = Var relied on a nested-loop comparison of MCV lists, resulting in O(N²)
behavior with respect to the number of common values.

This patch introduces a merge-based strategy when the underlying type supports
BTREE ordering. In such cases, the MCVs are sorted using the datatype-specific
comparison operator, and selectivity is estimated via linear-time merge scan.
---
 src/backend/utils/adt/selfuncs.c    | 310 ++++++++++++++++++++++------
 src/backend/utils/cache/lsyscache.c |  61 ++++++
 src/include/utils/lsyscache.h       |   1 +
 src/include/utils/selfuncs.h        |  15 ++
 4 files changed, 327 insertions(+), 60 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 17fbfa9b410..9c3bae689d6 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -217,6 +217,7 @@ static bool get_actual_variable_endpoint(Relation heapRel,
 static RelOptInfo *find_join_input_rel(PlannerInfo *root, Relids relids);
 static double btcost_correlation(IndexOptInfo *index,
 								 VariableStatData *vardata);
+static int compare_mcv_items(const void *a, const void *b, void *arg);
 
 
 /*
@@ -2463,7 +2464,6 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		 * of Wisconsin, Madison, March 1991 (available from ftp.cs.wisc.edu).
 		 */
 		LOCAL_FCINFO(fcinfo, 2);
-		FmgrInfo	eqproc;
 		bool	   *hasmatch1;
 		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
@@ -2479,52 +2479,135 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 					totalsel2;
 		int			i,
 					nmatches;
-
-		fmgr_info(opfuncoid, &eqproc);
-
-		/*
-		 * Save a few cycles by setting up the fcinfo struct just once. Using
-		 * FunctionCallInvoke directly also avoids failure if the eqproc
-		 * returns NULL, though really equality functions should never do
-		 * that.
-		 */
-		InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
-								 NULL, NULL);
-		fcinfo->args[0].isnull = false;
-		fcinfo->args[1].isnull = false;
+		Oid			compare_func_oid = InvalidOid;
 
 		hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
 		hasmatch2 = (bool *) palloc0(sslot2->nvalues * sizeof(bool));
 
 		/*
 		 * Note we assume that each MCV will match at most one member of the
-		 * other MCV list.  If the operator isn't really equality, there could
-		 * be multiple matches --- but we don't look for them, both for speed
-		 * and because the math wouldn't add up...
+		 * other MCV list.
 		 */
 		matchprodfreq = 0.0;
 		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
+		if (get_comparison_op_for_sort(opfuncoid, &compare_func_oid))
 		{
-			int			j;
+			LOCAL_FCINFO(merge_fcinfo, 2);
+			McvCompareContext	compare_context;
+			FmgrInfo			cmpproc;
+			McvItem			   *mcvs1,
+							   *mcvs2;
+			int					ptr1,
+								ptr2;
 
-			fcinfo->args[0].value = sslot1->values[i];
+			fmgr_info(compare_func_oid, &cmpproc);
+			compare_context.flinfo = &cmpproc;
+			compare_context.collation = collation;
 
-			for (j = 0; j < sslot2->nvalues; j++)
+			mcvs1 = (McvItem *) palloc(sslot1->nvalues * sizeof(McvItem));
+			mcvs2 = (McvItem *) palloc(sslot2->nvalues * sizeof(McvItem));
+
+			/*
+ 			 * Copy the MCV values and their frequencies into a temporary array
+ 			 * so we can safely sort them without altering the original statistics.
+ 			 */
+			for (i = 0; i < sslot1->nvalues; i++)
 			{
-				Datum		fresult;
+				mcvs1[i].value = sslot1->values[i];
+				mcvs1[i].original_idx = i;
+				mcvs1[i].frequency = sslot1->numbers[i];
+			}
 
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
-				{
-					hasmatch1[i] = hasmatch2[j] = true;
-					matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
+			for (i = 0; i < sslot2->nvalues; i++)
+			{
+				mcvs2[i].value = sslot2->values[i];
+				mcvs2[i].original_idx = i;
+				mcvs2[i].frequency = sslot2->numbers[i];
+			}
+
+			qsort_arg(mcvs1, sslot1->nvalues, sizeof(McvItem), compare_mcv_items, &compare_context);
+			qsort_arg(mcvs2, sslot2->nvalues, sizeof(McvItem), compare_mcv_items, &compare_context);
+
+			InitFunctionCallInfoData(*merge_fcinfo, compare_context.flinfo, 2,
+									compare_context.collation, NULL, NULL);
+
+			ptr1 = ptr2 = 0;
+			while (ptr1 < sslot1->nvalues && ptr2 < sslot2->nvalues)
+			{
+				McvItem *item1 = &mcvs1[ptr1];
+				McvItem *item2 = &mcvs2[ptr2];
+				Datum result_datum;
+				int cmp_result;
+
+				merge_fcinfo->args[0].value = item1->value;
+				merge_fcinfo->args[1].value = item2->value;
+
+				result_datum = FunctionCallInvoke(merge_fcinfo);
+				cmp_result = DatumGetInt32(result_datum);
+
+				if (cmp_result == 0)
+				{ 
+					hasmatch1[item1->original_idx] = true;
+					hasmatch2[item2->original_idx] = true;
+					
+					matchprodfreq += item1->frequency * item2->frequency;
 					nmatches++;
-					break;
+
+					ptr1++;
+					ptr2++;
+				}
+				else if (cmp_result < 0)
+					ptr1++;
+				else
+					ptr2++;
+			}
+
+			pfree(mcvs1);
+			pfree(mcvs2);
+		}
+		else
+		{
+			FmgrInfo	eqproc;
+
+			fmgr_info(opfuncoid, &eqproc);
+			/*
+			* Save a few cycles by setting up the fcinfo struct just once. Using
+			* FunctionCallInvoke directly also avoids failure if the eqproc
+			* returns NULL, though really equality functions should never do
+			* that.
+			*/
+			InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
+									NULL, NULL);
+			fcinfo->args[0].isnull = false;
+			fcinfo->args[1].isnull = false;
+
+			/*
+			 * If the operator isn't really equality, there could
+		 	 * be multiple matches --- but we don't look for them, both for speed
+		 	 * and because the math wouldn't add up...
+		 	 */
+			for (i = 0; i < sslot1->nvalues; i++)
+			{
+				int         j;
+
+				fcinfo->args[0].value = sslot1->values[i];
+
+				for (j = 0; j < sslot2->nvalues; j++)
+				{
+					Datum		fresult;
+
+					if (hasmatch2[j])
+						continue;
+					fcinfo->args[1].value = sslot2->values[j];
+					fcinfo->isnull = false;
+					fresult = FunctionCallInvoke(fcinfo);
+					if (!fcinfo->isnull && DatumGetBool(fresult))
+					{
+						hasmatch1[i] = hasmatch2[j] = true;
+						matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
+						nmatches++;
+						break;
+					}
 				}
 			}
 		}
@@ -2690,7 +2773,6 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 * in a skewed distribution this gives us a big leg up in accuracy.
 		 */
 		LOCAL_FCINFO(fcinfo, 2);
-		FmgrInfo	eqproc;
 		bool	   *hasmatch1;
 		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
@@ -2700,6 +2782,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		int			i,
 					nmatches,
 					clamped_nvalues2;
+		Oid			compare_func_oid = InvalidOid;
 
 		/*
 		 * The clamping above could have resulted in nd2 being less than
@@ -2710,19 +2793,6 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 */
 		clamped_nvalues2 = Min(sslot2->nvalues, nd2);
 
-		fmgr_info(opfuncoid, &eqproc);
-
-		/*
-		 * Save a few cycles by setting up the fcinfo struct just once. Using
-		 * FunctionCallInvoke directly also avoids failure if the eqproc
-		 * returns NULL, though really equality functions should never do
-		 * that.
-		 */
-		InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
-								 NULL, NULL);
-		fcinfo->args[0].isnull = false;
-		fcinfo->args[1].isnull = false;
-
 		hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
 		hasmatch2 = (bool *) palloc0(clamped_nvalues2 * sizeof(bool));
 
@@ -2733,26 +2803,118 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 * and because the math wouldn't add up...
 		 */
 		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
+		if (get_comparison_op_for_sort(opfuncoid, &compare_func_oid))
 		{
-			int			j;
+			LOCAL_FCINFO(merge_fcinfo, 2);
+			McvCompareContext	compare_context;
+			FmgrInfo			cmpproc;
+			McvItem			   *mcvs1,
+							   *mcvs2;
+			int					ptr1,
+								ptr2;
 
-			fcinfo->args[0].value = sslot1->values[i];
+			fmgr_info(compare_func_oid, &cmpproc);
+			compare_context.flinfo = &cmpproc;
+			compare_context.collation = collation;
 
-			for (j = 0; j < clamped_nvalues2; j++)
+			mcvs1 = (McvItem *) palloc(sslot1->nvalues * sizeof(McvItem));
+			mcvs2 = (McvItem *) palloc(sslot2->nvalues * sizeof(McvItem));
+
+			/*
+ 			 * Copy the MCV values and their frequencies into a temporary array
+ 			 * so we can safely sort them without altering the original statistics.
+ 			 */
+			for (i = 0; i < sslot1->nvalues; i++)
 			{
-				Datum		fresult;
+				mcvs1[i].value = sslot1->values[i];
+				mcvs1[i].original_idx = i;
+				mcvs1[i].frequency = sslot1->numbers[i];
+			}
 
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
-				{
-					hasmatch1[i] = hasmatch2[j] = true;
+			for (i = 0; i < sslot2->nvalues; i++)
+			{
+				mcvs2[i].value = sslot2->values[i];
+				mcvs2[i].original_idx = i;
+				mcvs2[i].frequency = sslot2->numbers[i];
+			}
+
+			qsort_arg(mcvs1, sslot1->nvalues, sizeof(McvItem), compare_mcv_items, &compare_context);
+			qsort_arg(mcvs2, sslot2->nvalues, sizeof(McvItem), compare_mcv_items, &compare_context);
+
+			InitFunctionCallInfoData(*merge_fcinfo, compare_context.flinfo, 2,
+									compare_context.collation, NULL, NULL);
+
+			ptr1 = ptr2 = 0;
+			while (ptr1 < sslot1->nvalues && ptr2 < sslot2->nvalues)
+			{
+				McvItem *item1 = &mcvs1[ptr1];
+				McvItem *item2 = &mcvs2[ptr2];
+				Datum result_datum;
+				int cmp_result;
+
+				merge_fcinfo->args[0].value = item1->value;
+				merge_fcinfo->args[1].value = item2->value;
+
+				result_datum = FunctionCallInvoke(merge_fcinfo);
+				cmp_result = DatumGetInt32(result_datum);
+
+				if (cmp_result == 0)
+				{ 
+					hasmatch1[item1->original_idx] = true;
+					hasmatch2[item2->original_idx] = true;
+					
 					nmatches++;
-					break;
+
+					ptr1++;
+					ptr2++;
+				}
+				else if (cmp_result < 0)
+					ptr1++;
+				else
+					ptr2++;
+			}
+
+			pfree(mcvs1);
+			pfree(mcvs2);
+		}
+		else
+		{
+			FmgrInfo	eqproc;
+
+			fmgr_info(opfuncoid, &eqproc);
+			InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
+								 NULL, NULL);
+
+			fcinfo->args[0].isnull = false;
+			fcinfo->args[1].isnull = false;
+
+			/*
+			* Save a few cycles by setting up the fcinfo struct just once. Using
+			* FunctionCallInvoke directly also avoids failure if the eqproc
+			* returns NULL, though really equality functions should never do
+			* that.
+			*/
+			for (i = 0; i < sslot1->nvalues; i++)
+			{
+				int			j;
+
+				fcinfo->args[0].value = sslot1->values[i];
+
+				for (j = 0; j < clamped_nvalues2; j++)
+				{
+					Datum		fresult;
+
+						if (hasmatch2[j])
+							continue;
+						fcinfo->args[1].value = sslot2->values[j];
+						fcinfo->isnull = false;
+						fresult = FunctionCallInvoke(fcinfo);
+						if (!fcinfo->isnull && DatumGetBool(fresult))
+						{
+							hasmatch1[i] = hasmatch2[j] = true;
+							nmatches++;
+							break;
+					}
 				}
 			}
 		}
@@ -8753,3 +8915,31 @@ brincostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
 
 	*indexPages = index->pages;
 }
+
+/*
+ * Comparator for sorting MCV items
+ */
+static int
+compare_mcv_items(const void *a, const void *b, void *arg)
+{
+	LOCAL_FCINFO(fcinfo_comp, 2);
+    McvCompareContext *context = (McvCompareContext *) arg;
+    FmgrInfo   *flinfo = context->flinfo;
+    Oid         collation = context->collation;
+	Datum       result_datum;
+
+    const McvItem *item1 = (const McvItem *) a;
+    const McvItem *item2 = (const McvItem *) b;
+
+    InitFunctionCallInfoData(*fcinfo_comp, flinfo, 2, collation, NULL, NULL);
+
+    fcinfo_comp->args[0].value = item1->value;
+    fcinfo_comp->args[0].isnull = false;
+
+    fcinfo_comp->args[1].value = item2->value;
+    fcinfo_comp->args[1].isnull = false;
+
+    result_datum = FunctionCallInvoke(fcinfo_comp);
+
+    return DatumGetInt32(result_datum);
+}
\ No newline at end of file
diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c
index c460a72b75d..1a73a964bc4 100644
--- a/src/backend/utils/cache/lsyscache.c
+++ b/src/backend/utils/cache/lsyscache.c
@@ -17,6 +17,7 @@
 
 #include "access/hash.h"
 #include "access/htup_details.h"
+#include "access/nbtree.h"
 #include "bootstrap/bootstrap.h"
 #include "catalog/namespace.h"
 #include "catalog/pg_am.h"
@@ -39,6 +40,7 @@
 #include "catalog/pg_subscription.h"
 #include "catalog/pg_transform.h"
 #include "catalog/pg_type.h"
+#include "commands/defrem.h"
 #include "miscadmin.h"
 #include "nodes/makefuncs.h"
 #include "utils/array.h"
@@ -315,6 +317,65 @@ get_ordering_op_properties(Oid opno,
 	return result;
 }
 
+/*
+ * get_comparison_op_for_sort
+ *      Get the OID of a datatype-specific comparison operator
+ *      associated with a given equality operator.
+ *
+ * This is typically used in clauses like Var = Var, where both arguments
+ * are of the same type. We look up the corresponding BTORDER_PROC for
+ * the default B-tree opclass of the datatype.
+ *
+ * However, for special cases like array_eq and record_eq, a comparison
+ * operator may exist (btarraycmp, btrecordcmp), but sorting is only
+ * possible if all element or field types are themselves sortable.
+ * Rather than reimplement that logic here, we simply exclude such
+ * cases by checking for btarraycmp and btrecordcmp explicitly.
+ *
+ * Returns false if no suitable comparison operator is found.
+ */
+bool
+get_comparison_op_for_sort(Oid opno, Oid *cmpopno)
+{
+	bool		result = false;
+	HeapTuple   proctup;
+
+	proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(opno));
+	if (HeapTupleIsValid(proctup))
+	{
+		Form_pg_proc procform = (Form_pg_proc) GETSTRUCT(proctup);
+
+		/* Only consider binary operators where both arguments are of the same type. */
+		if (procform->pronargs == 2 &&
+			OidIsValid(procform->proargtypes.values[0]) &&
+			OidIsValid(procform->proargtypes.values[1]) &&
+			procform->proargtypes.values[0] == procform->proargtypes.values[1])
+		{
+			Oid         type_oid = procform->proargtypes.values[0];
+			Oid         opclass_oid = GetDefaultOpClass(type_oid, BTREE_AM_OID);
+
+			if (OidIsValid(opclass_oid))
+			{
+				Oid	opfamily_oid = get_opclass_family(opclass_oid);
+
+				*cmpopno = get_opfamily_proc(opfamily_oid, type_oid, type_oid, BTORDER_PROC);
+
+				/*
+ 				 * Skip array_eq and record_eq: their comparison functions exist,
+ 				 * but sorting is only possible if all elements or fields are sortable.
+ 				 */
+				if (OidIsValid(*cmpopno) &&
+					*cmpopno != F_BTARRAYCMP &&
+					*cmpopno != F_BTRECORDCMP)
+					result = true;
+			}
+		}
+		ReleaseSysCache(proctup);
+	}
+
+	return result;
+}
+
 /*
  * get_equality_op_for_ordering_op
  *		Get the OID of the datatype-specific equality operator
diff --git a/src/include/utils/lsyscache.h b/src/include/utils/lsyscache.h
index fa7c7e0323b..3ddcca5ac08 100644
--- a/src/include/utils/lsyscache.h
+++ b/src/include/utils/lsyscache.h
@@ -80,6 +80,7 @@ extern Oid	get_opfamily_member_for_cmptype(Oid opfamily, Oid lefttype, Oid right
 extern bool get_ordering_op_properties(Oid opno,
 									   Oid *opfamily, Oid *opcintype, CompareType *cmptype);
 extern Oid	get_equality_op_for_ordering_op(Oid opno, bool *reverse);
+extern bool get_comparison_op_for_sort(Oid opno, Oid *cmpopno);
 extern Oid	get_ordering_op_for_equality_op(Oid opno, bool use_lhs_type);
 extern List *get_mergejoin_opfamilies(Oid opno);
 extern bool get_compatible_hash_operators(Oid opno,
diff --git a/src/include/utils/selfuncs.h b/src/include/utils/selfuncs.h
index 013049b3098..56db6cb32ba 100644
--- a/src/include/utils/selfuncs.h
+++ b/src/include/utils/selfuncs.h
@@ -137,6 +137,21 @@ typedef struct
 	double		num_sa_scans;	/* # indexscans from ScalarArrayOpExprs */
 } GenericCosts;
 
+/* Context for comparing McvItem values. */
+typedef struct McvCompareContext
+{
+    FmgrInfo   *flinfo;		/* function info for Datum comparison. */
+    Oid         collation;	/* OID of collation for sorting */
+} McvCompareContext;
+
+/* Represents an MCV statistic entry */
+typedef struct McvItem
+{
+	Datum       value;
+	int         original_idx;	/* The original index of the item in the array before sorting. */
+	double      frequency;		/* Frequency of value in statistics */
+} McvItem;
+
 /* Hooks for plugins to get control when we ask for stats */
 typedef bool (*get_relation_stats_hook_type) (PlannerInfo *root,
 											  RangeTblEntry *rte,
-- 
2.34.1

#2Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: Ilia Evdokimov (#1)
1 attachment(s)
Re: Use merge-based matching for MCVs in eqjoinsel

On 21.07.2025 16:55, Ilia Evdokimov wrote:

While analyzing planner performance on JOB with
default_statistics_target = 1000, I noticed that a significant portion
of planning time is spent inside the eqjoinsel() function. According
to perf, in most JOB queries at default_statistics_target = 1000,
eqjoinsel() is the most expensive function during planning, accounting
for approximately 8% of total CPU time. At default_statistics_target =
10000, the planner spend up to 75% of its time inside eqjoinsel(),
making it one of the primary bottlenecks.

This overhead is caused by the O(N^2) nested-loop comparison of MCVs
in var1 = var2 clauses.

I propose an optimization: when the column datatype supports
ordering(i.e., has < and >), we can sort both MCV lists and apply
mege-style algorithm to detect matches. This reduces runtime from
O(N^2) to O(NlogN), where N is the number of MCV entries. The patch
also applies the same optimization to semi-join clauses, which show
similar performance behavior.

Following up on my previous message about optimizing eqjoinsel() for
Var1 = Var2 and semijoin clauses, I’d like to share more detailed
performance results across different values of default_statistics_target
on the JOB benchmark.

The performance improvement grows as the number of MCV entries increases
(i.e., with higher default_statistics_target). The table below shows
total planner time summed over all 113 queries in JOB for each setting
of default_statistics_target, before and after applying patch:

Total planner time across all JOB queries
=========================================
default_statistics_target | Before Patch (ms) | After Patch (ms)
--------------------------+-------------------+------------------
                      100 |          1828.433 |         1820.556
                     1000 |          2194.282 |         1963.110
                     2500 |          4606.705 |         2140.126
                     5000 |         16661.581 |         2616.109
                     7500 |         35988.569 |         3061.161
                    10000 |         66616.620 |         3504.144

For default_statistics_target < 1000, the planning time remains the same
before and after the patch. The optimization reduces planner
time substantially - by up to *13X *at default_statistics_target = 10000
- while the generated plans and selectivity calculations remain
unchanged. To illustrate this, the table below shows the 10 slowest JOB
queries (by planning time), along with their planning times before and
after applying the patch.

Top 10 slowest queries at default_statistics_target = 10000
===========================================================
Query | Before Patch (ms) | After Patch (ms)
------+--------------------+-------------------
  29c |           1939.282 |           111.219
  29b |           1939.237 |           100.109
  29a |           1931.870 |           100.224
  31c |           1622.255 |            67.609
  30c |           1602.156 |            70.942
  28b |           1521.026 |            84.058
  30b |           1519.972 |            68.777
  30a |           1518.014 |            70.529
  28a |           1514.908 |            86.662
  31a |           1507.303 |            63.579

As shown, the total planner time for these top 10 queries drops
substantially with the optimization.

I’ve identified and fixed two issues in the original v1 patch: In
'eqjoinsel_semi' the second MCV array was allocated with an incorrect
size. And the initialization of FunctionCallInfoData was moved outside
the comparator compare_mcv_items() to avoid repeated setup during
sorting. I've attached the updated v2 patch with changes.

Any suggestions?

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC.

Attachments:

v2-0001-Optimize-selectivity-estimation-for-Var-Var-clauses.patchtext/x-patch; charset=UTF-8; name=v2-0001-Optimize-selectivity-estimation-for-Var-Var-clauses.patchDownload
From 56cfbc9f93b69f877d7e9b350bfbce51c1908802 Mon Sep 17 00:00:00 2001
From: Ilia Evdokimov <ilya.evdokimov@tantorlabs.ru>
Date: Mon, 28 Jul 2025 13:34:05 +0300
Subject: [PATCH v2] Optimize selectivity estimation for Var = Var clauses
 using merge-based MCV comparison
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Previously, selectivity estimation for join and semi-join clauses of the form
Var = Var relied on a nested-loop comparison of MCV lists, resulting in O(N^2)
behavior with respect to the number of common values.

This patch introduces a merge-based strategy when the underlying type supports
BTREE ordering. In such cases, the MCVs are sorted using the datatype-specific
comparison operator, and selectivity is estimated via linear-time merge scan.
---
 src/backend/utils/adt/selfuncs.c    | 302 ++++++++++++++++++++++------
 src/backend/utils/cache/lsyscache.c |  61 ++++++
 src/include/utils/lsyscache.h       |   1 +
 src/include/utils/selfuncs.h        |   8 +
 4 files changed, 312 insertions(+), 60 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 17fbfa9b410..6bcec4d0e59 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -217,6 +217,7 @@ static bool get_actual_variable_endpoint(Relation heapRel,
 static RelOptInfo *find_join_input_rel(PlannerInfo *root, Relids relids);
 static double btcost_correlation(IndexOptInfo *index,
 								 VariableStatData *vardata);
+static int compare_mcv_items(const void *a, const void *b, void *arg);
 
 
 /*
@@ -2463,7 +2464,6 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		 * of Wisconsin, Madison, March 1991 (available from ftp.cs.wisc.edu).
 		 */
 		LOCAL_FCINFO(fcinfo, 2);
-		FmgrInfo	eqproc;
 		bool	   *hasmatch1;
 		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
@@ -2479,52 +2479,134 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 					totalsel2;
 		int			i,
 					nmatches;
-
-		fmgr_info(opfuncoid, &eqproc);
-
-		/*
-		 * Save a few cycles by setting up the fcinfo struct just once. Using
-		 * FunctionCallInvoke directly also avoids failure if the eqproc
-		 * returns NULL, though really equality functions should never do
-		 * that.
-		 */
-		InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
-								 NULL, NULL);
-		fcinfo->args[0].isnull = false;
-		fcinfo->args[1].isnull = false;
+		Oid			compare_func_oid = InvalidOid;
 
 		hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
 		hasmatch2 = (bool *) palloc0(sslot2->nvalues * sizeof(bool));
 
 		/*
 		 * Note we assume that each MCV will match at most one member of the
-		 * other MCV list.  If the operator isn't really equality, there could
-		 * be multiple matches --- but we don't look for them, both for speed
-		 * and because the math wouldn't add up...
+		 * other MCV list.
 		 */
 		matchprodfreq = 0.0;
 		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
+		if (get_comparison_op_for_sort(opfuncoid, &compare_func_oid))
 		{
-			int			j;
+			LOCAL_FCINFO(merge_fcinfo, 2);
+			FmgrInfo			cmpproc;
+			McvItem			   *mcvs1,
+							   *mcvs2;
+			int					ptr1,
+								ptr2;
+
+			fmgr_info(compare_func_oid, &cmpproc);
+
+			InitFunctionCallInfoData(*merge_fcinfo, &cmpproc, 2,
+										collation, NULL, NULL);
 
-			fcinfo->args[0].value = sslot1->values[i];
+			mcvs1 = (McvItem *) palloc(sslot1->nvalues * sizeof(McvItem));
+			mcvs2 = (McvItem *) palloc(sslot2->nvalues * sizeof(McvItem));
 
-			for (j = 0; j < sslot2->nvalues; j++)
+			/*
+ 			 * Copy the MCV values and their frequencies into a temporary array
+ 			 * so we can safely sort them without altering the original statistics.
+ 			 */
+			for (i = 0; i < sslot1->nvalues; i++)
 			{
-				Datum		fresult;
+				mcvs1[i].value = sslot1->values[i];
+				mcvs1[i].original_idx = i;
+				mcvs1[i].frequency = sslot1->numbers[i];
+			}
 
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
-				{
-					hasmatch1[i] = hasmatch2[j] = true;
-					matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
+			for (i = 0; i < sslot2->nvalues; i++)
+			{
+				mcvs2[i].value = sslot2->values[i];
+				mcvs2[i].original_idx = i;
+				mcvs2[i].frequency = sslot2->numbers[i];
+			}
+
+			qsort_arg(mcvs1, sslot1->nvalues, sizeof(McvItem), compare_mcv_items, &merge_fcinfo);
+			qsort_arg(mcvs2, sslot2->nvalues, sizeof(McvItem), compare_mcv_items, &merge_fcinfo);
+
+			ptr1 = ptr2 = 0;
+			while (ptr1 < sslot1->nvalues && ptr2 < sslot2->nvalues)
+			{
+				McvItem *item1 = &mcvs1[ptr1];
+				McvItem *item2 = &mcvs2[ptr2];
+				Datum result_datum;
+				int cmp_result;
+
+				merge_fcinfo->args[0].value = item1->value;
+				merge_fcinfo->args[0].isnull = false;
+				merge_fcinfo->args[1].value = item2->value;
+				merge_fcinfo->args[1].isnull = false;
+
+				result_datum = FunctionCallInvoke(merge_fcinfo);
+				cmp_result = DatumGetInt32(result_datum);
+
+				if (cmp_result == 0)
+				{ 
+					hasmatch1[item1->original_idx] = true;
+					hasmatch2[item2->original_idx] = true;
+					
+					matchprodfreq += item1->frequency * item2->frequency;
 					nmatches++;
-					break;
+
+					ptr1++;
+					ptr2++;
+				}
+				else if (cmp_result < 0)
+					ptr1++;
+				else
+					ptr2++;
+			}
+
+			pfree(mcvs1);
+			pfree(mcvs2);
+		}
+		else
+		{
+			FmgrInfo	eqproc;
+
+			fmgr_info(opfuncoid, &eqproc);
+			/*
+			* Save a few cycles by setting up the fcinfo struct just once. Using
+			* FunctionCallInvoke directly also avoids failure if the eqproc
+			* returns NULL, though really equality functions should never do
+			* that.
+			*/
+			InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
+									NULL, NULL);
+			fcinfo->args[0].isnull = false;
+			fcinfo->args[1].isnull = false;
+
+			/*
+			 * If the operator isn't really equality, there could
+		 	 * be multiple matches --- but we don't look for them, both for speed
+		 	 * and because the math wouldn't add up...
+		 	 */
+			for (i = 0; i < sslot1->nvalues; i++)
+			{
+				int         j;
+
+				fcinfo->args[0].value = sslot1->values[i];
+
+				for (j = 0; j < sslot2->nvalues; j++)
+				{
+					Datum		fresult;
+
+					if (hasmatch2[j])
+						continue;
+					fcinfo->args[1].value = sslot2->values[j];
+					fcinfo->isnull = false;
+					fresult = FunctionCallInvoke(fcinfo);
+					if (!fcinfo->isnull && DatumGetBool(fresult))
+					{
+						hasmatch1[i] = hasmatch2[j] = true;
+						matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
+						nmatches++;
+						break;
+					}
 				}
 			}
 		}
@@ -2690,7 +2772,6 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 * in a skewed distribution this gives us a big leg up in accuracy.
 		 */
 		LOCAL_FCINFO(fcinfo, 2);
-		FmgrInfo	eqproc;
 		bool	   *hasmatch1;
 		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
@@ -2700,6 +2781,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		int			i,
 					nmatches,
 					clamped_nvalues2;
+		Oid			compare_func_oid = InvalidOid;
 
 		/*
 		 * The clamping above could have resulted in nd2 being less than
@@ -2710,19 +2792,6 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 */
 		clamped_nvalues2 = Min(sslot2->nvalues, nd2);
 
-		fmgr_info(opfuncoid, &eqproc);
-
-		/*
-		 * Save a few cycles by setting up the fcinfo struct just once. Using
-		 * FunctionCallInvoke directly also avoids failure if the eqproc
-		 * returns NULL, though really equality functions should never do
-		 * that.
-		 */
-		InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
-								 NULL, NULL);
-		fcinfo->args[0].isnull = false;
-		fcinfo->args[1].isnull = false;
-
 		hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
 		hasmatch2 = (bool *) palloc0(clamped_nvalues2 * sizeof(bool));
 
@@ -2733,26 +2802,116 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 * and because the math wouldn't add up...
 		 */
 		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
+		if (get_comparison_op_for_sort(opfuncoid, &compare_func_oid))
 		{
-			int			j;
+			LOCAL_FCINFO(merge_fcinfo, 2);
+			FmgrInfo			cmpproc;
+			McvItem			   *mcvs1,
+							   *mcvs2;
+			int					ptr1,
+								ptr2;
 
-			fcinfo->args[0].value = sslot1->values[i];
+			fmgr_info(compare_func_oid, &cmpproc);
+			InitFunctionCallInfoData(*merge_fcinfo, &cmpproc, 2,
+										collation, NULL, NULL);
 
-			for (j = 0; j < clamped_nvalues2; j++)
+			mcvs1 = (McvItem *) palloc(sslot1->nvalues * sizeof(McvItem));
+			mcvs2 = (McvItem *) palloc(clamped_nvalues2 * sizeof(McvItem));
+
+			/*
+ 			 * Copy the MCV values and their frequencies into a temporary array
+ 			 * so we can safely sort them without altering the original statistics.
+ 			 */
+			for (i = 0; i < sslot1->nvalues; i++)
 			{
-				Datum		fresult;
+				mcvs1[i].value = sslot1->values[i];
+				mcvs1[i].original_idx = i;
+				mcvs1[i].frequency = sslot1->numbers[i];
+			}
 
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
-				{
-					hasmatch1[i] = hasmatch2[j] = true;
+			for (i = 0; i < clamped_nvalues2; i++)
+			{
+				mcvs2[i].value = sslot2->values[i];
+				mcvs2[i].original_idx = i;
+				mcvs2[i].frequency = sslot2->numbers[i];
+			}
+
+			qsort_arg(mcvs1, sslot1->nvalues, sizeof(McvItem), compare_mcv_items, &merge_fcinfo);
+			qsort_arg(mcvs2, clamped_nvalues2, sizeof(McvItem), compare_mcv_items, &merge_fcinfo);
+
+			ptr1 = ptr2 = 0;
+			while (ptr1 < sslot1->nvalues && ptr2 < clamped_nvalues2)
+			{
+				McvItem *item1 = &mcvs1[ptr1];
+				McvItem *item2 = &mcvs2[ptr2];
+				Datum result_datum;
+				int cmp_result;
+
+				merge_fcinfo->args[0].value = item1->value;
+				merge_fcinfo->args[0].isnull = false;
+				merge_fcinfo->args[1].value = item2->value;
+				merge_fcinfo->args[1].isnull = false;
+
+				result_datum = FunctionCallInvoke(merge_fcinfo);
+				cmp_result = DatumGetInt32(result_datum);
+
+				if (cmp_result == 0)
+				{ 
+					hasmatch1[item1->original_idx] = true;
+					hasmatch2[item2->original_idx] = true;
+					
 					nmatches++;
-					break;
+
+					ptr1++;
+					ptr2++;
+				}
+				else if (cmp_result < 0)
+					ptr1++;
+				else
+					ptr2++;
+			}
+
+			pfree(mcvs1);
+			pfree(mcvs2);
+		}
+		else
+		{
+			FmgrInfo	eqproc;
+
+			fmgr_info(opfuncoid, &eqproc);
+			InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
+								 NULL, NULL);
+
+			fcinfo->args[0].isnull = false;
+			fcinfo->args[1].isnull = false;
+
+			/*
+			* Save a few cycles by setting up the fcinfo struct just once. Using
+			* FunctionCallInvoke directly also avoids failure if the eqproc
+			* returns NULL, though really equality functions should never do
+			* that.
+			*/
+			for (i = 0; i < sslot1->nvalues; i++)
+			{
+				int			j;
+
+				fcinfo->args[0].value = sslot1->values[i];
+
+				for (j = 0; j < clamped_nvalues2; j++)
+				{
+					Datum		fresult;
+
+						if (hasmatch2[j])
+							continue;
+						fcinfo->args[1].value = sslot2->values[j];
+						fcinfo->isnull = false;
+						fresult = FunctionCallInvoke(fcinfo);
+						if (!fcinfo->isnull && DatumGetBool(fresult))
+						{
+							hasmatch1[i] = hasmatch2[j] = true;
+							nmatches++;
+							break;
+					}
 				}
 			}
 		}
@@ -8753,3 +8912,26 @@ brincostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
 
 	*indexPages = index->pages;
 }
+
+/*
+ * Comparator for sorting MCV items
+ */
+static int
+compare_mcv_items(const void *a, const void *b, void *arg)
+{
+	FunctionCallInfo	fcinfo_comp = *((FunctionCallInfo *) arg);
+	Datum       		result_datum;
+
+    const McvItem *item1 = (const McvItem *) a;
+    const McvItem *item2 = (const McvItem *) b;
+
+    fcinfo_comp->args[0].value = item1->value;
+    fcinfo_comp->args[0].isnull = false;
+
+    fcinfo_comp->args[1].value = item2->value;
+    fcinfo_comp->args[1].isnull = false;
+
+    result_datum = FunctionCallInvoke(fcinfo_comp);
+
+    return DatumGetInt32(result_datum);
+}
\ No newline at end of file
diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c
index c460a72b75d..1a73a964bc4 100644
--- a/src/backend/utils/cache/lsyscache.c
+++ b/src/backend/utils/cache/lsyscache.c
@@ -17,6 +17,7 @@
 
 #include "access/hash.h"
 #include "access/htup_details.h"
+#include "access/nbtree.h"
 #include "bootstrap/bootstrap.h"
 #include "catalog/namespace.h"
 #include "catalog/pg_am.h"
@@ -39,6 +40,7 @@
 #include "catalog/pg_subscription.h"
 #include "catalog/pg_transform.h"
 #include "catalog/pg_type.h"
+#include "commands/defrem.h"
 #include "miscadmin.h"
 #include "nodes/makefuncs.h"
 #include "utils/array.h"
@@ -315,6 +317,65 @@ get_ordering_op_properties(Oid opno,
 	return result;
 }
 
+/*
+ * get_comparison_op_for_sort
+ *      Get the OID of a datatype-specific comparison operator
+ *      associated with a given equality operator.
+ *
+ * This is typically used in clauses like Var = Var, where both arguments
+ * are of the same type. We look up the corresponding BTORDER_PROC for
+ * the default B-tree opclass of the datatype.
+ *
+ * However, for special cases like array_eq and record_eq, a comparison
+ * operator may exist (btarraycmp, btrecordcmp), but sorting is only
+ * possible if all element or field types are themselves sortable.
+ * Rather than reimplement that logic here, we simply exclude such
+ * cases by checking for btarraycmp and btrecordcmp explicitly.
+ *
+ * Returns false if no suitable comparison operator is found.
+ */
+bool
+get_comparison_op_for_sort(Oid opno, Oid *cmpopno)
+{
+	bool		result = false;
+	HeapTuple   proctup;
+
+	proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(opno));
+	if (HeapTupleIsValid(proctup))
+	{
+		Form_pg_proc procform = (Form_pg_proc) GETSTRUCT(proctup);
+
+		/* Only consider binary operators where both arguments are of the same type. */
+		if (procform->pronargs == 2 &&
+			OidIsValid(procform->proargtypes.values[0]) &&
+			OidIsValid(procform->proargtypes.values[1]) &&
+			procform->proargtypes.values[0] == procform->proargtypes.values[1])
+		{
+			Oid         type_oid = procform->proargtypes.values[0];
+			Oid         opclass_oid = GetDefaultOpClass(type_oid, BTREE_AM_OID);
+
+			if (OidIsValid(opclass_oid))
+			{
+				Oid	opfamily_oid = get_opclass_family(opclass_oid);
+
+				*cmpopno = get_opfamily_proc(opfamily_oid, type_oid, type_oid, BTORDER_PROC);
+
+				/*
+ 				 * Skip array_eq and record_eq: their comparison functions exist,
+ 				 * but sorting is only possible if all elements or fields are sortable.
+ 				 */
+				if (OidIsValid(*cmpopno) &&
+					*cmpopno != F_BTARRAYCMP &&
+					*cmpopno != F_BTRECORDCMP)
+					result = true;
+			}
+		}
+		ReleaseSysCache(proctup);
+	}
+
+	return result;
+}
+
 /*
  * get_equality_op_for_ordering_op
  *		Get the OID of the datatype-specific equality operator
diff --git a/src/include/utils/lsyscache.h b/src/include/utils/lsyscache.h
index fa7c7e0323b..3ddcca5ac08 100644
--- a/src/include/utils/lsyscache.h
+++ b/src/include/utils/lsyscache.h
@@ -80,6 +80,7 @@ extern Oid	get_opfamily_member_for_cmptype(Oid opfamily, Oid lefttype, Oid right
 extern bool get_ordering_op_properties(Oid opno,
 									   Oid *opfamily, Oid *opcintype, CompareType *cmptype);
 extern Oid	get_equality_op_for_ordering_op(Oid opno, bool *reverse);
+extern bool get_comparison_op_for_sort(Oid opno, Oid *cmpopno);
 extern Oid	get_ordering_op_for_equality_op(Oid opno, bool use_lhs_type);
 extern List *get_mergejoin_opfamilies(Oid opno);
 extern bool get_compatible_hash_operators(Oid opno,
diff --git a/src/include/utils/selfuncs.h b/src/include/utils/selfuncs.h
index 013049b3098..66505d3b79c 100644
--- a/src/include/utils/selfuncs.h
+++ b/src/include/utils/selfuncs.h
@@ -137,6 +137,14 @@ typedef struct
 	double		num_sa_scans;	/* # indexscans from ScalarArrayOpExprs */
 } GenericCosts;
 
+/* Represents an MCV statistic entry */
+typedef struct McvItem
+{
+	Datum       value;
+	int         original_idx;	/* The original index of the item in the array before sorting. */
+	double      frequency;		/* Frequency of value in statistics */
+} McvItem;
+
 /* Hooks for plugins to get control when we ask for stats */
 typedef bool (*get_relation_stats_hook_type) (PlannerInfo *root,
 											  RangeTblEntry *rte,
-- 
2.34.1

#3Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: Ilia Evdokimov (#2)
1 attachment(s)
Re: Use merge-based matching for MCVs in eqjoinsel

Following up on my previous messages about optimizing eqjoinsel() and
eqjoinsel_semi() for Var1 = Var2 clauses, I’d like to share detailed
profiling results showing the effect of the patch on JOB for different
values of default_statistics_target.

The first table shows the total planner time (summed over all 113
queries) before and after applying the patch, along with the speedup
achieved:

default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------+---------------------+---------------------+--------------------
                     100  | *1.00x*       | 1828.433     |        1820.556
                    1000  | *1.12x*       | 2194.282     |        1963.110
                    2500  | *2.15x*       | 4606.705     |        2140.126
                    5000  | *6.37x*       | 16661.581     |        2616.109
                    7500  | *11.76x*       | 35988.569     |       
3061.161
                   10000  | *19.01x*       | 66616.620     |       
3504.144

The second table shows the profiling of eqjoinsel() using *perf*,
demonstrating that the function, which dominates planning at high
statistics targets, becomes essentially negligible after the patch:

default_statistics_target | eqjoinsel() Before (perf) | eqjoinsel()
After (perf)
--------------------------+---------------------------+--------------------------
                     100  |                     0.01%
|                     0.04%
                    1000  |                     6.23%
|                     0.06%
                    2500  |                    35.45%
|                     0.23%
                    5000  |                    66.14%
|                     0.53%
                    7500  |                    72.70%
|                     0.97%
                   10000  |                    75.42%
|                     1.25%

I’ve attached v3 of the patch. This version adds a check for NULL values
when comparing MCV entries, ensuring correctness in edge cases.

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com

Attachments:

v3-0001-Optimize-selectivity-estimation-for-Var-Var-clauses.patchtext/x-patch; charset=UTF-8; name=v3-0001-Optimize-selectivity-estimation-for-Var-Var-clauses.patchDownload
From 65757822257e13b1e2a50bf86b9080ed8b86adec Mon Sep 17 00:00:00 2001
From: Ilia Evdokimov <ilya.evdokimov@tantorlabs.ru>
Date: Wed, 3 Sep 2025 19:40:50 +0300
Subject: [PATCH v3] Optimize selectivity estimation for Var = Var clauses
 using merge-based MCV comparison

Previously, selectivity estimation for join and semi-join clauses of the form
Var = Var relied on a nested-loop comparison of MCV lists, resulting in O(N^2)
behavior with respect to the number of common values.

This patch introduces a merge-based strategy when the underlying type supports
BTREE ordering. In such cases, the MCVs are sorted using the datatype-specific
comparison operator, and selectivity is estimated via linear-time merge scan.
---
 src/backend/utils/adt/selfuncs.c    | 311 ++++++++++++++++++++++------
 src/backend/utils/cache/lsyscache.c |  61 ++++++
 src/include/utils/lsyscache.h       |   1 +
 src/include/utils/selfuncs.h        |   8 +
 4 files changed, 321 insertions(+), 60 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 1c480cfaaf7..400c5fdcb9b 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -217,6 +217,7 @@ static bool get_actual_variable_endpoint(Relation heapRel,
 static RelOptInfo *find_join_input_rel(PlannerInfo *root, Relids relids);
 static double btcost_correlation(IndexOptInfo *index,
 								 VariableStatData *vardata);
+static int compare_mcv_items(const void *a, const void *b, void *arg);
 
 
 /*
@@ -2463,7 +2464,6 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		 * of Wisconsin, Madison, March 1991 (available from ftp.cs.wisc.edu).
 		 */
 		LOCAL_FCINFO(fcinfo, 2);
-		FmgrInfo	eqproc;
 		bool	   *hasmatch1;
 		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
@@ -2479,52 +2479,139 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 					totalsel2;
 		int			i,
 					nmatches;
-
-		fmgr_info(opfuncoid, &eqproc);
-
-		/*
-		 * Save a few cycles by setting up the fcinfo struct just once. Using
-		 * FunctionCallInvoke directly also avoids failure if the eqproc
-		 * returns NULL, though really equality functions should never do
-		 * that.
-		 */
-		InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
-								 NULL, NULL);
-		fcinfo->args[0].isnull = false;
-		fcinfo->args[1].isnull = false;
+		Oid			compare_func_oid = InvalidOid;
 
 		hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
 		hasmatch2 = (bool *) palloc0(sslot2->nvalues * sizeof(bool));
 
 		/*
 		 * Note we assume that each MCV will match at most one member of the
-		 * other MCV list.  If the operator isn't really equality, there could
-		 * be multiple matches --- but we don't look for them, both for speed
-		 * and because the math wouldn't add up...
+		 * other MCV list.
 		 */
 		matchprodfreq = 0.0;
 		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
+		if (get_comparison_op_for_sort(opfuncoid, &compare_func_oid))
 		{
-			int			j;
+			LOCAL_FCINFO(merge_fcinfo, 2);
+			FmgrInfo			cmpproc;
+			McvItem			   *mcvs1,
+							   *mcvs2;
+			int					ptr1,
+								ptr2;
+
+			fmgr_info(compare_func_oid, &cmpproc);
+
+			InitFunctionCallInfoData(*merge_fcinfo, &cmpproc, 2,
+										collation, NULL, NULL);
+
+			mcvs1 = (McvItem *) palloc(sslot1->nvalues * sizeof(McvItem));
+			mcvs2 = (McvItem *) palloc(sslot2->nvalues * sizeof(McvItem));
 
-			fcinfo->args[0].value = sslot1->values[i];
+			/*
+ 			 * Copy the MCV values and their frequencies into a temporary array
+ 			 * so we can safely sort them without altering the original statistics.
+ 			 */
+			for (i = 0; i < sslot1->nvalues; i++)
+			{
+				mcvs1[i].value = sslot1->values[i];
+				mcvs1[i].original_idx = i;
+				mcvs1[i].frequency = sslot1->numbers[i];
+			}
 
-			for (j = 0; j < sslot2->nvalues; j++)
+			for (i = 0; i < sslot2->nvalues; i++)
 			{
-				Datum		fresult;
+				mcvs2[i].value = sslot2->values[i];
+				mcvs2[i].original_idx = i;
+				mcvs2[i].frequency = sslot2->numbers[i];
+			}
 
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
+			qsort_arg(mcvs1, sslot1->nvalues, sizeof(McvItem), compare_mcv_items, &merge_fcinfo);
+			qsort_arg(mcvs2, sslot2->nvalues, sizeof(McvItem), compare_mcv_items, &merge_fcinfo);
+
+			ptr1 = ptr2 = 0;
+			while (ptr1 < sslot1->nvalues && ptr2 < sslot2->nvalues)
+			{
+				McvItem *item1 = &mcvs1[ptr1];
+				McvItem *item2 = &mcvs2[ptr2];
+				Datum result_datum;
+
+				merge_fcinfo->args[0].value = item1->value;
+				merge_fcinfo->args[1].value = item2->value;
+				merge_fcinfo->isnull = false;
+
+				result_datum = FunctionCallInvoke(merge_fcinfo);
+				if (!merge_fcinfo->isnull)
 				{
-					hasmatch1[i] = hasmatch2[j] = true;
-					matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
-					nmatches++;
-					break;
+					int32 cmp_result = DatumGetInt32(result_datum);
+					if (cmp_result == 0)
+					{ 
+						hasmatch1[item1->original_idx] = true;
+						hasmatch2[item2->original_idx] = true;
+						
+						matchprodfreq += item1->frequency * item2->frequency;
+						nmatches++;
+
+						ptr1++;
+						ptr2++;
+					}
+					else if (cmp_result < 0)
+						ptr1++;
+					else
+						ptr2++;
+				}
+				else
+				{
+					ptr1++;
+					ptr2++;
+				}
+			}
+
+			pfree(mcvs1);
+			pfree(mcvs2);
+		}
+		else
+		{
+			FmgrInfo	eqproc;
+
+			fmgr_info(opfuncoid, &eqproc);
+			/*
+			* Save a few cycles by setting up the fcinfo struct just once. Using
+			* FunctionCallInvoke directly also avoids failure if the eqproc
+			* returns NULL, though really equality functions should never do
+			* that.
+			*/
+			InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
+									NULL, NULL);
+			fcinfo->args[0].isnull = false;
+			fcinfo->args[1].isnull = false;
+
+			/*
+			 * If the operator isn't really equality, there could
+		 	 * be multiple matches --- but we don't look for them, both for speed
+		 	 * and because the math wouldn't add up...
+		 	 */
+			for (i = 0; i < sslot1->nvalues; i++)
+			{
+				int         j;
+
+				fcinfo->args[0].value = sslot1->values[i];
+
+				for (j = 0; j < sslot2->nvalues; j++)
+				{
+					Datum		fresult;
+
+					if (hasmatch2[j])
+						continue;
+					fcinfo->args[1].value = sslot2->values[j];
+					fcinfo->isnull = false;
+					fresult = FunctionCallInvoke(fcinfo);
+					if (!fcinfo->isnull && DatumGetBool(fresult))
+					{
+						hasmatch1[i] = hasmatch2[j] = true;
+						matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
+						nmatches++;
+						break;
+					}
 				}
 			}
 		}
@@ -2690,7 +2777,6 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 * in a skewed distribution this gives us a big leg up in accuracy.
 		 */
 		LOCAL_FCINFO(fcinfo, 2);
-		FmgrInfo	eqproc;
 		bool	   *hasmatch1;
 		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
@@ -2700,6 +2786,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		int			i,
 					nmatches,
 					clamped_nvalues2;
+		Oid			compare_func_oid = InvalidOid;
 
 		/*
 		 * The clamping above could have resulted in nd2 being less than
@@ -2710,19 +2797,6 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 */
 		clamped_nvalues2 = Min(sslot2->nvalues, nd2);
 
-		fmgr_info(opfuncoid, &eqproc);
-
-		/*
-		 * Save a few cycles by setting up the fcinfo struct just once. Using
-		 * FunctionCallInvoke directly also avoids failure if the eqproc
-		 * returns NULL, though really equality functions should never do
-		 * that.
-		 */
-		InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
-								 NULL, NULL);
-		fcinfo->args[0].isnull = false;
-		fcinfo->args[1].isnull = false;
-
 		hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
 		hasmatch2 = (bool *) palloc0(clamped_nvalues2 * sizeof(bool));
 
@@ -2733,26 +2807,120 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 * and because the math wouldn't add up...
 		 */
 		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
+		if (get_comparison_op_for_sort(opfuncoid, &compare_func_oid))
 		{
-			int			j;
+			LOCAL_FCINFO(merge_fcinfo, 2);
+			FmgrInfo			cmpproc;
+			McvItem			   *mcvs1,
+							   *mcvs2;
+			int					ptr1,
+								ptr2;
+
+			fmgr_info(compare_func_oid, &cmpproc);
+			InitFunctionCallInfoData(*merge_fcinfo, &cmpproc, 2,
+										collation, NULL, NULL);
 
-			fcinfo->args[0].value = sslot1->values[i];
+			mcvs1 = (McvItem *) palloc(sslot1->nvalues * sizeof(McvItem));
+			mcvs2 = (McvItem *) palloc(clamped_nvalues2 * sizeof(McvItem));
 
-			for (j = 0; j < clamped_nvalues2; j++)
+			/*
+ 			 * Copy the MCV values and their frequencies into a temporary array
+ 			 * so we can safely sort them without altering the original statistics.
+ 			 */
+			for (i = 0; i < sslot1->nvalues; i++)
 			{
-				Datum		fresult;
+				mcvs1[i].value = sslot1->values[i];
+				mcvs1[i].original_idx = i;
+				mcvs1[i].frequency = sslot1->numbers[i];
+			}
 
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
+			for (i = 0; i < clamped_nvalues2; i++)
+			{
+				mcvs2[i].value = sslot2->values[i];
+				mcvs2[i].original_idx = i;
+				mcvs2[i].frequency = sslot2->numbers[i];
+			}
+
+			qsort_arg(mcvs1, sslot1->nvalues, sizeof(McvItem), compare_mcv_items, &merge_fcinfo);
+			qsort_arg(mcvs2, clamped_nvalues2, sizeof(McvItem), compare_mcv_items, &merge_fcinfo);
+
+			ptr1 = ptr2 = 0;
+			while (ptr1 < sslot1->nvalues && ptr2 < clamped_nvalues2)
+			{
+				McvItem *item1 = &mcvs1[ptr1];
+				McvItem *item2 = &mcvs2[ptr2];
+				Datum result_datum;
+
+				merge_fcinfo->args[0].value = item1->value;
+				merge_fcinfo->args[1].value = item2->value;
+				merge_fcinfo->isnull = false;
+
+				result_datum = FunctionCallInvoke(merge_fcinfo);
+				if (!merge_fcinfo->isnull)
 				{
-					hasmatch1[i] = hasmatch2[j] = true;
-					nmatches++;
-					break;
+					int32 cmp_result = DatumGetInt32(result_datum);
+					if (cmp_result == 0)
+					{ 
+						hasmatch1[item1->original_idx] = hasmatch2[item2->original_idx] = true;
+						
+						nmatches++;
+
+						ptr1++;
+						ptr2++;
+					}
+					else if (cmp_result < 0)
+						ptr1++;
+					else
+						ptr2++;
+				}
+				else
+				{
+					ptr1++;
+					ptr2++;
+				}
+			}
+
+			pfree(mcvs1);
+			pfree(mcvs2);
+		}
+		else
+		{
+			FmgrInfo	eqproc;
+
+			fmgr_info(opfuncoid, &eqproc);
+			InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
+								 NULL, NULL);
+
+			fcinfo->args[0].isnull = false;
+			fcinfo->args[1].isnull = false;
+
+			/*
+			* Save a few cycles by setting up the fcinfo struct just once. Using
+			* FunctionCallInvoke directly also avoids failure if the eqproc
+			* returns NULL, though really equality functions should never do
+			* that.
+			*/
+			for (i = 0; i < sslot1->nvalues; i++)
+			{
+				int			j;
+
+				fcinfo->args[0].value = sslot1->values[i];
+
+				for (j = 0; j < clamped_nvalues2; j++)
+				{
+					Datum		fresult;
+
+						if (hasmatch2[j])
+							continue;
+						fcinfo->args[1].value = sslot2->values[j];
+						fcinfo->isnull = false;
+						fresult = FunctionCallInvoke(fcinfo);
+						if (!fcinfo->isnull && DatumGetBool(fresult))
+						{
+							hasmatch1[i] = hasmatch2[j] = true;
+							nmatches++;
+							break;
+					}
 				}
 			}
 		}
@@ -8793,3 +8961,26 @@ brincostestimate(PlannerInfo *root, IndexPath *path, double loop_count,
 
 	*indexPages = index->pages;
 }
+
+/*
+ * Comparator for sorting MCV items
+ */
+static int
+compare_mcv_items(const void *a, const void *b, void *arg)
+{
+	FunctionCallInfo	fcinfo_comp = *((FunctionCallInfo *) arg);
+	Datum       		result_datum;
+
+    const McvItem *item1 = (const McvItem *) a;
+    const McvItem *item2 = (const McvItem *) b;
+
+    fcinfo_comp->args[0].value = item1->value;
+    fcinfo_comp->args[0].isnull = false;
+
+    fcinfo_comp->args[1].value = item2->value;
+    fcinfo_comp->args[1].isnull = false;
+
+    result_datum = FunctionCallInvoke(fcinfo_comp);
+
+    return DatumGetInt32(result_datum);
+}
\ No newline at end of file
diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c
index fa7cd7e06a7..8d868f3a3f3 100644
--- a/src/backend/utils/cache/lsyscache.c
+++ b/src/backend/utils/cache/lsyscache.c
@@ -17,6 +17,7 @@
 
 #include "access/hash.h"
 #include "access/htup_details.h"
+#include "access/nbtree.h"
 #include "bootstrap/bootstrap.h"
 #include "catalog/namespace.h"
 #include "catalog/pg_am.h"
@@ -40,6 +41,7 @@
 #include "catalog/pg_subscription.h"
 #include "catalog/pg_transform.h"
 #include "catalog/pg_type.h"
+#include "commands/defrem.h"
 #include "miscadmin.h"
 #include "nodes/makefuncs.h"
 #include "utils/array.h"
@@ -316,6 +318,65 @@ get_ordering_op_properties(Oid opno,
 	return result;
 }
 
+/*
+ * get_comparison_op_for_sort
+ *      Get the OID of a datatype-specific comparison operator
+ *      associated with a given equality operator.
+ *
+ * This is typically used in clauses like Var = Var, where both arguments
+ * are of the same type. We look up the corresponding BTORDER_PROC for
+ * the default B-tree opclass of the datatype.
+ *
+ * However, for special cases like array_eq and record_eq, a comparison
+ * operator may exist (btarraycmp, btrecordcmp), but sorting is only
+ * possible if all element or field types are themselves sortable.
+ * Rather than reimplement that logic here, we simply exclude such
+ * cases by checking for btarraycmp and btrecordcmp explicitly.
+ *
+ * Returns false if no suitable comparison operator is found.
+ */
+bool
+get_comparison_op_for_sort(Oid opno, Oid *cmpopno)
+{
+	bool		result = false;
+	HeapTuple   proctup;
+
+	proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(opno));
+	if (HeapTupleIsValid(proctup))
+	{
+		Form_pg_proc procform = (Form_pg_proc) GETSTRUCT(proctup);
+
+		/* Only consider binary operators where both arguments are of the same type. */
+		if (procform->pronargs == 2 &&
+			OidIsValid(procform->proargtypes.values[0]) &&
+			OidIsValid(procform->proargtypes.values[1]) &&
+			procform->proargtypes.values[0] == procform->proargtypes.values[1])
+		{
+			Oid         type_oid = procform->proargtypes.values[0];
+			Oid         opclass_oid = GetDefaultOpClass(type_oid, BTREE_AM_OID);
+
+			if (OidIsValid(opclass_oid))
+			{
+				Oid	opfamily_oid = get_opclass_family(opclass_oid);
+
+				*cmpopno = get_opfamily_proc(opfamily_oid, type_oid, type_oid, BTORDER_PROC);
+
+				/*
+ 				 * Skip array_eq and record_eq: their comparison functions exist,
+ 				 * but sorting is only possible if all elements or fields are sortable.
+ 				 */
+				if (OidIsValid(*cmpopno) &&
+					*cmpopno != F_BTARRAYCMP &&
+					*cmpopno != F_BTRECORDCMP)
+					result = true;
+			}
+		}
+		ReleaseSysCache(proctup);
+	}
+
+	return result;
+}
+
 /*
  * get_equality_op_for_ordering_op
  *		Get the OID of the datatype-specific equality operator
diff --git a/src/include/utils/lsyscache.h b/src/include/utils/lsyscache.h
index c65cee4f24c..7e1188c04dd 100644
--- a/src/include/utils/lsyscache.h
+++ b/src/include/utils/lsyscache.h
@@ -80,6 +80,7 @@ extern Oid	get_opfamily_member_for_cmptype(Oid opfamily, Oid lefttype, Oid right
 extern bool get_ordering_op_properties(Oid opno,
 									   Oid *opfamily, Oid *opcintype, CompareType *cmptype);
 extern Oid	get_equality_op_for_ordering_op(Oid opno, bool *reverse);
+extern bool get_comparison_op_for_sort(Oid opno, Oid *cmpopno);
 extern Oid	get_ordering_op_for_equality_op(Oid opno, bool use_lhs_type);
 extern List *get_mergejoin_opfamilies(Oid opno);
 extern bool get_compatible_hash_operators(Oid opno,
diff --git a/src/include/utils/selfuncs.h b/src/include/utils/selfuncs.h
index fb4fa53363d..eb42f0df930 100644
--- a/src/include/utils/selfuncs.h
+++ b/src/include/utils/selfuncs.h
@@ -138,6 +138,14 @@ typedef struct
 	double		num_sa_scans;	/* # indexscans from ScalarArrayOpExprs */
 } GenericCosts;
 
+/* Represents an MCV statistic entry */
+typedef struct McvItem
+{
+	Datum       value;
+	int         original_idx;	/* The original index of the item in the array before sorting. */
+	double      frequency;		/* Frequency of value in statistics */
+} McvItem;
+
 /* Hooks for plugins to get control when we ask for stats */
 typedef bool (*get_relation_stats_hook_type) (PlannerInfo *root,
 											  RangeTblEntry *rte,
-- 
2.34.1

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ilia Evdokimov (#3)
Re: Use merge-based matching for MCVs in eqjoinsel

Ilia Evdokimov <ilya.evdokimov@tantorlabs.com> writes:

I’ve attached v3 of the patch. This version adds a check for NULL values
when comparing MCV entries, ensuring correctness in edge cases.

Um ... what edge cases would those be? We do not put NULL into
MCV arrays.

regards, tom lane

#5Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: Tom Lane (#4)
Re: Use merge-based matching for MCVs in eqjoinsel

On 03.09.2025 23:26, Tom Lane wrote:

Ilia Evdokimov <ilya.evdokimov@tantorlabs.com> writes:

I’ve attached v3 of the patch. This version adds a check for NULL values
when comparing MCV entries, ensuring correctness in edge cases.

Um ... what edge cases would those be? We do not put NULL into
MCV arrays.

You're right - MCV arrays never contain NULLs. However, comparing two
MCV values could theoretically return NULL, even though this is very
unlikely. This check existed even before my changes, and similar checks
are used in other selectivity-estimation functions in 'selfuncs.c'.

...
fcinfo->isnull = false;
fresult = FunctionCallInvoke(fcinfo);
if (!fcinfo->isnull && DatumGetBool(fresult))
...

By "edge cases" I was referring to this situation; I probably did not
choose the best wording.

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com

#6David Geier
geidav.pg@gmail.com
In reply to: Ilia Evdokimov (#2)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi Ilia!

On 29.07.2025 16:07, Ilia Evdokimov wrote:

On 21.07.2025 16:55, Ilia Evdokimov wrote:

While analyzing planner performance on JOB with
default_statistics_target = 1000, I noticed that a significant portion
of planning time is spent inside the eqjoinsel() function. According
to perf, in most JOB queries at default_statistics_target = 1000,
eqjoinsel() is the most expensive function during planning, accounting
for approximately 8% of total CPU time. At default_statistics_target =
10000, the planner spend up to 75% of its time inside eqjoinsel(),
making it one of the primary bottlenecks.

This overhead is caused by the O(N^2) nested-loop comparison of MCVs
in var1 = var2 clauses.

Thanks for working on this. I've wanted to submit a patch for the very
same issue for a while. I've come across this issue multiple times in
the field.

I propose an optimization: when the column datatype supports
ordering(i.e., has < and >), we can sort both MCV lists and apply
mege-style algorithm to detect matches. This reduces runtime from
O(N^2) to O(NlogN), where N is the number of MCV entries. The patch
also applies the same optimization to semi-join clauses, which show
similar performance behavior.

Why do you sort both lists and then merge instead of putting the smaller
list into a hash map and then doing hash lookups (if the type is hashable)?

There are more problems like this in the planner. For example col IN
(many values) is also quadratic because for every value in the IN list
all MCVs are checked. It would be great to fix this as well.

--
David Geier

#7David Geier
geidav.pg@gmail.com
In reply to: Ilia Evdokimov (#3)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi!

On 03.09.2025 18:53, Ilia Evdokimov wrote:

Following up on my previous messages about optimizing eqjoinsel() and
eqjoinsel_semi() for Var1 = Var2 clauses, I’d like to share detailed
profiling results showing the effect of the patch on JOB for different
values of default_statistics_target.

The first table shows the total planner time (summed over all 113
queries) before and after applying the patch, along with the speedup
achieved:

default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------+---------------------+---------------------
+--------------------
100  | *1.00x*       | 1828.433     |        1820.556
1000  | *1.12x*       | 2194.282     |        1963.110
2500  | *2.15x*       | 4606.705     |        2140.126
5000  | *6.37x*       | 16661.581     |

2616.109

7500 | *11.76x* | 35988.569 |
3061.161
10000 | *19.01x* | 66616.620 |
3504.144

It looks to me like these results are with optimizations disabled?

Can you share the SQL script you used for testing?

--
David Geier

#8David Geier
geidav.pg@gmail.com
In reply to: David Geier (#6)
1 attachment(s)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi Ilia!

On 05.09.2025 16:03, David Geier wrote:

I propose an optimization: when the column datatype supports
ordering(i.e., has < and >), we can sort both MCV lists and apply
mege-style algorithm to detect matches. This reduces runtime from
O(N^2) to O(NlogN), where N is the number of MCV entries. The patch
also applies the same optimization to semi-join clauses, which show
similar performance behavior.

Why do you sort both lists and then merge instead of putting the smaller
list into a hash map and then doing hash lookups (if the type is hashable)?

I've tested your and my code with the following script:

CREATE TABLE foo(col TEXT);
CREATE TABLE bar(col TEXT);
SET default_statistics_target = 10000;

-- Generate MCV values. PostgreSQL doesn't store MCVs if the table has
-- only a single value or every value has exactly the same cardinality.
DO $$
BEGIN
FOR i IN 1..10000 LOOP
FOR j IN 1..least(i, 50) LOOP
INSERT INTO foo VALUES ('aaaaaaaaaaaaaaaaaaaa' || i::TEXT);
INSERT INTO bar VALUES ('aaaaaaaaaaaaaaaaaaaa' || (i + 100000)::TEXT);
END LOOP;
END LOOP;
END;
$$;

ANALYZE foo, bar;
\timing on
EXPLAIN SELECT * FROM foo f, bar b WHERE f.col = b.col;

Results are:

- master: 433 ms
- Order+Merge: 11 ms
- Hash map: 4 ms

I've attached my draft patch.

--
David Geier

Attachments:

0001-Optimize-eqoinsel_inner-with-hash-table.patchtext/x-patch; charset=UTF-8; name=0001-Optimize-eqoinsel_inner-with-hash-table.patchDownload
From 7e2cf9602511ada0284503eb929e202ce0d7d354 Mon Sep 17 00:00:00 2001
From: David Geier <geidav.pg@gmail.com>
Date: Mon, 8 Sep 2025 12:06:44 +0200
Subject: [PATCH] Optimize eqoinsel_inner with hash table

---
 src/backend/utils/adt/selfuncs.c | 180 +++++++++++++++++++++++++++----
 1 file changed, 159 insertions(+), 21 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 1c480cfaaf7..c171d70eb47 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -143,6 +143,8 @@
 
 #define DEFAULT_PAGE_CPU_MULTIPLIER 50.0
 
+struct McvHashTable_hash;
+
 /* Hooks for plugins to get control when we ask for stats */
 get_relation_stats_hook_type get_relation_stats_hook = NULL;
 get_index_stats_hook_type get_index_stats_hook = NULL;
@@ -217,7 +219,9 @@ static bool get_actual_variable_endpoint(Relation heapRel,
 static RelOptInfo *find_join_input_rel(PlannerInfo *root, Relids relids);
 static double btcost_correlation(IndexOptInfo *index,
 								 VariableStatData *vardata);
-
+static uint32 hash_msv(struct McvHashTable_hash *hashTable, Datum key);
+static bool are_mcvs_equal(struct McvHashTable_hash *hashTable, Datum value1, Datum value2);
+static Oid get_hash_func_oid(Oid operatorOid);
 
 /*
  *		eqsel			- Selectivity of "=" for any data types.
@@ -2269,6 +2273,132 @@ rowcomparesel(PlannerInfo *root,
 	return s1;
 }
 
+typedef struct McvHashEntry
+{
+	Datum  value;
+	uint32 index;
+	uint32 hash;
+	char   status; // NOLINT
+} McvHashEntry;
+
+typedef struct McvHashContext
+{
+	FmgrInfo equal_proc;
+	FmgrInfo hash_proc;
+	Oid      collation;
+} McvHashContext;
+
+#define SH_PREFIX                  McvHashTable
+#define SH_ELEMENT_TYPE            McvHashEntry
+#define SH_KEY_TYPE                Datum
+#define SH_KEY                     value
+#define SH_HASH_KEY(mcvs, key)     hash_msv(mcvs, key)
+#define SH_EQUAL(mcvs, key0, key1) are_mcvs_equal(mcvs, key0, key1)
+#define SH_SCOPE                   static inline
+#define SH_STORE_HASH
+#define SH_GET_HASH(mcvs, key)     key->hash
+#define SH_DEFINE
+#define SH_DECLARE
+#include "lib/simplehash.h"
+  
+static uint32
+hash_msv(struct McvHashTable_hash *hashTable, Datum key)
+{	
+	McvHashContext *context = (McvHashContext *)hashTable->private_data;
+	return DatumGetUInt32(FunctionCall1Coll(&context->hash_proc, context->collation, key));
+}
+
+static bool
+are_mcvs_equal(struct McvHashTable_hash *hashTable, Datum value1, Datum value2)
+{
+	
+	/*
+	 * We can safely use FunctionCall2Coll() which requires the result to never be NULL,
+     * because MCV arrays from 'pg_statistic' don't contain 'NULL' values
+	 */
+	McvHashContext *context = (McvHashContext *)hashTable->private_data;
+	return DatumGetBool(FunctionCall2Coll(&context->equal_proc, context->collation, value1, value2));
+}
+
+static Oid
+get_hash_func_oid(Oid operatorOid)
+{
+	Oid hashLeft  = InvalidOid;
+	Oid hashRight = InvalidOid;
+	get_op_hash_functions(operatorOid, &hashLeft, &hashRight);
+	return OidIsValid(hashLeft) && hashLeft == hashRight ? hashLeft : InvalidOid;
+}
+  
+/*
+ * eqjoinsel_inner_with_hashtable
+ *
+ * Optimizes inner equality join selectivity estimation by using an O(n) algorithm based on hashing.
+ * Returns whether or not all prerequisites are met and the operation was successful.
+ * The result is used to know if to fallback to the default implementation.
+ */
+static bool
+eqjoinsel_inner_with_hashtable(Oid operatorOid, Oid collation,
+								AttStatsSlot *statsSlot1, AttStatsSlot *statsSlot2,
+								FunctionCallInfo equalFunctionCallInfo,
+								/* Output parameters: */
+								double *matchProductFrequencies, int *nMatches, bool *hasMatch1, bool *hasMatch2)
+{
+	Oid hashFuncOid;
+	AttStatsSlot *statsInner = statsSlot2;
+	AttStatsSlot *statsOuter = statsSlot1;
+	bool *hasMatchInner = hasMatch2;
+	bool *hasMatchOuter = hasMatch1;
+	struct McvHashContext hashContext;
+	McvHashTable_hash *hashTable;
+
+	if (Min(statsSlot1->nvalues, statsSlot2->nvalues) == 1)
+		return false;
+
+	hashFuncOid = get_hash_func_oid(operatorOid);
+	if (!OidIsValid(hashFuncOid))
+		return false;
+
+	/* Make sure we build the hash table on the smaller array. */
+	if (statsSlot1->nvalues < statsSlot2->nvalues)
+	{
+		statsInner    = statsSlot1;
+		statsOuter    = statsSlot2;
+		hasMatchInner = hasMatch1;
+		hasMatchOuter = hasMatch2;
+	}
+
+	/* 1. Create hash table of smaller 'pg_statistic' array. That's O(n). */
+	fmgr_info(get_opcode(operatorOid), &hashContext.equal_proc);
+	fmgr_info(hashFuncOid, &hashContext.hash_proc);
+	hashContext.collation = collation;
+
+	hashTable = McvHashTable_create(CurrentMemoryContext, statsInner->nvalues, &hashContext);
+
+	for (int i = 0; i < statsInner->nvalues; i++)
+	{
+		bool found = false;
+		McvHashEntry *entry = McvHashTable_insert(hashTable, statsInner->values[i], &found);
+		Assert(!found);
+		entry->index = i;
+	}
+
+	/* 2. Look-up values from other 'pg_statistic' array against hash map to find matches. */
+	for (int i = 0; i < statsOuter->nvalues; i++)
+	{
+		McvHashEntry *entry = McvHashTable_lookup(hashTable, statsOuter->values[i]);
+		if (entry != NULL)
+		{
+			hasMatchInner[entry->index] = true;
+			hasMatchOuter[i]            = true;
+			*matchProductFrequencies += statsInner->numbers[entry->index] * statsOuter->numbers[i];
+			(*nMatches)++;
+		}
+	}
+
+	McvHashTable_destroy(hashTable);
+	return true;
+}
+
 /*
  *		eqjoinsel		- Join selectivity of "="
  */
@@ -2350,7 +2480,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 	}
 
 	/* We need to compute the inner-join selectivity in all cases */
-	selec_inner = eqjoinsel_inner(opfuncoid, collation,
+	selec_inner = eqjoinsel_inner(operator, collation,
 								  &vardata1, &vardata2,
 								  nd1, nd2,
 								  isdefault1, isdefault2,
@@ -2438,7 +2568,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
  * that it's worth trying to distinguish them here.
  */
 static double
-eqjoinsel_inner(Oid opfuncoid, Oid collation,
+eqjoinsel_inner(Oid operator, Oid collation,
 				VariableStatData *vardata1, VariableStatData *vardata2,
 				double nd1, double nd2,
 				bool isdefault1, bool isdefault2,
@@ -2480,7 +2610,7 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		int			i,
 					nmatches;
 
-		fmgr_info(opfuncoid, &eqproc);
+		fmgr_info(get_opcode(operator), &eqproc);
 
 		/*
 		 * Save a few cycles by setting up the fcinfo struct just once. Using
@@ -2504,30 +2634,38 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		 */
 		matchprodfreq = 0.0;
 		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
-		{
-			int			j;
 
-			fcinfo->args[0].value = sslot1->values[i];
-
-			for (j = 0; j < sslot2->nvalues; j++)
+		if (!eqjoinsel_inner_with_hashtable(operator, collation, sslot1, sslot2,
+												 fcinfo, &matchprodfreq, &nmatches,
+												 hasmatch1, hasmatch2))
+		{
+			/* Fallback to O(N^2) algorithm if hash based variant didn't succeed. */
+			for (i = 0; i < sslot1->nvalues; i++)
 			{
-				Datum		fresult;
+				int			j;
 
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
+				fcinfo->args[0].value = sslot1->values[i];
+
+				for (j = 0; j < sslot2->nvalues; j++)
 				{
-					hasmatch1[i] = hasmatch2[j] = true;
-					matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
-					nmatches++;
-					break;
+					Datum		fresult;
+
+					if (hasmatch2[j])
+						continue;
+					fcinfo->args[1].value = sslot2->values[j];
+					fcinfo->isnull = false;
+					fresult = FunctionCallInvoke(fcinfo);
+					if (!fcinfo->isnull && DatumGetBool(fresult))
+					{
+						hasmatch1[i] = hasmatch2[j] = true;
+						matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
+						nmatches++;
+						break;
+					}
 				}
 			}
 		}
+
 		CLAMP_PROBABILITY(matchprodfreq);
 		/* Sum up frequencies of matched and unmatched MCVs */
 		matchfreq1 = unmatchfreq1 = 0.0;
-- 
2.43.0

#9Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: David Geier (#8)
1 attachment(s)
Re: Use merge-based matching for MCVs in eqjoinsel

On 08.09.2025 13:08, David Geier wrote:

Hi Ilia!

On 05.09.2025 16:03, David Geier wrote:

I propose an optimization: when the column datatype supports
ordering(i.e., has < and >), we can sort both MCV lists and apply
mege-style algorithm to detect matches. This reduces runtime from
O(N^2) to O(NlogN), where N is the number of MCV entries. The patch
also applies the same optimization to semi-join clauses, which show
similar performance behavior.

Why do you sort both lists and then merge instead of putting the smaller
list into a hash map and then doing hash lookups (if the type is hashable)?

I've tested your and my code with the following script:

CREATE TABLE foo(col TEXT);
CREATE TABLE bar(col TEXT);
SET default_statistics_target = 10000;

-- Generate MCV values. PostgreSQL doesn't store MCVs if the table has
-- only a single value or every value has exactly the same cardinality.
DO $$
BEGIN
FOR i IN 1..10000 LOOP
FOR j IN 1..least(i, 50) LOOP
INSERT INTO foo VALUES ('aaaaaaaaaaaaaaaaaaaa' || i::TEXT);
INSERT INTO bar VALUES ('aaaaaaaaaaaaaaaaaaaa' || (i + 100000)::TEXT);
END LOOP;
END LOOP;
END;
$$;

ANALYZE foo, bar;
\timing on
EXPLAIN SELECT * FROM foo f, bar b WHERE f.col = b.col;

Results are:

- master: 433 ms
- Order+Merge: 11 ms
- Hash map: 4 ms

I've attached my draft patch.

--
David Geier

Hi David,

Thank you for reviewing.

I have read all the previous messages - and yes, you are right. I don’t
know why I didn’t consider using a hash table approach initially. Your
idea makes a lot of sense.

To evaluate it, I ran benchmarks on JOB with three variants:

$ ./benchmark.sh master
$ ./benchmark.sh merge
$ ./benchmark.sh hash

I compared total planning time across all 113 queries.

$ python3 planning_time.py master hash
default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------------------------------------------------------------
100                       | 1.00                | 1892.627            |
1886.969
1000                      | 1.09                | 2286.922            |
2100.099
2500                      | 1.94                | 4647.167            |
2400.711
5000                      | 6.15                | 17964.779           |
2919.914
7500                      | 10.58               | 38622.443           |
3650.375
10000                     | 16.33               | 69538.085           |
4257.864

$ python3 planning_time.py master merge
default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------------------------------------------------------------
100                       | 1.00                | 1892.627            |
1898.622
1000                      | 1.12                | 2286.922            |
2033.553
2500                      | 1.92                | 4647.167            |
2423.552
5000                      | 5.94                | 17964.779           |
3025.739
7500                      | 10.48               | 38622.443           |
3684.262
10000                     | 16.72               | 69538.085           |
4159.418

Based on these results, I’d prefer the hash lookup implementation, so I
think it makes sense to improve your patch further and bring it into
good shape. Shall I take care of that, or would you prefer to do it
yourself?

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com

Attachments:

benchmark.zipapplication/zip; name=benchmark.zipDownload
#10Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: Ilia Evdokimov (#9)
Re: Use merge-based matching for MCVs in eqjoinsel

On 08.09.2025 13:35, Ilia Evdokimov wrote:

Based on these results, I’d prefer the hash lookup implementation, so
I think it makes sense to improve your patch further and bring it into
good shape. Shall I take care of that, or would you prefer to do it
yourself?

I realized I mistakenly copied the wrong results for the hash-map
version in my previous draft. Sorry about that. Here are the correct
benchmark results:

Merge

default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------------------------------------------------------------
100                       | 1.00                | 1892.627            |
1898.622
1000                      | 1.12                | 2286.922            |
2033.553
2500                      | 1.92                | 4647.167            |
2423.552
5000                      | 5.94                | 17964.779           |
3025.739
7500                      | 10.48               | 38622.443           |
3684.262
10000                     | 16.72               | 69538.085           |
4159.418

Hash-Map

default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------------------------------------------------------------
100                       | 1.00                | 1892.627            |
1886.969
1000                      | 1.09                | 2286.922            |
2100.099
2500                      | 1.94                | 4647.167            |
2400.711
5000                      | 6.15                | 17964.779           |
2919.914
7500                      | 10.58               | 38622.443           |
3650.375
10000                     | 16.33               | 69538.085           |
4257.864

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com

#11David Geier
geidav.pg@gmail.com
In reply to: Ilia Evdokimov (#9)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi Ilia!

I have read all the previous messages - and yes, you are right. I don’t
know why I didn’t consider using a hash table approach initially. Your
idea makes a lot of sense.

Your solution would be beneficial on top, for cases where the data type
is not hashable. But I think that's overkill for a v1. I would start
with the hash-based version.

To evaluate it, I ran benchmarks on JOB with three variants:

$ ./benchmark.sh master
$ ./benchmark.sh merge
$ ./benchmark.sh hash

I compared total planning time across all 113 queries.

Was this running with optimizations? How did you extract the planning time?

$ python3 planning_time.py master hash
default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------------------------------------------------------------
100                       | 1.00                | 1892.627            |
1886.969
1000                      | 1.09                | 2286.922            |
2100.099
2500                      | 1.94                | 4647.167            |
2400.711
5000                      | 6.15                | 17964.779           |
2919.914
7500                      | 10.58               | 38622.443           |
3650.375
10000                     | 16.33               | 69538.085           |
4257.864

$ python3 planning_time.py master merge
default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------------------------------------------------------------
100                       | 1.00                | 1892.627            |
1898.622
1000                      | 1.12                | 2286.922            |
2033.553
2500                      | 1.92                | 4647.167            |
2423.552
5000                      | 5.94                | 17964.779           |
3025.739
7500                      | 10.48               | 38622.443           |
3684.262
10000                     | 16.72               | 69538.085           |
4159.418

I would have expected the delta between the "merge" and "hash" variant
to be bigger, especially for default_statistics_target=10000. My small
test also showed that. Any idea why this is not showing in your results?

Based on these results, I’d prefer the hash lookup implementation, so I
think it makes sense to improve your patch further and bring it into
good shape. Shall I take care of that, or would you prefer to do it
yourself?

I think process-wise it's best if you review my code and I do the changes.

Could you as part of your review test tables with just a few MCVs to
make sure we're not regressing "small" cases? For now I'm only bailing
if one of the two MCV lists has just a single value. I'm expecting the
gains from fine tuning this value to be not measurable but let's double
check.

--
David Geier

#12David Geier
geidav.pg@gmail.com
In reply to: Ilia Evdokimov (#10)
Re: Use merge-based matching for MCVs in eqjoinsel

On 08.09.2025 12:45, Ilia Evdokimov wrote:

I realized I mistakenly copied the wrong results for the hash-map
version in my previous draft. Sorry about that. Here are the correct
benchmark results:

Merge

default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------------------------------------------------------------
100                       | 1.00                | 1892.627            |
1898.622
1000                      | 1.12                | 2286.922            |
2033.553
2500                      | 1.92                | 4647.167            |
2423.552
5000                      | 5.94                | 17964.779           |
3025.739
7500                      | 10.48               | 38622.443           |
3684.262
10000                     | 16.72               | 69538.085           |
4159.418

Hash-Map

default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------------------------------------------------------------
100                       | 1.00                | 1892.627            |
1886.969
1000                      | 1.09                | 2286.922            |
2100.099
2500                      | 1.94                | 4647.167            |
2400.711
5000                      | 6.15                | 17964.779           |
2919.914
7500                      | 10.58               | 38622.443           |
3650.375
10000                     | 16.33               | 69538.085           |
4257.864

It still seems to me like something is fishy with the numbers or
something in the benchmark adds a lot over overhead so that small
differences in eqjoinsel_inner() don't show here.

The delta between "hash" and "merge" for default_statistics_target=10000
should be the biggest but it's actually slower.

--
David Geier

#13Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: David Geier (#11)
Re: Use merge-based matching for MCVs in eqjoinsel

On 08.09.2025 13:56, David Geier wrote:

To evaluate it, I ran benchmarks on JOB with three variants:

$ ./benchmark.sh master
$ ./benchmark.sh merge
$ ./benchmark.sh hash

I compared total planning time across all 113 queries.

Was this running with optimizations? How did you extract the planning time?

I save all query plans using EXPLAIN SUMMARY, then go through all the
plans, read the 'Planning Time' for each, and sum them up.

I would have expected the delta between the "merge" and "hash" variant
to be bigger, especially for default_statistics_target=10000. My small
test also showed that. Any idea why this is not showing in your results?

So would I. With default_statistics_target = 10000 and the selectivity
in the JOB queries being close to zero, the difference should be
noticeable. I can only explain the previous results by cache-related
effects on my machine.

I reran the benchmark on a clean cluster and collected the top slowest
JOB queries — now the effect is clearly visible.

Merge (sum of all JOB queries)
==================
default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------------------------------------------------------------
100                       | *1.00*                | 1888.105           
| 1879.431
1000                      | *1.14*                | 2282.239           
| 2009.114
2500                      | *2.10*                | 5595.030           
| 2668.530
5000                      | *5.56*                | 18544.933          
| 3333.252
7500                      | *9.17*                | 37390.956          
| 4076.390
10000                     | *16.10*               | 69319.479          
| 4306.417

HashMap (sum of all JOB queries)
==================
default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------------------------------------------------------------
100                     | *1.03*                | 1888.105            |
1828.088
1000                    | *1.18*                | 2282.239            |
1939.884
2500                    | *2.64*                | 5595.030            |
2117.872
5000                    | *7.80*                | 18544.933           |
2377.206
7500                    | *13.80*               | 37390.956           |
2709.973
10000                   | *23.32*               | 69319.479           |
2973.073

Top 10 slowest JOB queries (default_statistics_target = 10000)
Query | master (ms) | merge (ms) | Hash (ms)
------+-------------+------------+-----------
29c   | 1904.586    | 144.135    | 100.473
29b   | 1881.392    | 117.891    | 89.028
29a   | 1868.805    | 112.242    | 83.913
31c   | 1867.234    | 76.498     | 56.140
30c   | 1646.630    | 88.494     | 62.549
30b   | 1608.820    | 84.821     | 64.603
31a   | 1573.964    | 75.978     | 56.140
28a   | 1457.738    | 95.939     | 77.309
28b   | 1455.052    | 99.383     | 73.065
30a   | 1416.699    | 91.057     | 62.549

BTW, the hashmap from your patch could also be applied to
eqjoinsel_semi() function.

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com

#14David Geier
geidav.pg@gmail.com
In reply to: Ilia Evdokimov (#13)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi!

On 08.09.2025 15:45, Ilia Evdokimov wrote:

I reran the benchmark on a clean cluster and collected the top slowest
JOB queries — now the effect is clearly visible.

Merge (sum of all JOB queries)
==================
default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------------------------------------------------------------
100                       | *1.00*                | 1888.105           
| 1879.431
1000                      | *1.14*                | 2282.239           
| 2009.114
2500                      | *2.10*                | 5595.030           
| 2668.530
5000                      | *5.56*                | 18544.933          
| 3333.252
7500                      | *9.17*                | 37390.956          
| 4076.390
10000                     | *16.10*               | 69319.479          
| 4306.417

HashMap (sum of all JOB queries)
==================
default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------------------------------------------------------------
100                     | *1.03*                | 1888.105            |
1828.088
1000                    | *1.18*                | 2282.239            |
1939.884
2500                    | *2.64*                | 5595.030            |
2117.872
5000                    | *7.80*                | 18544.933           |
2377.206
7500                    | *13.80*               | 37390.956           |
2709.973
10000                   | *23.32*               | 69319.479           |
2973.073

Top 10 slowest JOB queries (default_statistics_target = 10000)
Query | master (ms) | merge (ms) | Hash (ms)
------+-------------+------------+-----------
29c   | 1904.586    | 144.135    | 100.473
29b   | 1881.392    | 117.891    | 89.028
29a   | 1868.805    | 112.242    | 83.913
31c   | 1867.234    | 76.498     | 56.140
30c   | 1646.630    | 88.494     | 62.549
30b   | 1608.820    | 84.821     | 64.603
31a   | 1573.964    | 75.978     | 56.140
28a   | 1457.738    | 95.939     | 77.309
28b   | 1455.052    | 99.383     | 73.065
30a   | 1416.699    | 91.057     | 62.549

This looks much better. Very nice!

BTW, the hashmap from your patch could also be applied to
eqjoinsel_semi() function.

Yep. The inner loop only runs until clamped_nvalues2 and it doesn't
compute matchprodfreq. I'll try to modify the patch such that it
accounts for these differences without being too hard to read.

Do you think anything else needs changes in the patch? Did you have a
chance to check tables with just few MCVs or are there any queries in
the JOB which regress with very small default_statistics_target?

--
David Geier

#15Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: David Geier (#14)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi David,

On 08.09.2025 17:36, David Geier wrote:

Do you think anything else needs changes in the patch?

From an architectural perspective, I think the patch is already in good
shape. However, I have some suggestions regarding code style:

1. I would move McvHashEntry, McvHashContext, he new hash table
definition, hash_mcv and are_mcvs_equal to the top.
2. I’m not sure get_hash_func_oid() is needed at all – it seems we
could do without it.
3. It would be better to name the parameters matchProductFrequencies ->
matchprodfreq, nMatches -> nmatches, hasMatch1 -> hasmatch1,
hasMatch2 -> hasmatch2 in eqjoinsel_inner_with_hashtable().
4. As I wrote earlier, since we now have a dedicated function
eqjoinsel_inner_with_hashtable(), perhaps it could be used in both
eqjoinsel_inner() and eqjoinsel_semi(). And since the hash-based
search was factored out, maybe it would make sense to also factor
out the O(N^2) nested loop implementation?
5. I think it would be helpful to add a comment explaining that using a
hash table is not efficient when the MCV array length equals 1:

if (Min(statsSlot1->nvalues, statsSlot2->nvalues) == 1)
    return false;

Did you have a
chance to check tables with just few MCVs or are there any queries in
the JOB which regress with very small default_statistics_target?

Sure. I need some time to check this.

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com

#16David Geier
geidav.pg@gmail.com
In reply to: Ilia Evdokimov (#15)
1 attachment(s)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi!

Thanks for the review.

On 09.09.2025 09:29, Ilia Evdokimov wrote:

From an architectural perspective, I think the patch is already in good
shape. However, I have some suggestions regarding code style:

1. I would move McvHashEntry, McvHashContext, he new hash table
   definition, hash_mcv and are_mcvs_equal to the top.

Done. I've also moved up try_eqjoinsel_with_hashtable().

2. I’m not sure get_hash_func_oid() is needed at all – it seems we
   could do without it.

Removed.

3. It would be better to name the parameters matchProductFrequencies ->
   matchprodfreq, nMatches -> nmatches, hasMatch1 -> hasmatch1,
   hasMatch2 -> hasmatch2 in eqjoinsel_inner_with_hashtable().

Done.

4. As I wrote earlier, since we now have a dedicated function
   eqjoinsel_inner_with_hashtable(), perhaps it could be used in both
   eqjoinsel_inner() and eqjoinsel_semi(). And since the hash-based

Done.

The gains for SEMI join are even bigger because the function is called 3
times for e.g. EXPLAIN SELECT * FROM foo f WHERE EXISTS (SELECT 1 FROM
bar b where f.col = b.col); For that query the planning time for me goes
from ~1300 ms -> 12 ms.

   search was factored out, maybe it would make sense to also factor
   out the O(N^2) nested loop implementation?

Generally agreed and while tempting, I've refrained from doing the
refactoring. Let's better do this in a separate patch to keep things simple.

5. I think it would be helpful to add a comment explaining that using a
   hash table is not efficient when the MCV array length equals 1:

if (Min(statsSlot1->nvalues, statsSlot2->nvalues) == 1)
    return false;

Done.

Did you have a
chance to check tables with just few MCVs or are there any queries in
the JOB which regress with very small default_statistics_target?

Sure. I need some time to check this.

Could you please do that with the latest attached patch so that we test
it once more?

Could you also run once more the JOB benchmark to get some test coverage
on the SEMI join code (assuming it also uses SEMI joins)?

Once we've concluded on above and there are no objections, I will
register this patch in the commit fest.

--
David Geier

Attachments:

0002-Optimize-eqjoinsel_inner-and-eqjoinsel_semi.patchtext/x-patch; charset=UTF-8; name=0002-Optimize-eqjoinsel_inner-and-eqjoinsel_semi.patchDownload
From a66444d7e0f59ecc9a9112671a24391344bb5eec Mon Sep 17 00:00:00 2001
From: David Geier <geidav.pg@gmail.com>
Date: Mon, 8 Sep 2025 12:06:44 +0200
Subject: [PATCH] Optimize eqjoinsel_inner() and eqjoinsel_semi()

Previously an O(N^2) algorithm was used to look for matching MCV
values between two tables. Significantly increasing
default_statistics_target could result in planning taking seconds.

The O(N^2) algorithm got replaced with an O(N) algorithm which is
based on a hash table. If the column type is not hashable, we
fallback to the O(N^2) algorithm. As follow-on work, We can add a
second fast path based on sorting and merging for types that are
not hashable.
---
 src/backend/utils/adt/selfuncs.c | 230 +++++++++++++++++++++++++------
 1 file changed, 190 insertions(+), 40 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 1c480cfaaf7..8837cda0016 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -143,6 +143,8 @@
 
 #define DEFAULT_PAGE_CPU_MULTIPLIER 50.0
 
+struct McvHashTable_hash;
+
 /* Hooks for plugins to get control when we ask for stats */
 get_relation_stats_hook_type get_relation_stats_hook = NULL;
 get_index_stats_hook_type get_index_stats_hook = NULL;
@@ -217,7 +219,139 @@ static bool get_actual_variable_endpoint(Relation heapRel,
 static RelOptInfo *find_join_input_rel(PlannerInfo *root, Relids relids);
 static double btcost_correlation(IndexOptInfo *index,
 								 VariableStatData *vardata);
+static uint32 hash_msv(struct McvHashTable_hash *hashTable, Datum key);
+static bool are_mcvs_equal(struct McvHashTable_hash *hashTable, Datum value1, Datum value2);
+
+typedef struct McvHashEntry
+{
+	Datum  value;
+	uint32 index;
+	uint32 hash;
+	char   status;
+} McvHashEntry;
 
+typedef struct McvHashContext
+{
+	FmgrInfo equal_proc;
+	FmgrInfo hash_proc;
+	Oid      collation;
+} McvHashContext;
+
+#define SH_PREFIX                  McvHashTable
+#define SH_ELEMENT_TYPE            McvHashEntry
+#define SH_KEY_TYPE                Datum
+#define SH_KEY                     value
+#define SH_HASH_KEY(mcvs, key)     hash_msv(mcvs, key)
+#define SH_EQUAL(mcvs, key0, key1) are_mcvs_equal(mcvs, key0, key1)
+#define SH_SCOPE                   static inline
+#define SH_STORE_HASH
+#define SH_GET_HASH(mcvs, key)     key->hash
+#define SH_DEFINE
+#define SH_DECLARE
+#include "lib/simplehash.h"
+
+static uint32
+hash_msv(struct McvHashTable_hash *hashTable, Datum key)
+{	
+	McvHashContext *context = (McvHashContext *)hashTable->private_data;
+	return DatumGetUInt32(FunctionCall1Coll(&context->hash_proc, context->collation, key));
+}
+
+static bool
+are_mcvs_equal(struct McvHashTable_hash *hashTable, Datum value1, Datum value2)
+{
+	/*
+	 * We can safely use FunctionCall2Coll() which requires the result to
+	 * never be NULL, because MCV arrays from 'pg_statistic' don't contain
+	 * NULL values
+	 */
+	McvHashContext *context = (McvHashContext *)hashTable->private_data;
+	return DatumGetBool(FunctionCall2Coll(&context->equal_proc, context->collation, value1, value2));
+}
+  
+/*
+ * eqjoinsel_inner_with_hashtable
+ *
+ * Optimizes inner equality join selectivity estimation by using an O(n)
+ * algorithm based on hashing. Returns whether or not all prerequisites are
+ * met and the operation was successful. The result is used to know if to
+ * fallback to the default implementation.
+ */
+static bool
+try_eqjoinsel_with_hashtable(Oid operatorOid, Oid collation,
+							AttStatsSlot *statsSlot1, AttStatsSlot *statsSlot2, int nvaluesSlot2,
+							FunctionCallInfo equalFunctionCallInfo,
+							/* Output parameters: */
+							double *matchprodfreq, int *nmatches, bool *hasmatch1, bool *hasmatch2)
+{
+	AttStatsSlot	*statsInner = statsSlot2;
+	AttStatsSlot	*statsOuter = statsSlot1;
+	bool			*hasMatchInner = hasmatch2;
+	bool			*hasMatchOuter = hasmatch1;
+	int				nvaluesInner = nvaluesSlot2;
+	int				nvaluesOuter = statsSlot1->nvalues;
+	McvHashContext	hashContext;
+	McvHashTable_hash *hashTable;
+	Oid 			hashLeft  = InvalidOid;
+	Oid 			hashRight = InvalidOid;
+
+	/*
+	 * If one MCV array contains only a single value, there's no gain in using a hash table.
+	 * The sweet spot of using hash table lookups instead of iterating is slightly higher
+	 * than 1 but we don't bother here because the gains are neglectable.
+	 */
+	if (Min(statsSlot1->nvalues, nvaluesSlot2) == 1)
+		return false;
+
+	get_op_hash_functions(operatorOid, &hashLeft, &hashRight);
+	if (!OidIsValid(hashLeft) || hashLeft != hashRight)
+		return false;
+
+	/* Make sure we build the hash table on the smaller array. */
+	if (nvaluesOuter < nvaluesInner)
+	{
+		statsInner = statsSlot1;
+		statsOuter = statsSlot2;
+		hasMatchInner = hasmatch1;
+		hasMatchOuter = hasmatch2;
+		nvaluesInner = statsSlot1->nvalues;
+		nvaluesOuter = nvaluesSlot2;
+	}
+
+	/* 1. Create hash table of smaller 'pg_statistic' array. That's O(n). */
+	fmgr_info(get_opcode(operatorOid), &hashContext.equal_proc);
+	fmgr_info(hashLeft, &hashContext.hash_proc); /* hashLeft == hashRight */
+	hashContext.collation = collation;
+
+	hashTable = McvHashTable_create(CurrentMemoryContext, nvaluesInner, &hashContext);
+
+	for (int i = 0; i < nvaluesInner; i++)
+	{
+		bool found = false;
+		McvHashEntry *entry = McvHashTable_insert(hashTable, statsInner->values[i], &found);
+		Assert(!found);
+		entry->index = i;
+	}
+
+	/* 2. Look-up values from other 'pg_statistic' array against hash map to find matches. */
+	for (int i = 0; i < nvaluesOuter; i++)
+	{
+		McvHashEntry *entry = McvHashTable_lookup(hashTable, statsOuter->values[i]);
+		if (entry != NULL)
+		{
+			hasMatchInner[entry->index] = true;
+			hasMatchOuter[i]            = true;
+			(*nmatches)++;
+
+			/* Conditional because not needed by SEMI join selectivity estimation */
+			if (matchprodfreq != NULL)
+				*matchprodfreq += statsInner->numbers[entry->index] * statsOuter->numbers[i];
+		}
+	}
+
+	McvHashTable_destroy(hashTable);
+	return true;
+}
 
 /*
  *		eqsel			- Selectivity of "=" for any data types.
@@ -2350,7 +2484,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 	}
 
 	/* We need to compute the inner-join selectivity in all cases */
-	selec_inner = eqjoinsel_inner(opfuncoid, collation,
+	selec_inner = eqjoinsel_inner(operator, collation,
 								  &vardata1, &vardata2,
 								  nd1, nd2,
 								  isdefault1, isdefault2,
@@ -2377,7 +2511,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 			inner_rel = find_join_input_rel(root, sjinfo->min_righthand);
 
 			if (!join_is_reversed)
-				selec = eqjoinsel_semi(opfuncoid, collation,
+				selec = eqjoinsel_semi(operator, collation,
 									   &vardata1, &vardata2,
 									   nd1, nd2,
 									   isdefault1, isdefault2,
@@ -2388,9 +2522,8 @@ eqjoinsel(PG_FUNCTION_ARGS)
 			else
 			{
 				Oid			commop = get_commutator(operator);
-				Oid			commopfuncoid = OidIsValid(commop) ? get_opcode(commop) : InvalidOid;
 
-				selec = eqjoinsel_semi(commopfuncoid, collation,
+				selec = eqjoinsel_semi(commop, collation,
 									   &vardata2, &vardata1,
 									   nd2, nd1,
 									   isdefault2, isdefault1,
@@ -2438,7 +2571,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
  * that it's worth trying to distinguish them here.
  */
 static double
-eqjoinsel_inner(Oid opfuncoid, Oid collation,
+eqjoinsel_inner(Oid operator, Oid collation,
 				VariableStatData *vardata1, VariableStatData *vardata2,
 				double nd1, double nd2,
 				bool isdefault1, bool isdefault2,
@@ -2480,7 +2613,7 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		int			i,
 					nmatches;
 
-		fmgr_info(opfuncoid, &eqproc);
+		fmgr_info(get_opcode(operator), &eqproc);
 
 		/*
 		 * Save a few cycles by setting up the fcinfo struct just once. Using
@@ -2504,30 +2637,38 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		 */
 		matchprodfreq = 0.0;
 		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
-		{
-			int			j;
 
-			fcinfo->args[0].value = sslot1->values[i];
-
-			for (j = 0; j < sslot2->nvalues; j++)
+		if (!try_eqjoinsel_with_hashtable(operator, collation, sslot1, sslot2, sslot2->nvalues,
+											fcinfo, &matchprodfreq, &nmatches,
+											hasmatch1, hasmatch2))
+		{
+			/* Fallback to O(N^2) algorithm if hash based variant didn't succeed. */
+			for (i = 0; i < sslot1->nvalues; i++)
 			{
-				Datum		fresult;
+				int			j;
 
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
+				fcinfo->args[0].value = sslot1->values[i];
+
+				for (j = 0; j < sslot2->nvalues; j++)
 				{
-					hasmatch1[i] = hasmatch2[j] = true;
-					matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
-					nmatches++;
-					break;
+					Datum		fresult;
+
+					if (hasmatch2[j])
+						continue;
+					fcinfo->args[1].value = sslot2->values[j];
+					fcinfo->isnull = false;
+					fresult = FunctionCallInvoke(fcinfo);
+					if (!fcinfo->isnull && DatumGetBool(fresult))
+					{
+						hasmatch1[i] = hasmatch2[j] = true;
+						matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
+						nmatches++;
+						break;
+					}
 				}
 			}
 		}
+
 		CLAMP_PROBABILITY(matchprodfreq);
 		/* Sum up frequencies of matched and unmatched MCVs */
 		matchfreq1 = unmatchfreq1 = 0.0;
@@ -2635,7 +2776,7 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
  * Unlike eqjoinsel_inner, we have to cope with opfuncoid being InvalidOid.
  */
 static double
-eqjoinsel_semi(Oid opfuncoid, Oid collation,
+eqjoinsel_semi(Oid operator, Oid collation,
 			   VariableStatData *vardata1, VariableStatData *vardata2,
 			   double nd1, double nd2,
 			   bool isdefault1, bool isdefault2,
@@ -2645,6 +2786,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 			   RelOptInfo *inner_rel)
 {
 	double		selec;
+	Oid			opfuncoid = get_opcode(operator);
 
 	/*
 	 * We clamp nd2 to be not more than what we estimate the inner relation's
@@ -2733,29 +2875,37 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 * and because the math wouldn't add up...
 		 */
 		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
-		{
-			int			j;
 
-			fcinfo->args[0].value = sslot1->values[i];
-
-			for (j = 0; j < clamped_nvalues2; j++)
+		if (!try_eqjoinsel_with_hashtable(operator, collation, sslot1, sslot2,
+										clamped_nvalues2, fcinfo, NULL,
+										&nmatches, hasmatch1, hasmatch2))
+		{
+			/* Fallback to O(N^2) algorithm if hash based variant didn't succeed. */
+			for (i = 0; i < sslot1->nvalues; i++)
 			{
-				Datum		fresult;
+				int			j;
 
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
+				fcinfo->args[0].value = sslot1->values[i];
+
+				for (j = 0; j < clamped_nvalues2; j++)
 				{
-					hasmatch1[i] = hasmatch2[j] = true;
-					nmatches++;
-					break;
+					Datum		fresult;
+
+					if (hasmatch2[j])
+						continue;
+					fcinfo->args[1].value = sslot2->values[j];
+					fcinfo->isnull = false;
+					fresult = FunctionCallInvoke(fcinfo);
+					if (!fcinfo->isnull && DatumGetBool(fresult))
+					{
+						hasmatch1[i] = hasmatch2[j] = true;
+						nmatches++;
+						break;
+					}
 				}
 			}
 		}
+
 		/* Sum up frequencies of matched MCVs */
 		matchfreq1 = 0.0;
 		for (i = 0; i < sslot1->nvalues; i++)
-- 
2.43.0

#17Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: David Geier (#16)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi!

On 09.09.2025 12:22, David Geier wrote:

Could you please do that with the latest attached patch so that we test
it once more?

LGTM. Yes, I'll test this patch.

Could you also run once more the JOB benchmark to get some test coverage
on the SEMI join code (assuming it also uses SEMI joins)?

Unfortunately, the JOB benchmark does not contain semi join nodes.
However, TPC-DS does. I'll look for the queries with slowest planner
times there and check them.

I'll need some time to check both join and semi join cases with small
and large default_statistics_target. I'll share the results later.

Once we've concluded on above and there are no objections, I will
register this patch in the commit fest.

Sure. No problem.

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com

#18Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: Ilia Evdokimov (#17)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi hackers,

On 10.09.2025 16:56, Ilia Evdokimov wrote:

Unfortunately, the JOB benchmark does not contain semi join nodes.
However, TPC-DS does. I'll look for the queries with slowest planner
times there and check them.

I'll need some time to check both join and semi join cases with small
and large default_statistics_target. I'll share the results later.

JOIN
==============================

I’ve benchmarked the new implementation of eqjoinsel() with different
values of default_statistics_target. On small targets (1, 5, 10, 25, 50,
75, 100) the results are all within statistical noise, and I did not
observe any regressions. In my view, it’s reasonable to keep the current
condition that the hash table is not used for default_statistics_target
= 1. Raising that threshold does not seem useful.

Here are the results for JOB queries (where the effect of semi join is
not visible due to different data distributions):

default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
------------------------------------------------------------------------------------------
1                         | 1.00                | 1846.643            |
1847.409
5                         | 1.00                | 1836.391            |
1828.318
10                        | 0.95                | 1841.750            |
1929.722
25                        | 0.99                | 1873.172            |
1890.741
50                        | 0.98                | 1869.897            |
1898.470
75                        | 1.02                | 1969.368            |
1929.521
100                       | 0.97                | 1857.890            |
1921.207
1000                      | 1.14                | 2279.700            |
1997.102
2500                      | 1.78                | 4682.658            |
2636.202
5000                      | 6.45                | 15943.696           |
2471.242
7500                      | 12.45               | 34350.855           |
2758.565
10000                     | 20.52               | 62519.342           |
3046.819

SEMI JOIN
==============================

Unfortunately, in TPC-DS it is not possible to clearly see improvements
for semi joins. To address this, I designed a synthetic example where
the data distribution forces the loop to run fully, without exiting
early, which makes the effect on semi joins more visible. In this setup,
I also ensured that the length of the MCV array is equal to the chosen
default_statistics_target.

CREATE TABLE t1 AS
SELECT CASE
         WHEN g <= 3000000 * 0.9 THEN (g % 10000) + 1
         ELSE (g % 1000000) + 10000
       END AS id
FROM generate_series(1, 3000000) g;

CREATE TABLE t2 AS
SELECT CASE
         WHEN g <= 3000000 * 0.9 THEN (g % 10000) + 10001
         ELSE (g % 1000000) + 20000
       END AS id
FROM generate_series(1, 3000000) g;

ANALYZE t1, t2;

The results of the query are:

SELECT * FROM t1
WHERE id IN (SELECT id FROM t2);

default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
------------------------------------------------------------------------------------------
1                         | 1.12                | 1.191               |
1.062
5                         | 1.02                | 0.493               |
0.481
10                        | 0.92                | 0.431               |
0.471
25                        | 1.27                | 0.393               |
0.309
50                        | 1.04                | 0.432               |
0.416
75                        | 0.96                | 0.398               |
0.415
100                       | 0.95                | 0.450               |
0.473
1000                      | 9.42                | 6.742               |
0.716
2500                      | 19.15               | 21.621              |
1.129
5000                      | 46.74               | 85.667              |
1.833
7500                      | 73.26               | 194.806             |
2.659
10000                     | 107.95              | 349.981             |
3.242

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com

#19Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: David Geier (#16)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi David,

In v2 patch, when the join is reversed we pass the commutator operator
Oid to eqjoinsel_semi(), and inside that function we immediately call
get_opcode(<commutator operator Oid>). Did you mean for the function to
take an operator Oid instead of an here?

If that was unintentional, perhaps the cleanest fix is to add a new
'operator' parameter to eqjoinsel_semi() so we can keep passing
'opfuncoid' as before and avoid changing the behavior.

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com

#20Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: Ilia Evdokimov (#19)
1 attachment(s)
Re: Use merge-based matching for MCVs in eqjoinsel

On 17.09.2025 12:40, Ilia Evdokimov wrote:

Hi David,

In v2 patch, when the join is reversed we pass the commutator operator
Oid to eqjoinsel_semi(), and inside that function we immediately call
get_opcode(<commutator operator Oid>). Did you mean for the function
to take an operator Oid instead of an here?

If that was unintentional, perhaps the cleanest fix is to add a new
'operator' parameter to eqjoinsel_semi() so we can keep passing
'opfuncoid' as before and avoid changing the behavior.

This v3 patch fixes the confusion between operator and function Oids in
eqjoinsel_semi(). This version restores the previous behavior by keeping
the function Oid as before and adds an explicit 'operator' parameter so
both values are available without extra behavior changes.

Do you have any further comments or suggestions on this version?

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com

Attachments:

v3-0001-Optimize-eqjoinsel_inner-and-eqjoinsel_semi.patchtext/x-patch; charset=UTF-8; name=v3-0001-Optimize-eqjoinsel_inner-and-eqjoinsel_semi.patchDownload
From bd2127e1a27cc9dbc5eb93df8c6bb789e49c2ebc Mon Sep 17 00:00:00 2001
From: Ilia Evdokimov <ilya.evdokimov@tantorlabs.ru>
Date: Mon, 13 Oct 2025 12:54:18 +0300
Subject: [PATCH v3] Optimize eqjoinsel_inner() and eqjoinsel_semi()

Previously an O(N^2) algorithm was used to look for matching MCV
values between two tables. Significantly increasing
default_statistics_target could result in planning taking seconds.

The O(N^2) algorithm got replaced with an O(N) algorithm which is
based on a hash table. If the column type is not hashable, we
fallback to the O(N^2) algorithm. As follow-on work, We can add a
second fast path based on sorting and merging for types that are
not hashable.
---
 src/backend/utils/adt/selfuncs.c | 233 +++++++++++++++++++++++++------
 1 file changed, 193 insertions(+), 40 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index e5e066a5537..18053e98bc9 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -143,6 +143,8 @@
 
 #define DEFAULT_PAGE_CPU_MULTIPLIER 50.0
 
+struct McvHashTable_hash;
+
 /* Hooks for plugins to get control when we ask for stats */
 get_relation_stats_hook_type get_relation_stats_hook = NULL;
 get_index_stats_hook_type get_index_stats_hook = NULL;
@@ -155,7 +157,7 @@ static double eqjoinsel_inner(Oid opfuncoid, Oid collation,
 							  AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 							  Form_pg_statistic stats1, Form_pg_statistic stats2,
 							  bool have_mcvs1, bool have_mcvs2);
-static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
+static double eqjoinsel_semi(Oid operator, Oid opfuncoid, Oid collation,
 							 VariableStatData *vardata1, VariableStatData *vardata2,
 							 double nd1, double nd2,
 							 bool isdefault1, bool isdefault2,
@@ -217,7 +219,142 @@ static bool get_actual_variable_endpoint(Relation heapRel,
 static RelOptInfo *find_join_input_rel(PlannerInfo *root, Relids relids);
 static double btcost_correlation(IndexOptInfo *index,
 								 VariableStatData *vardata);
+static uint32 hash_msv(struct McvHashTable_hash *hashTable, Datum key);
+static bool are_mcvs_equal(struct McvHashTable_hash *hashTable, Datum value1, Datum value2);
+
+typedef struct McvHashEntry
+{
+	Datum  value;
+	uint32 index;
+	uint32 hash;
+	char   status;
+} McvHashEntry;
+
+typedef struct McvHashContext
+{
+	FmgrInfo equal_proc;
+	FmgrInfo hash_proc;
+	Oid      collation;
+} McvHashContext;
+
+#define SH_PREFIX                  McvHashTable
+#define SH_ELEMENT_TYPE            McvHashEntry
+#define SH_KEY_TYPE                Datum
+#define SH_KEY                     value
+#define SH_HASH_KEY(mcvs, key)     hash_msv(mcvs, key)
+#define SH_EQUAL(mcvs, key0, key1) are_mcvs_equal(mcvs, key0, key1)
+#define SH_SCOPE                   static inline
+#define SH_STORE_HASH
+#define SH_GET_HASH(mcvs, key)     key->hash
+#define SH_DEFINE
+#define SH_DECLARE
+#include "lib/simplehash.h"
+
+static uint32
+hash_msv(struct McvHashTable_hash *hashTable, Datum key)
+{	
+	McvHashContext *context = (McvHashContext *)hashTable->private_data;
+	return DatumGetUInt32(FunctionCall1Coll(&context->hash_proc, context->collation, key));
+}
+
+static bool
+are_mcvs_equal(struct McvHashTable_hash *hashTable, Datum value1, Datum value2)
+{
+	/*
+	 * We can safely use FunctionCall2Coll() which requires the result to
+	 * never be NULL, because MCV arrays from 'pg_statistic' don't contain
+	 * NULL values
+	 */
+	McvHashContext *context = (McvHashContext *)hashTable->private_data;
+	return DatumGetBool(FunctionCall2Coll(&context->equal_proc, context->collation, value1, value2));
+}
+  
+/*
+ * eqjoinsel_inner_with_hashtable
+ *
+ * Optimizes inner equality join selectivity estimation by using an O(n)
+ * algorithm based on hashing. Returns whether or not all prerequisites are
+ * met and the operation was successful. The result is used to know if to
+ * fallback to the default implementation.
+ */
+static bool
+try_eqjoinsel_with_hashtable(Oid operatorOid, Oid collation,
+							AttStatsSlot *statsSlot1, AttStatsSlot *statsSlot2, int nvaluesSlot2,
+							FunctionCallInfo equalFunctionCallInfo,
+							/* Output parameters: */
+							double *matchprodfreq, int *nmatches, bool *hasmatch1, bool *hasmatch2)
+{
+	AttStatsSlot	*statsInner = statsSlot2;
+	AttStatsSlot	*statsOuter = statsSlot1;
+	bool			*hasMatchInner = hasmatch2;
+	bool			*hasMatchOuter = hasmatch1;
+	int				nvaluesInner = nvaluesSlot2;
+	int				nvaluesOuter = statsSlot1->nvalues;
+	McvHashContext	hashContext;
+	McvHashTable_hash *hashTable;
+	Oid 			hashLeft  = InvalidOid;
+	Oid 			hashRight = InvalidOid;
+
+	/*
+	 * If one MCV array contains only a single value, there's no gain in using a hash table.
+	 * The sweet spot of using hash table lookups instead of iterating is slightly higher
+	 * than 1 but we don't bother here because the gains are neglectable.
+	 */
+	if (Min(statsSlot1->nvalues, nvaluesSlot2) == 1)
+		return false;
+
+	get_op_hash_functions(operatorOid, &hashLeft, &hashRight);
+	if (!OidIsValid(hashLeft) || hashLeft != hashRight)
+		return false;
+
+	/* Make sure we build the hash table on the smaller array. */
+	if (nvaluesOuter < nvaluesInner)
+	{
+		statsInner = statsSlot1;
+		statsOuter = statsSlot2;
+		hasMatchInner = hasmatch1;
+		hasMatchOuter = hasmatch2;
+		nvaluesInner = statsSlot1->nvalues;
+		nvaluesOuter = nvaluesSlot2;
+	}
+
+	/* 1. Create hash table of smaller 'pg_statistic' array. That's O(n). */
+	fmgr_info(get_opcode(operatorOid), &hashContext.equal_proc);
+	fmgr_info(hashLeft, &hashContext.hash_proc); /* hashLeft == hashRight */
+	hashContext.collation = collation;
 
+	hashTable = McvHashTable_create(CurrentMemoryContext, nvaluesInner, &hashContext);
+
+	for (int i = 0; i < nvaluesInner; i++)
+	{
+		bool found = false;
+		McvHashEntry *entry = McvHashTable_insert(hashTable, statsInner->values[i], &found);
+
+		Assert(!found);
+
+		entry->index = i;
+	}
+
+	/* 2. Look-up values from other 'pg_statistic' array against hash map to find matches. */
+	for (int i = 0; i < nvaluesOuter; i++)
+	{
+		McvHashEntry *entry = McvHashTable_lookup(hashTable, statsOuter->values[i]);
+
+		if (entry != NULL)
+		{
+			hasMatchInner[entry->index] = true;
+			hasMatchOuter[i]            = true;
+			(*nmatches)++;
+
+			/* Conditional because not needed by SEMI join selectivity estimation */
+			if (matchprodfreq != NULL)
+				*matchprodfreq += statsInner->numbers[entry->index] * statsOuter->numbers[i];
+		}
+	}
+
+	McvHashTable_destroy(hashTable);
+	return true;
+}
 
 /*
  *		eqsel			- Selectivity of "=" for any data types.
@@ -2361,7 +2498,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 	}
 
 	/* We need to compute the inner-join selectivity in all cases */
-	selec_inner = eqjoinsel_inner(opfuncoid, collation,
+	selec_inner = eqjoinsel_inner(operator, collation,
 								  &vardata1, &vardata2,
 								  nd1, nd2,
 								  isdefault1, isdefault2,
@@ -2388,7 +2525,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 			inner_rel = find_join_input_rel(root, sjinfo->min_righthand);
 
 			if (!join_is_reversed)
-				selec = eqjoinsel_semi(opfuncoid, collation,
+				selec = eqjoinsel_semi(operator, opfuncoid, collation,
 									   &vardata1, &vardata2,
 									   nd1, nd2,
 									   isdefault1, isdefault2,
@@ -2401,7 +2538,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 				Oid			commop = get_commutator(operator);
 				Oid			commopfuncoid = OidIsValid(commop) ? get_opcode(commop) : InvalidOid;
 
-				selec = eqjoinsel_semi(commopfuncoid, collation,
+				selec = eqjoinsel_semi(operator, commopfuncoid, collation,
 									   &vardata2, &vardata1,
 									   nd2, nd1,
 									   isdefault2, isdefault1,
@@ -2449,7 +2586,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
  * that it's worth trying to distinguish them here.
  */
 static double
-eqjoinsel_inner(Oid opfuncoid, Oid collation,
+eqjoinsel_inner(Oid operator, Oid collation,
 				VariableStatData *vardata1, VariableStatData *vardata2,
 				double nd1, double nd2,
 				bool isdefault1, bool isdefault2,
@@ -2491,7 +2628,7 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		int			i,
 					nmatches;
 
-		fmgr_info(opfuncoid, &eqproc);
+		fmgr_info(get_opcode(operator), &eqproc);
 
 		/*
 		 * Save a few cycles by setting up the fcinfo struct just once. Using
@@ -2515,30 +2652,38 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		 */
 		matchprodfreq = 0.0;
 		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
-		{
-			int			j;
 
-			fcinfo->args[0].value = sslot1->values[i];
-
-			for (j = 0; j < sslot2->nvalues; j++)
+		if (!try_eqjoinsel_with_hashtable(operator, collation, sslot1, sslot2, sslot2->nvalues,
+											fcinfo, &matchprodfreq, &nmatches,
+											hasmatch1, hasmatch2))
+		{
+			/* Fallback to O(N^2) algorithm if hash based variant didn't succeed. */
+			for (i = 0; i < sslot1->nvalues; i++)
 			{
-				Datum		fresult;
+				int			j;
 
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
+				fcinfo->args[0].value = sslot1->values[i];
+
+				for (j = 0; j < sslot2->nvalues; j++)
 				{
-					hasmatch1[i] = hasmatch2[j] = true;
-					matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
-					nmatches++;
-					break;
+					Datum		fresult;
+
+					if (hasmatch2[j])
+						continue;
+					fcinfo->args[1].value = sslot2->values[j];
+					fcinfo->isnull = false;
+					fresult = FunctionCallInvoke(fcinfo);
+					if (!fcinfo->isnull && DatumGetBool(fresult))
+					{
+						hasmatch1[i] = hasmatch2[j] = true;
+						matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
+						nmatches++;
+						break;
+					}
 				}
 			}
 		}
+
 		CLAMP_PROBABILITY(matchprodfreq);
 		/* Sum up frequencies of matched and unmatched MCVs */
 		matchfreq1 = unmatchfreq1 = 0.0;
@@ -2646,7 +2791,7 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
  * Unlike eqjoinsel_inner, we have to cope with opfuncoid being InvalidOid.
  */
 static double
-eqjoinsel_semi(Oid opfuncoid, Oid collation,
+eqjoinsel_semi(Oid operator, Oid opfuncoid, Oid collation,
 			   VariableStatData *vardata1, VariableStatData *vardata2,
 			   double nd1, double nd2,
 			   bool isdefault1, bool isdefault2,
@@ -2744,29 +2889,37 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 * and because the math wouldn't add up...
 		 */
 		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
-		{
-			int			j;
-
-			fcinfo->args[0].value = sslot1->values[i];
 
-			for (j = 0; j < clamped_nvalues2; j++)
+		if (!try_eqjoinsel_with_hashtable(operator, collation, sslot1, sslot2,
+										clamped_nvalues2, fcinfo, NULL,
+										&nmatches, hasmatch1, hasmatch2))
+		{
+			/* Fallback to O(N^2) algorithm if hash based variant didn't succeed. */
+			for (i = 0; i < sslot1->nvalues; i++)
 			{
-				Datum		fresult;
+				int			j;
 
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
+				fcinfo->args[0].value = sslot1->values[i];
+
+				for (j = 0; j < clamped_nvalues2; j++)
 				{
-					hasmatch1[i] = hasmatch2[j] = true;
-					nmatches++;
-					break;
+					Datum		fresult;
+
+					if (hasmatch2[j])
+						continue;
+					fcinfo->args[1].value = sslot2->values[j];
+					fcinfo->isnull = false;
+					fresult = FunctionCallInvoke(fcinfo);
+					if (!fcinfo->isnull && DatumGetBool(fresult))
+					{
+						hasmatch1[i] = hasmatch2[j] = true;
+						nmatches++;
+						break;
+					}
 				}
 			}
 		}
+
 		/* Sum up frequencies of matched MCVs */
 		matchfreq1 = 0.0;
 		for (i = 0; i < sslot1->nvalues; i++)
-- 
2.34.1

#21David Geier
geidav.pg@gmail.com
In reply to: Ilia Evdokimov (#17)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi Ilia!

On 10.09.2025 15:56, Ilia Evdokimov wrote:

LGTM. Yes, I'll test this patch.

Unfortunately, the JOB benchmark does not contain semi join nodes.
However, TPC-DS does. I'll look for the queries with slowest planner
times there and check them.

I'll need some time to check both join and semi join cases with small
and large default_statistics_target. I'll share the results later.

Have you had a chance to test above things?

I've seen that there's already a commit fest entry. I've adapted the
entry (changed the title and added myself as author). Do you want to add
yourself as reviewer?

--
David Geier

#22Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: David Geier (#21)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi David,

On 27.10.2025 18:50, David Geier wrote:

Hi Ilia!

On 10.09.2025 15:56, Ilia Evdokimov wrote:

LGTM. Yes, I'll test this patch.

Unfortunately, the JOB benchmark does not contain semi join nodes.
However, TPC-DS does. I'll look for the queries with slowest planner
times there and check them.

I'll need some time to check both join and semi join cases with small
and large default_statistics_target. I'll share the results later.

Have you had a chance to test above things?

Yes, I wrote about this here:
/messages/by-id/c3dbf2ab-d72d-4033-822a-60ad8023f499@tantorlabs.com

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com/

#23Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ilia Evdokimov (#22)
Re: Use merge-based matching for MCVs in eqjoinsel

Ilia Evdokimov <ilya.evdokimov@tantorlabs.com> writes:

On 27.10.2025 18:50, David Geier wrote:

On 10.09.2025 15:56, Ilia Evdokimov wrote:

I'll need some time to check both join and semi join cases with small
and large default_statistics_target. I'll share the results later.

Have you had a chance to test above things?

Yes, I wrote about this here:
/messages/by-id/c3dbf2ab-d72d-4033-822a-60ad8023f499@tantorlabs.com

Hmm. Those results sure look like there is a performance regression
up to at least 100 MCVs ... not a large one, but consistently a few
percent. That's a bit sad for a patch purporting to improve
performance. It looks to me like perhaps we should stick to the old
algorithm up to 100 or possibly even more MCVs. Certainly the
threshold needs to be higher than 1, as you have it now.

I eyeballed the patch itself very briefly, and have a couple
quick comments:

* Is hash_msv a typo for hash_mcv? If not, maybe spell out what
it's supposed to mean.

* The patch would be easier to read if it didn't reindent a couple
large chunks of existing code. Can we change the factorization
to avoid that? If not, I'd recommend submitting without that
reindentation, and reminding the committer to reindent at the last
moment.

* The calculation loops in eqjoinsel_inner and eqjoinsel_semi
are not identical, which makes it look quite weird to be
writing just one function that conditionally replaces both.
I wonder if we should refactor to have just one copy (and
just eat the extra cycles of calculating matchprodfreq).

* In fact ... I wonder if we should try harder to not do essentially
identical calculations twice, remembering that eqjoinsel_semi is
always used alongside eqjoinsel_inner. (Of course, we could only do
that if clamped_nvalues2 is the same as sslot2->nvalues, but that's
frequently true.) I think the reason it's duplicative right now
is that we regarded this semijoin calculation as an experiment and
so didn't want to invest a lot of effort in it ... but this patch
is exactly a lot of effort, so maybe it's time to deal with that
unfinished business.

regards, tom lane

#24Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: Tom Lane (#23)
2 attachment(s)
Re: Use merge-based matching for MCVs in eqjoinsel

Thanks for the detailed feedback!

On 04.11.2025 00:55, Tom Lane wrote:

Hmm. Those results sure look like there is a performance regression
up to at least 100 MCVs ... not a large one, but consistently a few
percent. That's a bit sad for a patch purporting to improve
performance. It looks to me like perhaps we should stick to the old
algorithm up to 100 or possibly even more MCVs. Certainly the
threshold needs to be higher than 1, as you have it now.

I re-ran the benchmark on JOB with a threshold of 100.Here are the
updated results:

default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
--------------------------------------------------------------------------------
1                         | 1.00                | 2320.412            |
2318.377
5                         | 0.99                | 2335.894            |
2360.890
10                        | 1.00                | 2350.612            |
2347.154
25                        | 1.01                | 2365.977            |
2342.312
50                        | 0.99                | 2381.554            |
2405.262
75                        | 1.00                | 2396.481            |
2399.828
100                       | 1.00                | 2410.367            |
2412.456
1000                      | 1.11                | 2850.853            |
2564.303
2500                      | 2.04                | 5571.688            |
2731.545
5000                      | 6.05                | 18850.084           |
3114.692
7500                      | 11.96               | 39160.898           |
3273.688
10000                     | 19.04               | 71334.113           |
3745.955

I eyeballed the patch itself very briefly, and have a couple
quick comments:

* Is hash_msv a typo for hash_mcv? If not, maybe spell out what
it's supposed to mean.

Yes, that was a typo — fixed.

* The patch would be easier to read if it didn't reindent a couple
large chunks of existing code. Can we change the factorization
to avoid that? If not, I'd recommend submitting without that
reindentation, and reminding the committer to reindent at the last
moment.

Fixed as well. I’ve removed all reindentation changes. I will keep that
in mind for future submissions.

* The calculation loops in eqjoinsel_inner and eqjoinsel_semi
are not identical, which makes it look quite weird to be
writing just one function that conditionally replaces both.
I wonder if we should refactor to have just one copy (and
just eat the extra cycles of calculating matchprodfreq).

Agreed. I’ve dropped the attempt to merge them into a single function.

* In fact ... I wonder if we should try harder to not do essentially
identical calculations twice, remembering that eqjoinsel_semi is
always used alongside eqjoinsel_inner. (Of course, we could only do
that if clamped_nvalues2 is the same as sslot2->nvalues, but that's
frequently true.) I think the reason it's duplicative right now
is that we regarded this semijoin calculation as an experiment and
so didn't want to invest a lot of effort in it ... but this patch
is exactly a lot of effort, so maybe it's time to deal with that
unfinished business.

regards, tom lane

Good point. I addressed this in a separate patch: eqjoinsel_inner() now
saves matchfreq1, matchfreq2, nmatches so that eqjoinsel_semi() can
reuse them when (clamped_nvalues2 == sslot2->nvalues). If the MCV list
on the RHS is clamped, we still recompute locally. If you have a cleaner
idea for how to share these values between the two functions without
passing them explicitly, I’d be happy to consider it.

I’m attaching two patches:
1. v4-0001-Avoid-duplicate-MCV-matching-in-eqjoinsel_semi-an.patch -
removes redundant MCV matching for semi/anti joins;
2. v4-0002-Optimize-MCV-matching-in-eqjoinsel_inner-and-eqjo.patch -
adds hash-based MCV matching with a configurable threshold and includes
fixes based on your comments.

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com/

Attachments:

v1-0001-Avoid-duplicate-MCV-matching-in-eqjoinsel_semi-an.patchtext/x-patch; charset=UTF-8; name=v1-0001-Avoid-duplicate-MCV-matching-in-eqjoinsel_semi-an.patchDownload
From 71f59bd83e559df6b36720a4592bf3fdd689504a Mon Sep 17 00:00:00 2001
From: Ilia Evdokimov <ilya.evdokimov@tantorlabs.ru>
Date: Mon, 10 Nov 2025 16:11:43 +0300
Subject: [PATCH v1] Avoid duplicate MCV matching in eqjoinsel_semi and
 eqjoinsel_inner.

Previously both eqjoinsel_inner() and eqjoinsel_semi() performed identical
O(N^2) loops over MCV lists, even though the semi join case always follows
the inner join case in eqjoinsel().  Now the MCV matching results from
eqjoinsel_inner() are reused in eqjoinsel_semi() when possible (i.e., when
the RHS MCV list is not clamped).  This saves redundant computation and
simplifies the code.

Author: Ilia Evdokimov <ilya.evdokimov@tantorlabs.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Reviewed-by: David Geier <geidav.pg@gmail.com>
---
 src/backend/utils/adt/selfuncs.c | 36 ++++++++++++++++++++++++++------
 1 file changed, 30 insertions(+), 6 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index cb23ad52782..55cd0486bf9 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -154,7 +154,9 @@ static double eqjoinsel_inner(Oid opfuncoid, Oid collation,
 							  bool isdefault1, bool isdefault2,
 							  AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 							  Form_pg_statistic stats1, Form_pg_statistic stats2,
-							  bool have_mcvs1, bool have_mcvs2);
+							  bool have_mcvs1, bool have_mcvs2,
+							  double *matchfreq_mcvs1, double *matchfreq_mcvs2,
+							  int *nmatches_mcvs);
 static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
 							 VariableStatData *vardata1, VariableStatData *vardata2,
 							 double nd1, double nd2,
@@ -162,6 +164,7 @@ static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
 							 AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 							 Form_pg_statistic stats1, Form_pg_statistic stats2,
 							 bool have_mcvs1, bool have_mcvs2,
+							 double matchfreq1, int nmatches,
 							 RelOptInfo *inner_rel);
 static bool estimate_multivariate_ndistinct(PlannerInfo *root,
 											RelOptInfo *rel, List **varinfos, double *ndistinct);
@@ -2313,6 +2316,9 @@ eqjoinsel(PG_FUNCTION_ARGS)
 	bool		get_mcv_stats;
 	bool		join_is_reversed;
 	RelOptInfo *inner_rel;
+	int		nmatches_mcvs = 0;
+	double		matchfreq_mcvs1 = 0.0;
+	double		matchfreq_mcvs2 = 0.0;
 
 	get_join_variables(root, args, sjinfo,
 					   &vardata1, &vardata2, &join_is_reversed);
@@ -2367,7 +2373,9 @@ eqjoinsel(PG_FUNCTION_ARGS)
 								  isdefault1, isdefault2,
 								  &sslot1, &sslot2,
 								  stats1, stats2,
-								  have_mcvs1, have_mcvs2);
+								  have_mcvs1, have_mcvs2,
+								  &matchfreq_mcvs1, &matchfreq_mcvs2,
+								  &nmatches_mcvs);
 
 	switch (sjinfo->jointype)
 	{
@@ -2395,6 +2403,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 									   &sslot1, &sslot2,
 									   stats1, stats2,
 									   have_mcvs1, have_mcvs2,
+									   matchfreq_mcvs1, nmatches_mcvs,
 									   inner_rel);
 			else
 			{
@@ -2408,6 +2417,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 									   &sslot2, &sslot1,
 									   stats2, stats1,
 									   have_mcvs2, have_mcvs1,
+									   matchfreq_mcvs2, nmatches_mcvs,
 									   inner_rel);
 			}
 
@@ -2455,7 +2465,9 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 				bool isdefault1, bool isdefault2,
 				AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 				Form_pg_statistic stats1, Form_pg_statistic stats2,
-				bool have_mcvs1, bool have_mcvs2)
+				bool have_mcvs1, bool have_mcvs2,
+				double *matchfreq_mcvs1, double *matchfreq_mcvs2,
+				int *nmatches_mcvs)
 {
 	double		selec;
 
@@ -2595,6 +2607,11 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 			totalsel2 += otherfreq2 * (otherfreq1 + unmatchfreq1) /
 				(nd1 - nmatches);
 
+		/* Save MCV match statistics for possible reuse by eqjoinsel_semi() */
+		*matchfreq_mcvs1 = matchfreq1;
+		*matchfreq_mcvs2 = matchfreq2;
+		*nmatches_mcvs = nmatches;
+
 		/*
 		 * Use the smaller of the two estimates.  This can be justified in
 		 * essentially the same terms as given below for the no-stats case: to
@@ -2653,6 +2670,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 			   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 			   Form_pg_statistic stats1, Form_pg_statistic stats2,
 			   bool have_mcvs1, bool have_mcvs2,
+			   double matchfreq1, int nmatches,
 			   RelOptInfo *inner_rel)
 {
 	double		selec;
@@ -2705,11 +2723,9 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		bool	   *hasmatch1;
 		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
-		double		matchfreq1,
-					uncertainfrac,
+		double		uncertainfrac,
 					uncertain;
 		int			i,
-					nmatches,
 					clamped_nvalues2;
 
 		/*
@@ -2721,6 +2737,13 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 */
 		clamped_nvalues2 = Min(sslot2->nvalues, nd2);
 
+		/*
+		 * eqjoinsel_inner() normally already did the full MCV comparison,
+		 * so we reuse its results unless RHS MCVs were clamped, in which
+		 * case we must redo the loop for the reduced list.
+		 */
+		if (clamped_nvalues2 != sslot2->nvalues)
+		{
 		fmgr_info(opfuncoid, &eqproc);
 
 		/*
@@ -2777,6 +2800,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		CLAMP_PROBABILITY(matchfreq1);
 		pfree(hasmatch1);
 		pfree(hasmatch2);
+		}
 
 		/*
 		 * Now we need to estimate the fraction of relation 1 that has at
-- 
2.34.1

v4-0002-Optimize-MCV-matching-in-eqjoinsel_inner-and-eqjo.patchtext/x-patch; charset=UTF-8; name=v4-0002-Optimize-MCV-matching-in-eqjoinsel_inner-and-eqjo.patchDownload
From 27c6f4b6e947af27ccc9f6ae881407010f141bbe Mon Sep 17 00:00:00 2001
From: Ilia Evdokimov <ilya.evdokimov@tantorlabs.ru>
Date: Mon, 10 Nov 2025 17:06:34 +0300
Subject: [PATCH v4 2/2] Optimize MCV matching in eqjoinsel_inner() and
 eqjoinsel_semi()

Previously, MCV values from both sides of a join were compared using
an O(N^2) nested-loop algorithm.  When default_statistics_target was
set to large values, this could make query planning noticeably slower.

This patch introduces a hash-based O(N) algorithm for matching MCVs.
The planner now switches to the hash method when the MCV lists are
large enough to amortize hash setup costs, while keeping the old
nested-loop path for small lists.  The threshold is currently set
to 100 entries.

For data types that do not support hashing, the code still falls back
to the O(N^2) algorithm.

Author: David Geier <geidav.pg@gmail.com>
Author: Ilia Evdokimov <ilya.evdokimov@tantorlabs.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
---
 src/backend/utils/adt/selfuncs.c | 211 +++++++++++++++++++++++++++++--
 1 file changed, 202 insertions(+), 9 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 55cd0486bf9..b22e2e5d920 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -143,12 +143,20 @@
 
 #define DEFAULT_PAGE_CPU_MULTIPLIER 50.0
 
+/*
+ * Switch to hash-based MCV matching when lists are large enough
+ * to amortize hash setup cost.
+ */
+#define EQJOINSEL_MCV_HASH_THRESHOLD 100
+
+struct McvHashTable_hash;
+
 /* Hooks for plugins to get control when we ask for stats */
 get_relation_stats_hook_type get_relation_stats_hook = NULL;
 get_index_stats_hook_type get_index_stats_hook = NULL;
 
 static double eqsel_internal(PG_FUNCTION_ARGS, bool negate);
-static double eqjoinsel_inner(Oid opfuncoid, Oid collation,
+static double eqjoinsel_inner(Oid operator, Oid collation,
 							  VariableStatData *vardata1, VariableStatData *vardata2,
 							  double nd1, double nd2,
 							  bool isdefault1, bool isdefault2,
@@ -157,7 +165,7 @@ static double eqjoinsel_inner(Oid opfuncoid, Oid collation,
 							  bool have_mcvs1, bool have_mcvs2,
 							  double *matchfreq_mcvs1, double *matchfreq_mcvs2,
 							  int *nmatches_mcvs);
-static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
+static double eqjoinsel_semi(Oid operator, Oid opfuncoid, Oid collation,
 							 VariableStatData *vardata1, VariableStatData *vardata2,
 							 double nd1, double nd2,
 							 bool isdefault1, bool isdefault2,
@@ -220,6 +228,55 @@ static bool get_actual_variable_endpoint(Relation heapRel,
 static RelOptInfo *find_join_input_rel(PlannerInfo *root, Relids relids);
 static double btcost_correlation(IndexOptInfo *index,
 								 VariableStatData *vardata);
+static uint32 hash_mcv(struct McvHashTable_hash *hashTable, Datum key);
+static bool are_mcvs_equal(struct McvHashTable_hash *hashTable, Datum value1, Datum value2);
+
+typedef struct McvHashEntry
+{
+	Datum  value;
+	uint32 index;
+	uint32 hash;
+	char   status;
+} McvHashEntry;
+
+typedef struct McvHashContext
+{
+	FmgrInfo equal_proc;
+	FmgrInfo hash_proc;
+	Oid      collation;
+} McvHashContext;
+
+#define SH_PREFIX                  McvHashTable
+#define SH_ELEMENT_TYPE            McvHashEntry
+#define SH_KEY_TYPE                Datum
+#define SH_KEY                     value
+#define SH_HASH_KEY(mcvs, key)     hash_mcv(mcvs, key)
+#define SH_EQUAL(mcvs, key0, key1) are_mcvs_equal(mcvs, key0, key1)
+#define SH_SCOPE                   static inline
+#define SH_STORE_HASH
+#define SH_GET_HASH(mcvs, key)     key->hash
+#define SH_DEFINE
+#define SH_DECLARE
+#include "lib/simplehash.h"
+
+static uint32
+hash_mcv(struct McvHashTable_hash *hashTable, Datum key)
+{
+	McvHashContext *context = (McvHashContext *)hashTable->private_data;
+	return DatumGetUInt32(FunctionCall1Coll(&context->hash_proc, context->collation, key));
+}
+
+static bool
+are_mcvs_equal(struct McvHashTable_hash *hashTable, Datum value1, Datum value2)
+{
+	/*
+	 * We can safely use FunctionCall2Coll() which requires the result to
+	 * never be NULL, because MCV arrays from 'pg_statistic' don't contain
+	 * NULL values
+	 */
+	McvHashContext *context = (McvHashContext *)hashTable->private_data;
+	return DatumGetBool(FunctionCall2Coll(&context->equal_proc, context->collation, value1, value2));
+}
 
 
 /*
@@ -2367,7 +2424,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 	}
 
 	/* We need to compute the inner-join selectivity in all cases */
-	selec_inner = eqjoinsel_inner(opfuncoid, collation,
+	selec_inner = eqjoinsel_inner(operator, collation,
 								  &vardata1, &vardata2,
 								  nd1, nd2,
 								  isdefault1, isdefault2,
@@ -2396,7 +2453,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 			inner_rel = find_join_input_rel(root, sjinfo->min_righthand);
 
 			if (!join_is_reversed)
-				selec = eqjoinsel_semi(opfuncoid, collation,
+				selec = eqjoinsel_semi(operator, opfuncoid, collation,
 									   &vardata1, &vardata2,
 									   nd1, nd2,
 									   isdefault1, isdefault2,
@@ -2410,7 +2467,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 				Oid			commop = get_commutator(operator);
 				Oid			commopfuncoid = OidIsValid(commop) ? get_opcode(commop) : InvalidOid;
 
-				selec = eqjoinsel_semi(commopfuncoid, collation,
+				selec = eqjoinsel_semi(operator, commopfuncoid, collation,
 									   &vardata2, &vardata1,
 									   nd2, nd1,
 									   isdefault2, isdefault1,
@@ -2459,7 +2516,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
  * that it's worth trying to distinguish them here.
  */
 static double
-eqjoinsel_inner(Oid opfuncoid, Oid collation,
+eqjoinsel_inner(Oid operator, Oid collation,
 				VariableStatData *vardata1, VariableStatData *vardata2,
 				double nd1, double nd2,
 				bool isdefault1, bool isdefault2,
@@ -2502,8 +2559,11 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 					totalsel2;
 		int			i,
 					nmatches;
+		Oid			hashLeft  = InvalidOid;
+		Oid			hashRight = InvalidOid;
 
-		fmgr_info(opfuncoid, &eqproc);
+		fmgr_info(get_opcode(operator), &eqproc);
+		get_op_hash_functions(operator, &hashLeft, &hashRight);
 
 		/*
 		 * Save a few cycles by setting up the fcinfo struct just once. Using
@@ -2527,6 +2587,70 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		 */
 		matchprodfreq = 0.0;
 		nmatches = 0;
+
+		/*
+		 * If one MCV array contains less than 100 values, there's no gain in using a hash table.
+		 * The sweet spot of using hash table lookups instead of iterating is slightly higher
+		 * than 1 but we don't bother here because the gains are neglectable.
+		 */
+		if (OidIsValid(hashLeft) && hashLeft == hashRight &&
+			Min(sslot1->nvalues, sslot2->nvalues) > EQJOINSEL_MCV_HASH_THRESHOLD)
+		{
+			AttStatsSlot	*statsInner = sslot2;
+			AttStatsSlot	*statsOuter = sslot1;
+			bool			*hasMatchInner = hasmatch2;
+			bool			*hasMatchOuter = hasmatch1;
+			int				nvaluesInner = sslot2->nvalues;
+			int				nvaluesOuter = sslot1->nvalues;
+			McvHashContext	hashContext;
+			McvHashTable_hash *hashTable;
+
+			/* Make sure we build the hash table on the smaller array. */
+			if (sslot1->nvalues < sslot2->nvalues)
+			{
+				statsInner = sslot1;
+				statsOuter = sslot2;
+				hasMatchInner = hasmatch1;
+				hasMatchOuter = hasmatch2;
+				nvaluesInner = sslot1->nvalues;
+				nvaluesOuter = sslot2->nvalues;
+			}
+
+			/* 1. Create hash table of smaller 'pg_statistic' array. That's O(n). */
+			fmgr_info(get_opcode(operator), &hashContext.equal_proc);
+			fmgr_info(hashLeft, &hashContext.hash_proc); /* hashLeft == hashRight */
+			hashContext.collation = collation;
+
+			hashTable = McvHashTable_create(CurrentMemoryContext, nvaluesInner, &hashContext);
+
+			for (i = 0; i < nvaluesInner; i++)
+			{
+				bool found = false;
+				McvHashEntry *entry = McvHashTable_insert(hashTable, statsInner->values[i], &found);
+
+				Assert(!found);
+
+				entry->index = i;
+			}
+
+			/* 2. Look-up values from other 'pg_statistic' array against hash map to find matches. */
+			for (i = 0; i < nvaluesOuter; i++)
+			{
+				McvHashEntry *entry = McvHashTable_lookup(hashTable, statsOuter->values[i]);
+
+				if (entry != NULL)
+				{
+					hasMatchInner[entry->index] = hasMatchOuter[i] = true;
+					nmatches++;
+					matchprodfreq += statsInner->numbers[entry->index] * statsOuter->numbers[i];
+				}
+			}
+
+			McvHashTable_destroy(hashTable);
+		}
+		else
+		{
+		/* Fallback to O(N^2) algorithm if hash based variant didn't succeed. */
 		for (i = 0; i < sslot1->nvalues; i++)
 		{
 			int			j;
@@ -2551,6 +2675,7 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 				}
 			}
 		}
+		}
 		CLAMP_PROBABILITY(matchprodfreq);
 		/* Sum up frequencies of matched and unmatched MCVs */
 		matchfreq1 = unmatchfreq1 = 0.0;
@@ -2663,7 +2788,7 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
  * Unlike eqjoinsel_inner, we have to cope with opfuncoid being InvalidOid.
  */
 static double
-eqjoinsel_semi(Oid opfuncoid, Oid collation,
+eqjoinsel_semi(Oid operator, Oid opfuncoid, Oid collation,
 			   VariableStatData *vardata1, VariableStatData *vardata2,
 			   double nd1, double nd2,
 			   bool isdefault1, bool isdefault2,
@@ -2744,7 +2869,11 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 */
 		if (clamped_nvalues2 != sslot2->nvalues)
 		{
-		fmgr_info(opfuncoid, &eqproc);
+			Oid 		hashLeft  = InvalidOid;
+			Oid 		hashRight = InvalidOid;
+
+			fmgr_info(get_opcode(operator), &eqproc);
+			get_op_hash_functions(operator, &hashLeft, &hashRight);
 
 		/*
 		 * Save a few cycles by setting up the fcinfo struct just once. Using
@@ -2767,6 +2896,69 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 * and because the math wouldn't add up...
 		 */
 		nmatches = 0;
+
+		/*
+			* If one MCV array contains less than 100 values, there's no gain in using a hash table.
+			* The sweet spot of using hash table lookups instead of iterating is slightly higher
+			* than 1 but we don't bother here because the gains are neglectable.
+			*/
+		if (OidIsValid(hashLeft) && hashLeft == hashRight &&
+			Min(sslot1->nvalues, clamped_nvalues2) > EQJOINSEL_MCV_HASH_THRESHOLD)
+		{
+				AttStatsSlot	*statsInner = sslot2;
+				AttStatsSlot	*statsOuter = sslot1;
+				bool			*hasMatchInner = hasmatch2;
+				bool			*hasMatchOuter = hasmatch1;
+				int				nvaluesInner = clamped_nvalues2;
+				int				nvaluesOuter = sslot1->nvalues;
+				McvHashContext	hashContext;
+				McvHashTable_hash *hashTable;
+
+				/* Make sure we build the hash table on the smaller array. */
+				if (sslot1->nvalues < clamped_nvalues2)
+				{
+					statsInner = sslot1;
+					statsOuter = sslot2;
+					hasMatchInner = hasmatch1;
+					hasMatchOuter = hasmatch2;
+					nvaluesInner = sslot1->nvalues;
+					nvaluesOuter = clamped_nvalues2;
+				}
+
+				/* 1. Create hash table of smaller 'pg_statistic' array. That's O(n). */
+				fmgr_info(get_opcode(operator), &hashContext.equal_proc);
+				fmgr_info(hashLeft, &hashContext.hash_proc); /* hashLeft == hashRight */
+				hashContext.collation = collation;
+
+				hashTable = McvHashTable_create(CurrentMemoryContext, nvaluesInner, &hashContext);
+
+			for (i = 0; i < nvaluesInner; i++)
+			{
+				bool found = false;
+				McvHashEntry *entry = McvHashTable_insert(hashTable, statsInner->values[i], &found);
+
+					Assert(!found);
+
+					entry->index = i;
+				}
+
+				/* 2. Look-up values from other 'pg_statistic' array against hash map to find matches. */
+				for (i = 0; i < nvaluesOuter; i++)
+				{
+					McvHashEntry *entry = McvHashTable_lookup(hashTable, statsOuter->values[i]);
+
+					if (entry != NULL)
+				{
+					hasMatchInner[entry->index] = hasMatchOuter[i] = true;
+					nmatches++;
+				}
+			}
+
+			McvHashTable_destroy(hashTable);
+		}
+		else
+		{
+		/* Fallback to O(N^2) algorithm if hash based variant didn't succeed. */
 		for (i = 0; i < sslot1->nvalues; i++)
 		{
 			int			j;
@@ -2790,6 +2982,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 				}
 			}
 		}
+		}
 		/* Sum up frequencies of matched MCVs */
 		matchfreq1 = 0.0;
 		for (i = 0; i < sslot1->nvalues; i++)
-- 
2.34.1

#25Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ilia Evdokimov (#24)
5 attachment(s)
Re: Use merge-based matching for MCVs in eqjoinsel

Ilia Evdokimov <ilya.evdokimov@tantorlabs.com> writes:

Good point. I addressed this in a separate patch: eqjoinsel_inner() now
saves matchfreq1, matchfreq2, nmatches so that eqjoinsel_semi() can
reuse them when (clamped_nvalues2 == sslot2->nvalues). If the MCV list
on the RHS is clamped, we still recompute locally. If you have a cleaner
idea for how to share these values between the two functions without
passing them explicitly, I’d be happy to consider it.

This didn't look very much like the refactorization that I had in
mind: I thought we should have one copy of the matching code, not two.
Also, after looking closer at your patch I realized you were just
punting for cross-type comparison operators, which I felt was kind
of sad. It's a little bit tricky to get simplehash.h to go along
with cross-type hashing, because it wants to use just one hash and
one equality function. But since those are interface routines we
are going to supply anyway, we can make them deal with the insert
and lookup cases differently.

So after a bit of hacking I ended up with the attached. I split up
the refactorization into several steps to make it easier to review.
(But I'd anticipate squashing these into one commit in the end,
so I didn't spend a lot of time on the commit messages.)

Also, 0001 in this series is not meant to be committed; what it
does is to add some debug logging to ease comparing runtimes of
different versions of eqjoinsel. I was able to use that to
convince myself that the refactoring steps didn't cost anything
meaningful in performance. Perhaps we could use it to investigate
the right hashing threshold more carefully, too.

There are still a couple of XXX comments in the attached, denoting
loose ends to look at. In particular, I wondered whether the
hash threshold check

if (Min(sslot1.nvalues, sslot2.nvalues) >= EQJOINSEL_MCV_HASH_THRESHOLD)

should use Max() instead --- that is, it might be safer to hash
if either MCV list is long. Or, holding one's head at a different
angle, perhaps the sum of the list lengths should be what's checked?

regards, tom lane

Attachments:

v5-0001-Add-some-test-scaffolding-to-join_selectivity.patchtext/x-diff; charset=us-ascii; name=v5-0001-Add-some-test-scaffolding-to-join_selectivity.patchDownload
From e4f70adb688b5abf400f797ba0f15290a9529ac1 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 13 Nov 2025 12:18:19 -0500
Subject: [PATCH v5 1/5] Add some test scaffolding to join_selectivity().

This not-meant-for-commit patch adds some instrumentation to
plancat.c's join_selectivity() to log the result and runtime
of a join selectivity function.  This is useful for manual
testing of performance patches in eqjoinsel().

To improve the accuracy of the runtime measurement, run the
function 1000 times in each call.  The regression tests still
take a reasonable amount of time with this overhead, although
it's noticeably more than usual.
---
 src/backend/optimizer/util/plancat.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index d950bd93002..15c50e068a0 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -42,6 +42,7 @@
 #include "parser/parse_relation.h"
 #include "parser/parsetree.h"
 #include "partitioning/partdesc.h"
+#include "portability/instr_time.h"
 #include "rewrite/rewriteHandler.h"
 #include "rewrite/rewriteManip.h"
 #include "statistics/statistics.h"
@@ -2123,6 +2124,8 @@ join_selectivity(PlannerInfo *root,
 {
 	RegProcedure oprjoin = get_oprjoin(operatorid);
 	float8		result;
+	instr_time	start_time,
+				end_time;
 
 	/*
 	 * if the oprjoin procedure is missing for whatever reason, use a
@@ -2131,6 +2134,10 @@ join_selectivity(PlannerInfo *root,
 	if (!oprjoin)
 		return (Selectivity) 0.5;
 
+	INSTR_TIME_SET_CURRENT(start_time);
+
+	for (int i = 0; i < 1000; i++)
+	{
 	result = DatumGetFloat8(OidFunctionCall5Coll(oprjoin,
 												 inputcollid,
 												 PointerGetDatum(root),
@@ -2138,6 +2145,21 @@ join_selectivity(PlannerInfo *root,
 												 PointerGetDatum(args),
 												 Int16GetDatum(jointype),
 												 PointerGetDatum(sjinfo)));
+	CHECK_FOR_INTERRUPTS();
+	}
+
+	/* Don't be chatty during initdb */
+	if (IsUnderPostmaster)
+	{
+		INSTR_TIME_SET_CURRENT(end_time);
+
+		INSTR_TIME_SUBTRACT(end_time, start_time);
+
+		/* multiply by 1e6 to get microsecs, divide by 1000 to cancel loop */
+		elog(LOG, "join_selectivity(opr %u, jointype %d) = %f, time %g us",
+			 operatorid, jointype, result,
+			 INSTR_TIME_GET_DOUBLE(end_time) * 1e3);
+	}
 
 	if (result < 0.0 || result > 1.0)
 		elog(ERROR, "invalid join selectivity: %f", result);
-- 
2.43.7

v5-0002-Factor-out-duplicative-code-in-eqjoinsel_inner-eq.patchtext/x-diff; charset=us-ascii; name*0=v5-0002-Factor-out-duplicative-code-in-eqjoinsel_inner-eq.p; name*1=atchDownload
From 162f58fe782e60d548a0598b0228c096438b9a44 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 13 Nov 2025 12:40:53 -0500
Subject: [PATCH v5 2/5] Factor out duplicative code in
 eqjoinsel_inner/eqjoinsel_semi.

These functions have essentially identical code for scanning the
two MCV lists and identifying which entries have matches in the
other list.  While it's not a huge amount of code, it's 50 or
so lines, and will be more after an upcoming patch to use a hash
table with many MCVs.  Let's reduce duplication by moving that
code into a common subroutine.

The one downside of doing this is that we must compute
sum(sslot1->numbers[i] * sslot2->numbers[j]) even though
eqjoinsel_semi won't need that.  But the cost of that appears
negligible, so I didn't trouble to invent a way of avoiding it.
---
 src/backend/utils/adt/selfuncs.c | 191 ++++++++++++++++---------------
 1 file changed, 99 insertions(+), 92 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index cb23ad52782..590b3a0c078 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -163,6 +163,11 @@ static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
 							 Form_pg_statistic stats1, Form_pg_statistic stats2,
 							 bool have_mcvs1, bool have_mcvs2,
 							 RelOptInfo *inner_rel);
+static void eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
+								   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
+								   int nvalues1, int nvalues2,
+								   bool *hasmatch1, bool *hasmatch2,
+								   int *p_nmatches, double *p_matchprodfreq);
 static bool estimate_multivariate_ndistinct(PlannerInfo *root,
 											RelOptInfo *rel, List **varinfos, double *ndistinct);
 static bool convert_to_scalar(Datum value, Oid valuetypid, Oid collid,
@@ -2473,8 +2478,6 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		 * results", Technical Report 1018, Computer Science Dept., University
 		 * of Wisconsin, Madison, March 1991 (available from ftp.cs.wisc.edu).
 		 */
-		LOCAL_FCINFO(fcinfo, 2);
-		FmgrInfo	eqproc;
 		bool	   *hasmatch1;
 		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
@@ -2491,55 +2494,17 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		int			i,
 					nmatches;
 
-		fmgr_info(opfuncoid, &eqproc);
-
-		/*
-		 * Save a few cycles by setting up the fcinfo struct just once. Using
-		 * FunctionCallInvoke directly also avoids failure if the eqproc
-		 * returns NULL, though really equality functions should never do
-		 * that.
-		 */
-		InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
-								 NULL, NULL);
-		fcinfo->args[0].isnull = false;
-		fcinfo->args[1].isnull = false;
-
+		/* Construct the match arrays */
 		hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
 		hasmatch2 = (bool *) palloc0(sslot2->nvalues * sizeof(bool));
 
-		/*
-		 * Note we assume that each MCV will match at most one member of the
-		 * other MCV list.  If the operator isn't really equality, there could
-		 * be multiple matches --- but we don't look for them, both for speed
-		 * and because the math wouldn't add up...
-		 */
-		matchprodfreq = 0.0;
-		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
-		{
-			int			j;
-
-			fcinfo->args[0].value = sslot1->values[i];
-
-			for (j = 0; j < sslot2->nvalues; j++)
-			{
-				Datum		fresult;
-
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
-				{
-					hasmatch1[i] = hasmatch2[j] = true;
-					matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
-					nmatches++;
-					break;
-				}
-			}
-		}
+		eqjoinsel_find_matches(opfuncoid, collation,
+							   sslot1, sslot2,
+							   sslot1->nvalues, sslot2->nvalues,
+							   hasmatch1, hasmatch2,
+							   &nmatches, &matchprodfreq);
 		CLAMP_PROBABILITY(matchprodfreq);
+
 		/* Sum up frequencies of matched and unmatched MCVs */
 		matchfreq1 = unmatchfreq1 = 0.0;
 		for (i = 0; i < sslot1->nvalues; i++)
@@ -2700,12 +2665,11 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 * lists.  We still have to estimate for the remaining population, but
 		 * in a skewed distribution this gives us a big leg up in accuracy.
 		 */
-		LOCAL_FCINFO(fcinfo, 2);
-		FmgrInfo	eqproc;
 		bool	   *hasmatch1;
 		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
-		double		matchfreq1,
+		double		matchprodfreq,
+					matchfreq1,
 					uncertainfrac,
 					uncertain;
 		int			i,
@@ -2721,52 +2685,16 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 */
 		clamped_nvalues2 = Min(sslot2->nvalues, nd2);
 
-		fmgr_info(opfuncoid, &eqproc);
-
-		/*
-		 * Save a few cycles by setting up the fcinfo struct just once. Using
-		 * FunctionCallInvoke directly also avoids failure if the eqproc
-		 * returns NULL, though really equality functions should never do
-		 * that.
-		 */
-		InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
-								 NULL, NULL);
-		fcinfo->args[0].isnull = false;
-		fcinfo->args[1].isnull = false;
-
+		/* Construct the match arrays */
 		hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
 		hasmatch2 = (bool *) palloc0(clamped_nvalues2 * sizeof(bool));
 
-		/*
-		 * Note we assume that each MCV will match at most one member of the
-		 * other MCV list.  If the operator isn't really equality, there could
-		 * be multiple matches --- but we don't look for them, both for speed
-		 * and because the math wouldn't add up...
-		 */
-		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
-		{
-			int			j;
-
-			fcinfo->args[0].value = sslot1->values[i];
-
-			for (j = 0; j < clamped_nvalues2; j++)
-			{
-				Datum		fresult;
+		eqjoinsel_find_matches(opfuncoid, collation,
+							   sslot1, sslot2,
+							   sslot1->nvalues, clamped_nvalues2,
+							   hasmatch1, hasmatch2,
+							   &nmatches, &matchprodfreq);
 
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
-				{
-					hasmatch1[i] = hasmatch2[j] = true;
-					nmatches++;
-					break;
-				}
-			}
-		}
 		/* Sum up frequencies of matched MCVs */
 		matchfreq1 = 0.0;
 		for (i = 0; i < sslot1->nvalues; i++)
@@ -2830,6 +2758,85 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 	return selec;
 }
 
+/*
+ * Identify matching MCVs for eqjoinsel_inner or eqjoinsel_semi.
+ *
+ * Inputs:
+ *	opfuncoid: OID of equality function to use (might be cross-type)
+ *	collation: OID of collation to use
+ *	sslot1, sslot2: MCV values for the lefthand and righthand inputs
+ *	nvalues1, nvalues2: number of values to be considered (can be less than
+ *		sslotN->nvalues, but not more)
+ * Outputs:
+ *	hasmatch1[], hasmatch2[]: pre-zeroed arrays of lengths nvalues1, nvalues2;
+ *		entries are set to true if that MCV has a match on the other side
+ *	*p_nmatches: receives number of MCV pairs that match
+ *	*p_matchprodfreq: receives sum(sslot1->numbers[i] * sslot2->numbers[j])
+ *		for matching MCVs
+ *
+ * Note we assume that each MCV will match at most one member of the other
+ * MCV list.  If the operator isn't really equality, there could be multiple
+ * matches --- but we don't look for them, both for speed and because the
+ * math wouldn't add up...
+ */
+static void
+eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
+					   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
+					   int nvalues1, int nvalues2,
+					   bool *hasmatch1, bool *hasmatch2,
+					   int *p_nmatches, double *p_matchprodfreq)
+{
+	LOCAL_FCINFO(fcinfo, 2);
+	FmgrInfo	eqproc;
+	double		matchprodfreq = 0.0;
+	int			nmatches = 0;
+
+	fmgr_info(opfuncoid, &eqproc);
+
+	/*
+	 * Save a few cycles by setting up the fcinfo struct just once.  Using
+	 * FunctionCallInvoke directly also avoids failure if the eqproc returns
+	 * NULL, though really equality functions should never do that.
+	 */
+	InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
+							 NULL, NULL);
+	fcinfo->args[0].isnull = false;
+	fcinfo->args[1].isnull = false;
+
+	/*
+	 * The reason for this extra level of braces will become apparent later.
+	 * For now, it just prevents having to re-indent this chunk of code moved
+	 * from eqjoinsel_inner.
+	 */
+	{
+		for (int i = 0; i < nvalues1; i++)
+		{
+			fcinfo->args[0].value = sslot1->values[i];
+
+			for (int j = 0; j < nvalues2; j++)
+			{
+				Datum		fresult;
+
+				if (hasmatch2[j])
+					continue;
+				fcinfo->args[1].value = sslot2->values[j];
+				fcinfo->isnull = false;
+				fresult = FunctionCallInvoke(fcinfo);
+				if (!fcinfo->isnull && DatumGetBool(fresult))
+				{
+					hasmatch1[i] = hasmatch2[j] = true;
+					matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
+					nmatches++;
+					break;
+				}
+			}
+		}
+	}
+
+	*p_nmatches = nmatches;
+	*p_matchprodfreq = matchprodfreq;
+}
+
 /*
  *		neqjoinsel		- Join selectivity of "!="
  */
-- 
2.43.7

v5-0003-Rethink-eqjoinsel-s-handling-of-reversed-joins.patchtext/x-diff; charset=us-ascii; name*0=v5-0003-Rethink-eqjoinsel-s-handling-of-reversed-joins.patc; name*1=hDownload
From c476028f989dd01d27ffa4b2c1a175c18f379d4a Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 13 Nov 2025 12:50:44 -0500
Subject: [PATCH v5 3/5] Rethink eqjoinsel's handling of reversed joins.

Formerly, if we needed to deal with a "reversed" join where the
outer-side variable is on the right hand of the given operator,
we looked up the operator's commutator and applied that, so that
eqjoinsel_semi could always treat "sslot1" as the outer-side
variable of the semijoin.

This isn't great, because we ended up punting to a poor estimate
if no commutator is recorded.  It also doesn't play well with
later changes in this patch series.  Instead, let's handle the
case by swapping the left and right input values just before
we call the comparison operator.  While this theoretically adds
cycles to the inner comparison loop, with the coding proposed
here I don't see any real timing difference.  (But I only tested
it on x86_64.)
---
 src/backend/utils/adt/selfuncs.c | 44 +++++++++++++++++++++++---------
 1 file changed, 32 insertions(+), 12 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 590b3a0c078..53653d2d05b 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -156,6 +156,7 @@ static double eqjoinsel_inner(Oid opfuncoid, Oid collation,
 							  Form_pg_statistic stats1, Form_pg_statistic stats2,
 							  bool have_mcvs1, bool have_mcvs2);
 static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
+							 bool op_is_reversed,
 							 VariableStatData *vardata1, VariableStatData *vardata2,
 							 double nd1, double nd2,
 							 bool isdefault1, bool isdefault2,
@@ -164,6 +165,7 @@ static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
 							 bool have_mcvs1, bool have_mcvs2,
 							 RelOptInfo *inner_rel);
 static void eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
+								   bool op_is_reversed,
 								   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 								   int nvalues1, int nvalues2,
 								   bool *hasmatch1, bool *hasmatch2,
@@ -2394,6 +2396,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 
 			if (!join_is_reversed)
 				selec = eqjoinsel_semi(opfuncoid, collation,
+									   false,
 									   &vardata1, &vardata2,
 									   nd1, nd2,
 									   isdefault1, isdefault2,
@@ -2402,11 +2405,8 @@ eqjoinsel(PG_FUNCTION_ARGS)
 									   have_mcvs1, have_mcvs2,
 									   inner_rel);
 			else
-			{
-				Oid			commop = get_commutator(operator);
-				Oid			commopfuncoid = OidIsValid(commop) ? get_opcode(commop) : InvalidOid;
-
-				selec = eqjoinsel_semi(commopfuncoid, collation,
+				selec = eqjoinsel_semi(opfuncoid, collation,
+									   true,
 									   &vardata2, &vardata1,
 									   nd2, nd1,
 									   isdefault2, isdefault1,
@@ -2414,7 +2414,6 @@ eqjoinsel(PG_FUNCTION_ARGS)
 									   stats2, stats1,
 									   have_mcvs2, have_mcvs1,
 									   inner_rel);
-			}
 
 			/*
 			 * We should never estimate the output of a semijoin to be more
@@ -2499,6 +2498,7 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		hasmatch2 = (bool *) palloc0(sslot2->nvalues * sizeof(bool));
 
 		eqjoinsel_find_matches(opfuncoid, collation,
+							   false,
 							   sslot1, sslot2,
 							   sslot1->nvalues, sslot2->nvalues,
 							   hasmatch1, hasmatch2,
@@ -2607,11 +2607,13 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
  * eqjoinsel_semi --- eqjoinsel for semi join
  *
  * (Also used for anti join, which we are supposed to estimate the same way.)
- * Caller has ensured that vardata1 is the LHS variable.
- * Unlike eqjoinsel_inner, we have to cope with opfuncoid being InvalidOid.
+ * Caller has ensured that vardata1 is the LHS variable; however, opfuncoid
+ * is for the original join operator, which might now need to have the inputs
+ * swapped in order to apply correctly.
  */
 static double
 eqjoinsel_semi(Oid opfuncoid, Oid collation,
+			   bool op_is_reversed,
 			   VariableStatData *vardata1, VariableStatData *vardata2,
 			   double nd1, double nd2,
 			   bool isdefault1, bool isdefault2,
@@ -2655,7 +2657,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		isdefault2 = false;
 	}
 
-	if (have_mcvs1 && have_mcvs2 && OidIsValid(opfuncoid))
+	if (have_mcvs1 && have_mcvs2)
 	{
 		/*
 		 * We have most-common-value lists for both relations.  Run through
@@ -2690,6 +2692,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		hasmatch2 = (bool *) palloc0(clamped_nvalues2 * sizeof(bool));
 
 		eqjoinsel_find_matches(opfuncoid, collation,
+							   op_is_reversed,
 							   sslot1, sslot2,
 							   sslot1->nvalues, clamped_nvalues2,
 							   hasmatch1, hasmatch2,
@@ -2762,8 +2765,9 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
  * Identify matching MCVs for eqjoinsel_inner or eqjoinsel_semi.
  *
  * Inputs:
- *	opfuncoid: OID of equality function to use (might be cross-type)
+ *	opfuncoid: OID of equality function to use (might be reversed)
  *	collation: OID of collation to use
+ *	op_is_reversed: indicates that opfuncoid compares right type to left type
  *	sslot1, sslot2: MCV values for the lefthand and righthand inputs
  *	nvalues1, nvalues2: number of values to be considered (can be less than
  *		sslotN->nvalues, but not more)
@@ -2781,6 +2785,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
  */
 static void
 eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
+					   bool op_is_reversed,
 					   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 					   int nvalues1, int nvalues2,
 					   bool *hasmatch1, bool *hasmatch2,
@@ -2809,9 +2814,24 @@ eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
 	 * from eqjoinsel_inner.
 	 */
 	{
+		int			index1,
+					index2;
+
+		/* Set up to supply the values in the order the operator expects */
+		if (op_is_reversed)
+		{
+			index1 = 1;
+			index2 = 0;
+		}
+		else
+		{
+			index1 = 0;
+			index2 = 1;
+		}
+
 		for (int i = 0; i < nvalues1; i++)
 		{
-			fcinfo->args[0].value = sslot1->values[i];
+			fcinfo->args[index1].value = sslot1->values[i];
 
 			for (int j = 0; j < nvalues2; j++)
 			{
@@ -2819,7 +2839,7 @@ eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
 
 				if (hasmatch2[j])
 					continue;
-				fcinfo->args[1].value = sslot2->values[j];
+				fcinfo->args[index2].value = sslot2->values[j];
 				fcinfo->isnull = false;
 				fresult = FunctionCallInvoke(fcinfo);
 				if (!fcinfo->isnull && DatumGetBool(fresult))
-- 
2.43.7

v5-0004-Share-more-work-between-eqjoinsel_inner-and-eqjoi.patchtext/x-diff; charset=us-ascii; name*0=v5-0004-Share-more-work-between-eqjoinsel_inner-and-eqjoi.p; name*1=atchDownload
From f9b45278ee55e03d363b45d8bce518e7695fb5f4 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 13 Nov 2025 12:59:21 -0500
Subject: [PATCH v5 4/5] Share more work between eqjoinsel_inner and
 eqjoinsel_semi.

Originally, only one of eqjoinsel_inner and eqjoinsel_semi was
invoked per eqjoinsel call, so the fact that they duplicated a
good deal of work was irrelevant to performance.  But since commit
a314c3407, the semi/antijoin case calls both, and that is really
expensive if there are a lot of MCVs to match.  Refactor so that
we can re-use eqjoinsel_inner's matching results except in the
(uncommon) case where eqjoinsel_semi clamps the RHS MCV list size
because it's less than the expected number of rows to be fetched
from the RHS rel.  This doesn't seem to create any performance
penalty for non-semijoin cases.

While at it, we can avoid doing fmgr_info twice too.
I considered also avoiding duplicate InitFunctionCallInfoData
calls, but desisted: that wouldn't save very much, and in my
tests it looks like there may be some performance advantage
if fcinfo is a local variable.
---
 src/backend/utils/adt/selfuncs.c | 115 +++++++++++++++++++------------
 1 file changed, 72 insertions(+), 43 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 53653d2d05b..b4ed12a3737 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -148,14 +148,15 @@ get_relation_stats_hook_type get_relation_stats_hook = NULL;
 get_index_stats_hook_type get_index_stats_hook = NULL;
 
 static double eqsel_internal(PG_FUNCTION_ARGS, bool negate);
-static double eqjoinsel_inner(Oid opfuncoid, Oid collation,
+static double eqjoinsel_inner(FmgrInfo *eqproc, Oid collation,
 							  VariableStatData *vardata1, VariableStatData *vardata2,
 							  double nd1, double nd2,
 							  bool isdefault1, bool isdefault2,
 							  AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 							  Form_pg_statistic stats1, Form_pg_statistic stats2,
-							  bool have_mcvs1, bool have_mcvs2);
-static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
+							  bool have_mcvs1, bool have_mcvs2,
+							  bool *hasmatch1, bool *hasmatch2);
+static double eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
 							 bool op_is_reversed,
 							 VariableStatData *vardata1, VariableStatData *vardata2,
 							 double nd1, double nd2,
@@ -163,8 +164,9 @@ static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
 							 AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 							 Form_pg_statistic stats1, Form_pg_statistic stats2,
 							 bool have_mcvs1, bool have_mcvs2,
+							 bool *hasmatch1, bool *hasmatch2,
 							 RelOptInfo *inner_rel);
-static void eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
+static void eqjoinsel_find_matches(FmgrInfo *eqproc, Oid collation,
 								   bool op_is_reversed,
 								   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 								   int nvalues1, int nvalues2,
@@ -2311,12 +2313,15 @@ eqjoinsel(PG_FUNCTION_ARGS)
 	bool		isdefault1;
 	bool		isdefault2;
 	Oid			opfuncoid;
+	FmgrInfo	eqproc;
 	AttStatsSlot sslot1;
 	AttStatsSlot sslot2;
 	Form_pg_statistic stats1 = NULL;
 	Form_pg_statistic stats2 = NULL;
 	bool		have_mcvs1 = false;
 	bool		have_mcvs2 = false;
+	bool	   *hasmatch1 = NULL;
+	bool	   *hasmatch2 = NULL;
 	bool		get_mcv_stats;
 	bool		join_is_reversed;
 	RelOptInfo *inner_rel;
@@ -2367,14 +2372,25 @@ eqjoinsel(PG_FUNCTION_ARGS)
 										  ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS);
 	}
 
+	/* Prepare info usable by both eqjoinsel_inner and eqjoinsel_semi */
+	if (have_mcvs1 && have_mcvs2)
+	{
+		fmgr_info(opfuncoid, &eqproc);
+		hasmatch1 = (bool *) palloc0(sslot1.nvalues * sizeof(bool));
+		hasmatch2 = (bool *) palloc0(sslot2.nvalues * sizeof(bool));
+	}
+	else
+		memset(&eqproc, 0, sizeof(eqproc)); /* silence uninit-var warnings */
+
 	/* We need to compute the inner-join selectivity in all cases */
-	selec_inner = eqjoinsel_inner(opfuncoid, collation,
+	selec_inner = eqjoinsel_inner(&eqproc, collation,
 								  &vardata1, &vardata2,
 								  nd1, nd2,
 								  isdefault1, isdefault2,
 								  &sslot1, &sslot2,
 								  stats1, stats2,
-								  have_mcvs1, have_mcvs2);
+								  have_mcvs1, have_mcvs2,
+								  hasmatch1, hasmatch2);
 
 	switch (sjinfo->jointype)
 	{
@@ -2395,7 +2411,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 			inner_rel = find_join_input_rel(root, sjinfo->min_righthand);
 
 			if (!join_is_reversed)
-				selec = eqjoinsel_semi(opfuncoid, collation,
+				selec = eqjoinsel_semi(&eqproc, collation,
 									   false,
 									   &vardata1, &vardata2,
 									   nd1, nd2,
@@ -2403,9 +2419,10 @@ eqjoinsel(PG_FUNCTION_ARGS)
 									   &sslot1, &sslot2,
 									   stats1, stats2,
 									   have_mcvs1, have_mcvs2,
+									   hasmatch1, hasmatch2,
 									   inner_rel);
 			else
-				selec = eqjoinsel_semi(opfuncoid, collation,
+				selec = eqjoinsel_semi(&eqproc, collation,
 									   true,
 									   &vardata2, &vardata1,
 									   nd2, nd1,
@@ -2413,6 +2430,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 									   &sslot2, &sslot1,
 									   stats2, stats1,
 									   have_mcvs2, have_mcvs1,
+									   hasmatch2, hasmatch1,
 									   inner_rel);
 
 			/*
@@ -2441,6 +2459,11 @@ eqjoinsel(PG_FUNCTION_ARGS)
 	ReleaseVariableStats(vardata1);
 	ReleaseVariableStats(vardata2);
 
+	if (hasmatch1)
+		pfree(hasmatch1);
+	if (hasmatch2)
+		pfree(hasmatch2);
+
 	CLAMP_PROBABILITY(selec);
 
 	PG_RETURN_FLOAT8((float8) selec);
@@ -2449,17 +2472,22 @@ eqjoinsel(PG_FUNCTION_ARGS)
 /*
  * eqjoinsel_inner --- eqjoinsel for normal inner join
  *
+ * In addition to computing the selectivity estimate, this will fill
+ * the hasmatch1[] and hasmatch2[] arrays (if have_mcvs1 && have_mcvs2).
+ * We may be able to re-use that data in eqjoinsel_semi.
+ *
  * We also use this for LEFT/FULL outer joins; it's not presently clear
  * that it's worth trying to distinguish them here.
  */
 static double
-eqjoinsel_inner(Oid opfuncoid, Oid collation,
+eqjoinsel_inner(FmgrInfo *eqproc, Oid collation,
 				VariableStatData *vardata1, VariableStatData *vardata2,
 				double nd1, double nd2,
 				bool isdefault1, bool isdefault2,
 				AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 				Form_pg_statistic stats1, Form_pg_statistic stats2,
-				bool have_mcvs1, bool have_mcvs2)
+				bool have_mcvs1, bool have_mcvs2,
+				bool *hasmatch1, bool *hasmatch2)
 {
 	double		selec;
 
@@ -2477,8 +2505,6 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		 * results", Technical Report 1018, Computer Science Dept., University
 		 * of Wisconsin, Madison, March 1991 (available from ftp.cs.wisc.edu).
 		 */
-		bool	   *hasmatch1;
-		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
 		double		nullfrac2 = stats2->stanullfrac;
 		double		matchprodfreq,
@@ -2493,11 +2519,8 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		int			i,
 					nmatches;
 
-		/* Construct the match arrays */
-		hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
-		hasmatch2 = (bool *) palloc0(sslot2->nvalues * sizeof(bool));
-
-		eqjoinsel_find_matches(opfuncoid, collation,
+		/* Fill the match arrays */
+		eqjoinsel_find_matches(eqproc, collation,
 							   false,
 							   sslot1, sslot2,
 							   sslot1->nvalues, sslot2->nvalues,
@@ -2526,8 +2549,6 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		}
 		CLAMP_PROBABILITY(matchfreq2);
 		CLAMP_PROBABILITY(unmatchfreq2);
-		pfree(hasmatch1);
-		pfree(hasmatch2);
 
 		/*
 		 * Compute total frequency of non-null values that are not in the MCV
@@ -2607,12 +2628,13 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
  * eqjoinsel_semi --- eqjoinsel for semi join
  *
  * (Also used for anti join, which we are supposed to estimate the same way.)
- * Caller has ensured that vardata1 is the LHS variable; however, opfuncoid
+ * Caller has ensured that vardata1 is the LHS variable; however, eqproc
  * is for the original join operator, which might now need to have the inputs
- * swapped in order to apply correctly.
+ * swapped in order to apply correctly.  Also, if have_mcvs1 && have_mcvs2
+ * then hasmatch1[] and hasmatch2[] were filled by eqjoinsel_inner.
  */
 static double
-eqjoinsel_semi(Oid opfuncoid, Oid collation,
+eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
 			   bool op_is_reversed,
 			   VariableStatData *vardata1, VariableStatData *vardata2,
 			   double nd1, double nd2,
@@ -2620,6 +2642,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 			   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 			   Form_pg_statistic stats1, Form_pg_statistic stats2,
 			   bool have_mcvs1, bool have_mcvs2,
+			   bool *hasmatch1, bool *hasmatch2,
 			   RelOptInfo *inner_rel)
 {
 	double		selec;
@@ -2667,8 +2690,6 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 * lists.  We still have to estimate for the remaining population, but
 		 * in a skewed distribution this gives us a big leg up in accuracy.
 		 */
-		bool	   *hasmatch1;
-		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
 		double		matchprodfreq,
 					matchfreq1,
@@ -2687,16 +2708,29 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 */
 		clamped_nvalues2 = Min(sslot2->nvalues, nd2);
 
-		/* Construct the match arrays */
-		hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
-		hasmatch2 = (bool *) palloc0(clamped_nvalues2 * sizeof(bool));
-
-		eqjoinsel_find_matches(opfuncoid, collation,
-							   op_is_reversed,
-							   sslot1, sslot2,
-							   sslot1->nvalues, clamped_nvalues2,
-							   hasmatch1, hasmatch2,
-							   &nmatches, &matchprodfreq);
+		/*
+		 * If we did not set clamped_nvalues2 to less than sslot2->nvalues,
+		 * then the hasmatch1[] and hasmatch2[] match flags computed by
+		 * eqjoinsel_inner are still perfectly applicable, so we need not
+		 * re-do the matching work.  Note that it does not matter if
+		 * op_is_reversed: we'd get the same answers.
+		 *
+		 * If we did clamp, then a different set of sslot2 values is to be
+		 * compared, so we have to re-do the matching.
+		 */
+		if (clamped_nvalues2 != sslot2->nvalues)
+		{
+			/* Must re-zero the arrays */
+			memset(hasmatch1, 0, sslot1->nvalues * sizeof(bool));
+			memset(hasmatch2, 0, clamped_nvalues2 * sizeof(bool));
+			/* Re-fill the match arrays */
+			eqjoinsel_find_matches(eqproc, collation,
+								   op_is_reversed,
+								   sslot1, sslot2,
+								   sslot1->nvalues, clamped_nvalues2,
+								   hasmatch1, hasmatch2,
+								   &nmatches, &matchprodfreq);
+		}
 
 		/* Sum up frequencies of matched MCVs */
 		matchfreq1 = 0.0;
@@ -2706,8 +2740,6 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 				matchfreq1 += sslot1->numbers[i];
 		}
 		CLAMP_PROBABILITY(matchfreq1);
-		pfree(hasmatch1);
-		pfree(hasmatch2);
 
 		/*
 		 * Now we need to estimate the fraction of relation 1 that has at
@@ -2765,9 +2797,9 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
  * Identify matching MCVs for eqjoinsel_inner or eqjoinsel_semi.
  *
  * Inputs:
- *	opfuncoid: OID of equality function to use (might be reversed)
+ *	eqproc: FmgrInfo for equality function to use (might be reversed)
  *	collation: OID of collation to use
- *	op_is_reversed: indicates that opfuncoid compares right type to left type
+ *	op_is_reversed: indicates that eqproc compares right type to left type
  *	sslot1, sslot2: MCV values for the lefthand and righthand inputs
  *	nvalues1, nvalues2: number of values to be considered (can be less than
  *		sslotN->nvalues, but not more)
@@ -2784,7 +2816,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
  * math wouldn't add up...
  */
 static void
-eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
+eqjoinsel_find_matches(FmgrInfo *eqproc, Oid collation,
 					   bool op_is_reversed,
 					   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 					   int nvalues1, int nvalues2,
@@ -2792,18 +2824,15 @@ eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
 					   int *p_nmatches, double *p_matchprodfreq)
 {
 	LOCAL_FCINFO(fcinfo, 2);
-	FmgrInfo	eqproc;
 	double		matchprodfreq = 0.0;
 	int			nmatches = 0;
 
-	fmgr_info(opfuncoid, &eqproc);
-
 	/*
 	 * Save a few cycles by setting up the fcinfo struct just once.  Using
 	 * FunctionCallInvoke directly also avoids failure if the eqproc returns
 	 * NULL, though really equality functions should never do that.
 	 */
-	InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
+	InitFunctionCallInfoData(*fcinfo, eqproc, 2, collation,
 							 NULL, NULL);
 	fcinfo->args[0].isnull = false;
 	fcinfo->args[1].isnull = false;
-- 
2.43.7

v5-0005-Use-hashing-to-avoid-O-N-2-matching-work-in-eqjoi.patchtext/x-diff; charset=us-ascii; name*0=v5-0005-Use-hashing-to-avoid-O-N-2-matching-work-in-eqjoi.p; name*1=atchDownload
From 331e8a35118699cb6d4076aa65ddbfa44a905665 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 13 Nov 2025 16:55:43 -0500
Subject: [PATCH v5 5/5] Use hashing to avoid O(N^2) matching work in
 eqjoinsel.

Use a simplehash hash table if there are enough MCVs and the
join operator has associated hash functions.  The threshold
for switching to hash mode perhaps could use more research.
---
 src/backend/utils/adt/selfuncs.c | 245 ++++++++++++++++++++++++++++++-
 src/tools/pgindent/typedefs.list |   3 +
 2 files changed, 243 insertions(+), 5 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index b4ed12a3737..a68d5423874 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -143,12 +143,47 @@
 
 #define DEFAULT_PAGE_CPU_MULTIPLIER 50.0
 
+/*
+ * In production builds, switch to hash-based MCV matching when lists are
+ * large enough to amortize hash setup cost.  In debug builds, we use a
+ * smaller threshold so that the regression tests cover both paths well.
+ */
+#ifndef USE_ASSERT_CHECKING
+#define EQJOINSEL_MCV_HASH_THRESHOLD 100
+#else
+#define EQJOINSEL_MCV_HASH_THRESHOLD 10
+#endif
+
+/* Entries in the simplehash hash table used by eqjoinsel_find_matches */
+typedef struct McvHashEntry
+{
+	Datum		value;			/* the value represented by this entry */
+	int			index;			/* its index in the relevant AttStatsSlot */
+	uint32		hash;			/* hash code for the Datum */
+	char		status;			/* status code used by simplehash.h */
+} McvHashEntry;
+
+/* private_data for the simplehash hash table */
+typedef struct McvHashContext
+{
+	FunctionCallInfo equal_fcinfo;	/* the equality join operator */
+	FunctionCallInfo hash_fcinfo;	/* the hash function to use */
+	bool		op_is_reversed; /* equality compares hash type to probe type */
+	bool		insert_mode;	/* doing inserts or lookups? */
+	bool		hash_typbyval;	/* typbyval of hashed data type */
+	int16		hash_typlen;	/* typlen of hashed data type */
+} McvHashContext;
+
+/* forward reference */
+typedef struct McvHashTable_hash McvHashTable_hash;
+
 /* Hooks for plugins to get control when we ask for stats */
 get_relation_stats_hook_type get_relation_stats_hook = NULL;
 get_index_stats_hook_type get_index_stats_hook = NULL;
 
 static double eqsel_internal(PG_FUNCTION_ARGS, bool negate);
 static double eqjoinsel_inner(FmgrInfo *eqproc, Oid collation,
+							  Oid hashLeft, Oid hashRight,
 							  VariableStatData *vardata1, VariableStatData *vardata2,
 							  double nd1, double nd2,
 							  bool isdefault1, bool isdefault2,
@@ -157,6 +192,7 @@ static double eqjoinsel_inner(FmgrInfo *eqproc, Oid collation,
 							  bool have_mcvs1, bool have_mcvs2,
 							  bool *hasmatch1, bool *hasmatch2);
 static double eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
+							 Oid hashLeft, Oid hashRight,
 							 bool op_is_reversed,
 							 VariableStatData *vardata1, VariableStatData *vardata2,
 							 double nd1, double nd2,
@@ -167,11 +203,14 @@ static double eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
 							 bool *hasmatch1, bool *hasmatch2,
 							 RelOptInfo *inner_rel);
 static void eqjoinsel_find_matches(FmgrInfo *eqproc, Oid collation,
+								   Oid hashLeft, Oid hashRight,
 								   bool op_is_reversed,
 								   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 								   int nvalues1, int nvalues2,
 								   bool *hasmatch1, bool *hasmatch2,
 								   int *p_nmatches, double *p_matchprodfreq);
+static uint32 hash_mcv(McvHashTable_hash *tab, Datum key);
+static bool mcvs_equal(McvHashTable_hash *tab, Datum key0, Datum key1);
 static bool estimate_multivariate_ndistinct(PlannerInfo *root,
 											RelOptInfo *rel, List **varinfos, double *ndistinct);
 static bool convert_to_scalar(Datum value, Oid valuetypid, Oid collid,
@@ -227,6 +266,20 @@ static RelOptInfo *find_join_input_rel(PlannerInfo *root, Relids relids);
 static double btcost_correlation(IndexOptInfo *index,
 								 VariableStatData *vardata);
 
+/* Define support routines for MCV hash tables */
+#define SH_PREFIX				McvHashTable
+#define SH_ELEMENT_TYPE			McvHashEntry
+#define SH_KEY_TYPE				Datum
+#define SH_KEY					value
+#define SH_HASH_KEY(tab,key)	hash_mcv(tab, key)
+#define SH_EQUAL(tab,key0,key1)	mcvs_equal(tab, key0, key1)
+#define SH_SCOPE				static inline
+#define SH_STORE_HASH
+#define SH_GET_HASH(tab,ent)	(ent)->hash
+#define SH_DEFINE
+#define SH_DECLARE
+#include "lib/simplehash.h"
+
 
 /*
  *		eqsel			- Selectivity of "=" for any data types.
@@ -2314,6 +2367,8 @@ eqjoinsel(PG_FUNCTION_ARGS)
 	bool		isdefault2;
 	Oid			opfuncoid;
 	FmgrInfo	eqproc;
+	Oid			hashLeft = InvalidOid;
+	Oid			hashRight = InvalidOid;
 	AttStatsSlot sslot1;
 	AttStatsSlot sslot2;
 	Form_pg_statistic stats1 = NULL;
@@ -2378,12 +2433,20 @@ eqjoinsel(PG_FUNCTION_ARGS)
 		fmgr_info(opfuncoid, &eqproc);
 		hasmatch1 = (bool *) palloc0(sslot1.nvalues * sizeof(bool));
 		hasmatch2 = (bool *) palloc0(sslot2.nvalues * sizeof(bool));
+
+		/*
+		 * If the MCV lists are long enough to justify hashing, try to look up
+		 * hash functions for the join operator.  XXX should this be Max()?
+		 */
+		if (Min(sslot1.nvalues, sslot2.nvalues) >= EQJOINSEL_MCV_HASH_THRESHOLD)
+			(void) get_op_hash_functions(operator, &hashLeft, &hashRight);
 	}
 	else
 		memset(&eqproc, 0, sizeof(eqproc)); /* silence uninit-var warnings */
 
 	/* We need to compute the inner-join selectivity in all cases */
 	selec_inner = eqjoinsel_inner(&eqproc, collation,
+								  hashLeft, hashRight,
 								  &vardata1, &vardata2,
 								  nd1, nd2,
 								  isdefault1, isdefault2,
@@ -2412,6 +2475,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 
 			if (!join_is_reversed)
 				selec = eqjoinsel_semi(&eqproc, collation,
+									   hashLeft, hashRight,
 									   false,
 									   &vardata1, &vardata2,
 									   nd1, nd2,
@@ -2423,6 +2487,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 									   inner_rel);
 			else
 				selec = eqjoinsel_semi(&eqproc, collation,
+									   hashLeft, hashRight,
 									   true,
 									   &vardata2, &vardata1,
 									   nd2, nd1,
@@ -2481,6 +2546,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
  */
 static double
 eqjoinsel_inner(FmgrInfo *eqproc, Oid collation,
+				Oid hashLeft, Oid hashRight,
 				VariableStatData *vardata1, VariableStatData *vardata2,
 				double nd1, double nd2,
 				bool isdefault1, bool isdefault2,
@@ -2521,6 +2587,7 @@ eqjoinsel_inner(FmgrInfo *eqproc, Oid collation,
 
 		/* Fill the match arrays */
 		eqjoinsel_find_matches(eqproc, collation,
+							   hashLeft, hashRight,
 							   false,
 							   sslot1, sslot2,
 							   sslot1->nvalues, sslot2->nvalues,
@@ -2635,6 +2702,7 @@ eqjoinsel_inner(FmgrInfo *eqproc, Oid collation,
  */
 static double
 eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
+			   Oid hashLeft, Oid hashRight,
 			   bool op_is_reversed,
 			   VariableStatData *vardata1, VariableStatData *vardata2,
 			   double nd1, double nd2,
@@ -2725,6 +2793,7 @@ eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
 			memset(hasmatch2, 0, clamped_nvalues2 * sizeof(bool));
 			/* Re-fill the match arrays */
 			eqjoinsel_find_matches(eqproc, collation,
+								   hashLeft, hashRight,
 								   op_is_reversed,
 								   sslot1, sslot2,
 								   sslot1->nvalues, clamped_nvalues2,
@@ -2799,6 +2868,8 @@ eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
  * Inputs:
  *	eqproc: FmgrInfo for equality function to use (might be reversed)
  *	collation: OID of collation to use
+ *	hashLeft, hashRight: OIDs of hash functions associated with equality op,
+ *		or InvalidOid if we're not to use hashing
  *	op_is_reversed: indicates that eqproc compares right type to left type
  *	sslot1, sslot2: MCV values for the lefthand and righthand inputs
  *	nvalues1, nvalues2: number of values to be considered (can be less than
@@ -2810,6 +2881,9 @@ eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
  *	*p_matchprodfreq: receives sum(sslot1->numbers[i] * sslot2->numbers[j])
  *		for matching MCVs
  *
+ * Note that hashLeft is for the eqproc's left-hand input type, hashRight
+ * for its right, regardless of op_is_reversed.
+ *
  * Note we assume that each MCV will match at most one member of the other
  * MCV list.  If the operator isn't really equality, there could be multiple
  * matches --- but we don't look for them, both for speed and because the
@@ -2817,6 +2891,7 @@ eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
  */
 static void
 eqjoinsel_find_matches(FmgrInfo *eqproc, Oid collation,
+					   Oid hashLeft, Oid hashRight,
 					   bool op_is_reversed,
 					   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 					   int nvalues1, int nvalues2,
@@ -2837,12 +2912,111 @@ eqjoinsel_find_matches(FmgrInfo *eqproc, Oid collation,
 	fcinfo->args[0].isnull = false;
 	fcinfo->args[1].isnull = false;
 
-	/*
-	 * The reason for this extra level of braces will become apparent later.
-	 * For now, it just prevents having to re-indent this chunk of code moved
-	 * from eqjoinsel_inner.
-	 */
+	if (OidIsValid(hashLeft) && OidIsValid(hashRight))
+	{
+		/* Use a hash table to speed up the matching */
+		LOCAL_FCINFO(hash_fcinfo, 1);
+		FmgrInfo	hash_proc;
+		McvHashContext hashContext;
+		McvHashTable_hash *hashTable;
+		AttStatsSlot *statsProbe;
+		AttStatsSlot *statsHash;
+		bool	   *hasMatchProbe;
+		bool	   *hasMatchHash;
+		int			nvaluesProbe;
+		int			nvaluesHash;
+
+		/* Make sure we build the hash table on the smaller array. */
+		if (sslot1->nvalues >= sslot2->nvalues)
+		{
+			statsProbe = sslot1;
+			statsHash = sslot2;
+			hasMatchProbe = hasmatch1;
+			hasMatchHash = hasmatch2;
+			nvaluesProbe = nvalues1;
+			nvaluesHash = nvalues2;
+		}
+		else
+		{
+			/* We'll have to reverse the direction of use of the operator. */
+			op_is_reversed = !op_is_reversed;
+			statsProbe = sslot2;
+			statsHash = sslot1;
+			hasMatchProbe = hasmatch2;
+			hasMatchHash = hasmatch1;
+			nvaluesProbe = nvalues2;
+			nvaluesHash = nvalues1;
+		}
+
+		/*
+		 * Build the hash table on the smaller array, using the appropriate
+		 * hash function for its data type.
+		 */
+		fmgr_info(op_is_reversed ? hashLeft : hashRight, &hash_proc);
+		InitFunctionCallInfoData(*hash_fcinfo, &hash_proc, 1, collation,
+								 NULL, NULL);
+		hash_fcinfo->args[0].isnull = false;
+
+		hashContext.equal_fcinfo = fcinfo;
+		hashContext.hash_fcinfo = hash_fcinfo;
+		hashContext.op_is_reversed = op_is_reversed;
+		hashContext.insert_mode = true;
+		get_typlenbyval(statsHash->valuetype,
+						&hashContext.hash_typlen,
+						&hashContext.hash_typbyval);
+
+		hashTable = McvHashTable_create(CurrentMemoryContext,
+										nvaluesHash,
+										&hashContext);
+
+		for (int i = 0; i < nvaluesHash; i++)
+		{
+			bool		found = false;
+			McvHashEntry *entry = McvHashTable_insert(hashTable,
+													  statsHash->values[i],
+													  &found);
+
+			Assert(!found);		/* XXX seems possibly unsafe */
+			entry->index = i;
+		}
+
+		/*
+		 * Prepare to probe the hash table.  If the probe values are of a
+		 * different data type, then we need to change hash functions.  (This
+		 * code relies on the assumption that since we defined SH_STORE_HASH,
+		 * simplehash.h will never need to compute hash values for existing
+		 * hash table entries.)
+		 */
+		hashContext.insert_mode = false;
+		if (hashLeft != hashRight)
+		{
+			fmgr_info(op_is_reversed ? hashRight : hashLeft, &hash_proc);
+			/* Resetting hash_fcinfo is probably unnecessary, but be safe */
+			InitFunctionCallInfoData(*hash_fcinfo, &hash_proc, 1, collation,
+									 NULL, NULL);
+			hash_fcinfo->args[0].isnull = false;
+		}
+
+		/* Look up each probe value in turn. */
+		for (int i = 0; i < nvaluesProbe; i++)
+		{
+			McvHashEntry *entry = McvHashTable_lookup(hashTable,
+													  statsProbe->values[i]);
+
+			/* As in the other code path, skip already-matched hash entries */
+			if (entry != NULL && !hasMatchHash[entry->index])
+			{
+				hasMatchHash[entry->index] = hasMatchProbe[i] = true;
+				nmatches++;
+				matchprodfreq += statsHash->numbers[entry->index] * statsProbe->numbers[i];
+			}
+		}
+
+		McvHashTable_destroy(hashTable);
+	}
+	else
 	{
+		/* We're not to use hashing, so do it the O(N^2) way */
 		int			index1,
 					index2;
 
@@ -2886,6 +3060,67 @@ eqjoinsel_find_matches(FmgrInfo *eqproc, Oid collation,
 	*p_matchprodfreq = matchprodfreq;
 }
 
+/*
+ * Support functions for the hash tables used by eqjoinsel_find_matches
+ */
+static uint32
+hash_mcv(McvHashTable_hash *tab, Datum key)
+{
+	McvHashContext *context = (McvHashContext *) tab->private_data;
+	FunctionCallInfo fcinfo = context->hash_fcinfo;
+	Datum		fresult;
+
+	fcinfo->args[0].value = key;
+	fcinfo->isnull = false;
+	fresult = FunctionCallInvoke(fcinfo);
+	Assert(!fcinfo->isnull);
+	return DatumGetUInt32(fresult);
+}
+
+static bool
+mcvs_equal(McvHashTable_hash *tab, Datum key0, Datum key1)
+{
+	McvHashContext *context = (McvHashContext *) tab->private_data;
+
+	if (context->insert_mode)
+	{
+		/*
+		 * During the insertion step, any comparisons will be between two
+		 * Datums of the hash table's data type, so if the given operator is
+		 * cross-type it will be the wrong thing to use.  Fortunately, we can
+		 * use datum_image_eq instead.  The MCV values should all be distinct
+		 * anyway, so it's mostly pro-forma to compare them at all.
+		 */
+		return datum_image_eq(key0, key1,
+							  context->hash_typbyval, context->hash_typlen);
+	}
+	else
+	{
+		FunctionCallInfo fcinfo = context->equal_fcinfo;
+		Datum		fresult;
+
+		/*
+		 * Apply the operator the correct way around.  Although simplehash.h
+		 * doesn't document this explicitly, during lookups key0 is from the
+		 * hash table while key1 is the probe value, so we should compare them
+		 * in that order only if op_is_reversed.
+		 */
+		if (context->op_is_reversed)
+		{
+			fcinfo->args[0].value = key0;
+			fcinfo->args[1].value = key1;
+		}
+		else
+		{
+			fcinfo->args[0].value = key1;
+			fcinfo->args[1].value = key0;
+		}
+		fcinfo->isnull = false;
+		fresult = FunctionCallInvoke(fcinfo);
+		return (!fcinfo->isnull && DatumGetBool(fresult));
+	}
+}
+
 /*
  *		neqjoinsel		- Join selectivity of "!="
  */
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index 23bce72ae64..ac5c6ba9833 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -1666,6 +1666,9 @@ ManyTestResourceKind
 Material
 MaterialPath
 MaterialState
+McvHashContext
+McvHashEntry
+McvHashTable_hash
 MdPathStr
 MdfdVec
 Memoize
-- 
2.43.7

#26David Geier
geidav.pg@gmail.com
In reply to: Ilia Evdokimov (#20)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi Ilia!

On 13.10.2025 12:08, Ilia Evdokimov wrote:

On 17.09.2025 12:40, Ilia Evdokimov wrote:

Hi David,

In v2 patch, when the join is reversed we pass the commutator operator
Oid to eqjoinsel_semi(), and inside that function we immediately call
get_opcode(<commutator operator Oid>). Did you mean for the function
to take an operator Oid instead of an here?

If that was unintentional, perhaps the cleanest fix is to add a new
'operator' parameter to eqjoinsel_semi() so we can keep passing
'opfuncoid' as before and avoid changing the behavior.

This v3 patch fixes the confusion between operator and function Oids in
eqjoinsel_semi(). This version restores the previous behavior by keeping
the function Oid as before and adds an explicit 'operator' parameter so
both values are available without extra behavior changes.

Do you have any further comments or suggestions on this version?

I'm sorry for missing your email with the test results. I'll read up on
it as well as the v3 patch early next week and reply.

--
David Geier

#27Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: Tom Lane (#25)
Re: Use merge-based matching for MCVs in eqjoinsel

On 14.11.2025 01:21, Tom Lane wrote:

This didn't look very much like the refactorization that I had in
mind: I thought we should have one copy of the matching code, not two.
Also, after looking closer at your patch I realized you were just
punting for cross-type comparison operators, which I felt was kind
of sad. It's a little bit tricky to get simplehash.h to go along
with cross-type hashing, because it wants to use just one hash and
one equality function. But since those are interface routines we
are going to supply anyway, we can make them deal with the insert
and lookup cases differently.

I had considered the cross-type comparison operators and I didn’t see a
clean way to support them, so I intentionally excluded cross-type cases
from hash probing. Your suggestion to switch the hash function in probe
mode is clearly a more correct approach than simply rejecting those
cases. Thanks for the explanation.

So after a bit of hacking I ended up with the attached. I split up
the refactorization into several steps to make it easier to review.
(But I'd anticipate squashing these into one commit in the end,
so I didn't spend a lot of time on the commit messages.)

I reviewed patches 0002-0004 with the refactoring, and I think the
overall approach is excellent. However, I noticed one issue: in
eqjoinsel_semi() the variable 'nmatches' is not initialized and can lead
to undefined behavior when clamped_nvalues2 == sslot2->nvalues. Before
the refactoring it was initialized by zero.

Also, 0001 in this series is not meant to be committed; what it
does is to add some debug logging to ease comparing runtimes of
different versions of eqjoinsel. I was able to use that to
convince myself that the refactoring steps didn't cost anything
meaningful in performance. Perhaps we could use it to investigate
the right hashing threshold more carefully, too.

With 0001 patch I tested the selectivity calculation time for SEMI JOIN
after applying patches 0002-0004, and the time was cut in half. Thank
you for the work on that.

There are still a couple of XXX comments in the attached, denoting
loose ends to look at. In particular, I wondered whether the
hash threshold check

if (Min(sslot1.nvalues, sslot2.nvalues) >= EQJOINSEL_MCV_HASH_THRESHOLD)

should use Max() instead --- that is, it might be safer to hash
if either MCV list is long. Or, holding one's head at a different
angle, perhaps the sum of the list lengths should be what's checked?

regards, tom lane

Hmm… using the sum actually seems like a good idea for me. It may
provide a smoother switch-over point between the two MCV-scanning
algorithms when both list lengths are below the threshold. But this
definitely needs to be validated by measuring different MCV lengths
below the threshold using the 0001 patch.

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com/

#28David Geier
geidav.pg@gmail.com
In reply to: Ilia Evdokimov (#20)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi Ilia!

On 13.10.2025 12:08, Ilia Evdokimov wrote:

On 17.09.2025 12:40, Ilia Evdokimov wrote:

In v2 patch, when the join is reversed we pass the commutator operator
Oid to eqjoinsel_semi(), and inside that function we immediately call
get_opcode(<commutator operator Oid>). Did you mean for the function
to take an operator Oid instead of an here?

If that was unintentional, perhaps the cleanest fix is to add a new
'operator' parameter to eqjoinsel_semi() so we can keep passing
'opfuncoid' as before and avoid changing the behavior.

This v3 patch fixes the confusion between operator and function Oids in
eqjoinsel_semi(). This version restores the previous behavior by keeping
the function Oid as before and adds an explicit 'operator' parameter so
both values are available without extra behavior changes.

Do you have any further comments or suggestions on this version?

I believe it doesn't matter. Because in try_eqjoinsel_with_hashtable()
we bail if the hash function of the LHS and the RHS of the equality
operator is not the same. Hence, if we use the commutator operator or
not doesn't matter.

But maybe I'm overlooking something. Can you provide an example that
fails without your change? If you can, we could add that also to the
regression tests.

Beyond that everything looks good to me. The regression tests also
passed for me.

--
David Geier

#29David Geier
geidav.pg@gmail.com
In reply to: Ilia Evdokimov (#18)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi Ilia!

On 16.09.2025 17:52, Ilia Evdokimov wrote:

Hi hackers,

On 10.09.2025 16:56, Ilia Evdokimov wrote:

Unfortunately, the JOB benchmark does not contain semi join nodes.
However, TPC-DS does. I'll look for the queries with slowest planner
times there and check them.

I'll need some time to check both join and semi join cases with small
and large default_statistics_target. I'll share the results later.

JOIN
==============================

I’ve benchmarked the new implementation of eqjoinsel() with different
values of default_statistics_target. On small targets (1, 5, 10, 25, 50,
75, 100) the results are all within statistical noise, and I did not
observe any regressions. In my view, it’s reasonable to keep the current
condition that the hash table is not used for default_statistics_target
= 1. Raising that threshold does not seem useful.

Here are the results for JOB queries (where the effect of semi join is
not visible due to different data distributions):

default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
------------------------------------------------------------------------------------------
1                         | 1.00                | 1846.643            |
1847.409
5                         | 1.00                | 1836.391            |
1828.318
10                        | 0.95                | 1841.750            |
1929.722
25                        | 0.99                | 1873.172            |
1890.741
50                        | 0.98                | 1869.897            |
1898.470
75                        | 1.02                | 1969.368            |
1929.521
100                       | 0.97                | 1857.890            |
1921.207
1000                      | 1.14                | 2279.700            |
1997.102
2500                      | 1.78                | 4682.658            |
2636.202
5000                      | 6.45                | 15943.696           |
2471.242
7500                      | 12.45               | 34350.855           |
2758.565
10000                     | 20.52               | 62519.342           |
3046.819

Good that we've confirmed that.

SEMI JOIN
==============================

Unfortunately, in TPC-DS it is not possible to clearly see improvements
for semi joins. To address this, I designed a synthetic example where
the data distribution forces the loop to run fully, without exiting
early, which makes the effect on semi joins more visible. In this setup,
I also ensured that the length of the MCV array is equal to the chosen
default_statistics_target.

CREATE TABLE t1 AS
SELECT CASE
         WHEN g <= 3000000 * 0.9 THEN (g % 10000) + 1
         ELSE (g % 1000000) + 10000
       END AS id
FROM generate_series(1, 3000000) g;

CREATE TABLE t2 AS
SELECT CASE
         WHEN g <= 3000000 * 0.9 THEN (g % 10000) + 10001
         ELSE (g % 1000000) + 20000
       END AS id
FROM generate_series(1, 3000000) g;

ANALYZE t1, t2;

The results of the query are:

SELECT * FROM t1
WHERE id IN (SELECT id FROM t2);

default_statistics_target | Planner Speedup (×) | Planner Before (ms) |
Planner After (ms)
------------------------------------------------------------------------------------------
1                         | 1.12                | 1.191               |
1.062
5                         | 1.02                | 0.493               |
0.481
10                        | 0.92                | 0.431               |
0.471
25                        | 1.27                | 0.393               |
0.309
50                        | 1.04                | 0.432               |
0.416
75                        | 0.96                | 0.398               |
0.415
100                       | 0.95                | 0.450               |
0.473
1000                      | 9.42                | 6.742               |
0.716
2500                      | 19.15               | 21.621              |
1.129
5000                      | 46.74               | 85.667              |
1.833
7500                      | 73.26               | 194.806             |
2.659
10000                     | 107.95              | 349.981             |
3.242

That's some decent speedups, considering that it's planning time.

Thanks for testing the code!

--
David Geier

#30Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: David Geier (#29)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi David,

It looks like there are some technical issues, but Tom and I are
currently discussing version 5 of the patches. Here is the link to the
ongoing discussion [0]/messages/by-id/3026409.1763072514@sss.pgh.pa.us. If you have any suggestions or feedback about
the patches, feel free to share them.

[0]: /messages/by-id/3026409.1763072514@sss.pgh.pa.us
/messages/by-id/3026409.1763072514@sss.pgh.pa.us

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com/

#31Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ilia Evdokimov (#27)
5 attachment(s)
Re: Use merge-based matching for MCVs in eqjoinsel

Ilia Evdokimov <ilya.evdokimov@tantorlabs.com> writes:

On 14.11.2025 01:21, Tom Lane wrote:

So after a bit of hacking I ended up with the attached. I split up
the refactorization into several steps to make it easier to review.

I reviewed patches 0002-0004 with the refactoring, and I think the
overall approach is excellent. However, I noticed one issue: in
eqjoinsel_semi() the variable 'nmatches' is not initialized and can lead
to undefined behavior when clamped_nvalues2 == sslot2->nvalues. Before
the refactoring it was initialized by zero.

Argh! Can't believe I missed that.

I experimented with combining all of eqjoinsel_find_matches' outputs
into one struct, but decided that that was uglier than just adding one
more pass-by-reference argument to eqjoinsel_inner/semi.

There are still a couple of XXX comments in the attached, denoting
loose ends to look at.

In the attached v6, I cleaned up one of the XXX items, deciding that
duplicate entries in the hash table should be coped with not asserted
against. The reason is that we might be working with a comparison
operator that is not exactly the one used to build the MCV list:
the planner is usually pretty cavalier about applying stats that are
only fuzzy matches to what it needs. So it seems possible that we
could find entries that are equal according to the operator we're
using, even though they're unequal according to what ANALYZE used to
compute the MCV list. I didn't actively try to hit that Assert, but
I think a counterexample could be built by using a case-insensitive
collation in a join query.

In particular, I wondered whether the
hash threshold check
if (Min(sslot1.nvalues, sslot2.nvalues) >= EQJOINSEL_MCV_HASH_THRESHOLD)
should use Max() instead --- that is, it might be safer to hash
if either MCV list is long. Or, holding one's head at a different
angle, perhaps the sum of the list lengths should be what's checked?

Hmm… using the sum actually seems like a good idea for me.

Actually, after sleeping on it it seems like the obvious thing is
to test "sslot1.nvalues * sslot2.nvalues", since the work we are
thinking about saving scales as that product. But I'm not sure
what threshold value to use if we do that. Maybe around 10000?

regards, tom lane

Attachments:

v6-0001-Add-some-test-scaffolding-to-join_selectivity.patchtext/x-diff; charset=us-ascii; name=v6-0001-Add-some-test-scaffolding-to-join_selectivity.patchDownload
From 15f6c1df696438f5a8f84c8fe3bcf2b1dd1ea475 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 17 Nov 2025 12:06:49 -0500
Subject: [PATCH v6 1/5] Add some test scaffolding to join_selectivity().

This not-meant-for-commit patch adds some instrumentation to
plancat.c's join_selectivity() to log the result and runtime
of a join selectivity function.  This is useful for manual
testing of performance patches in eqjoinsel().

To improve the accuracy of the runtime measurement, run the
function 1000 times in each call.  The regression tests still
take a reasonable amount of time with this overhead, although
it's noticeably more than usual.
---
 src/backend/optimizer/util/plancat.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index d950bd93002..15c50e068a0 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -42,6 +42,7 @@
 #include "parser/parse_relation.h"
 #include "parser/parsetree.h"
 #include "partitioning/partdesc.h"
+#include "portability/instr_time.h"
 #include "rewrite/rewriteHandler.h"
 #include "rewrite/rewriteManip.h"
 #include "statistics/statistics.h"
@@ -2123,6 +2124,8 @@ join_selectivity(PlannerInfo *root,
 {
 	RegProcedure oprjoin = get_oprjoin(operatorid);
 	float8		result;
+	instr_time	start_time,
+				end_time;
 
 	/*
 	 * if the oprjoin procedure is missing for whatever reason, use a
@@ -2131,6 +2134,10 @@ join_selectivity(PlannerInfo *root,
 	if (!oprjoin)
 		return (Selectivity) 0.5;
 
+	INSTR_TIME_SET_CURRENT(start_time);
+
+	for (int i = 0; i < 1000; i++)
+	{
 	result = DatumGetFloat8(OidFunctionCall5Coll(oprjoin,
 												 inputcollid,
 												 PointerGetDatum(root),
@@ -2138,6 +2145,21 @@ join_selectivity(PlannerInfo *root,
 												 PointerGetDatum(args),
 												 Int16GetDatum(jointype),
 												 PointerGetDatum(sjinfo)));
+	CHECK_FOR_INTERRUPTS();
+	}
+
+	/* Don't be chatty during initdb */
+	if (IsUnderPostmaster)
+	{
+		INSTR_TIME_SET_CURRENT(end_time);
+
+		INSTR_TIME_SUBTRACT(end_time, start_time);
+
+		/* multiply by 1e6 to get microsecs, divide by 1000 to cancel loop */
+		elog(LOG, "join_selectivity(opr %u, jointype %d) = %f, time %g us",
+			 operatorid, jointype, result,
+			 INSTR_TIME_GET_DOUBLE(end_time) * 1e3);
+	}
 
 	if (result < 0.0 || result > 1.0)
 		elog(ERROR, "invalid join selectivity: %f", result);
-- 
2.43.7

v6-0002-Factor-out-duplicative-code-in-eqjoinsel_inner-eq.patchtext/x-diff; charset=us-ascii; name*0=v6-0002-Factor-out-duplicative-code-in-eqjoinsel_inner-eq.p; name*1=atchDownload
From 571d2ea49ec9388010fa26a8fa165a7faac94c94 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 17 Nov 2025 12:08:39 -0500
Subject: [PATCH v6 2/5] Factor out duplicative code in
 eqjoinsel_inner/eqjoinsel_semi.

These functions have essentially identical code for scanning the
two MCV lists and identifying which entries have matches in the
other list.  While it's not a huge amount of code, it's 50 or
so lines, and will be more after an upcoming patch to use a hash
table with many MCVs.  Let's reduce duplication by moving that
code into a common subroutine.

The one downside of doing this is that we must compute
sum(sslot1->numbers[i] * sslot2->numbers[j]) even though
eqjoinsel_semi won't need that.  But the cost of that appears
negligible, so I didn't trouble to invent a way of avoiding it.
---
 src/backend/utils/adt/selfuncs.c | 191 ++++++++++++++++---------------
 1 file changed, 99 insertions(+), 92 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index cb23ad52782..590b3a0c078 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -163,6 +163,11 @@ static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
 							 Form_pg_statistic stats1, Form_pg_statistic stats2,
 							 bool have_mcvs1, bool have_mcvs2,
 							 RelOptInfo *inner_rel);
+static void eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
+								   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
+								   int nvalues1, int nvalues2,
+								   bool *hasmatch1, bool *hasmatch2,
+								   int *p_nmatches, double *p_matchprodfreq);
 static bool estimate_multivariate_ndistinct(PlannerInfo *root,
 											RelOptInfo *rel, List **varinfos, double *ndistinct);
 static bool convert_to_scalar(Datum value, Oid valuetypid, Oid collid,
@@ -2473,8 +2478,6 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		 * results", Technical Report 1018, Computer Science Dept., University
 		 * of Wisconsin, Madison, March 1991 (available from ftp.cs.wisc.edu).
 		 */
-		LOCAL_FCINFO(fcinfo, 2);
-		FmgrInfo	eqproc;
 		bool	   *hasmatch1;
 		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
@@ -2491,55 +2494,17 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		int			i,
 					nmatches;
 
-		fmgr_info(opfuncoid, &eqproc);
-
-		/*
-		 * Save a few cycles by setting up the fcinfo struct just once. Using
-		 * FunctionCallInvoke directly also avoids failure if the eqproc
-		 * returns NULL, though really equality functions should never do
-		 * that.
-		 */
-		InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
-								 NULL, NULL);
-		fcinfo->args[0].isnull = false;
-		fcinfo->args[1].isnull = false;
-
+		/* Construct the match arrays */
 		hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
 		hasmatch2 = (bool *) palloc0(sslot2->nvalues * sizeof(bool));
 
-		/*
-		 * Note we assume that each MCV will match at most one member of the
-		 * other MCV list.  If the operator isn't really equality, there could
-		 * be multiple matches --- but we don't look for them, both for speed
-		 * and because the math wouldn't add up...
-		 */
-		matchprodfreq = 0.0;
-		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
-		{
-			int			j;
-
-			fcinfo->args[0].value = sslot1->values[i];
-
-			for (j = 0; j < sslot2->nvalues; j++)
-			{
-				Datum		fresult;
-
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
-				{
-					hasmatch1[i] = hasmatch2[j] = true;
-					matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
-					nmatches++;
-					break;
-				}
-			}
-		}
+		eqjoinsel_find_matches(opfuncoid, collation,
+							   sslot1, sslot2,
+							   sslot1->nvalues, sslot2->nvalues,
+							   hasmatch1, hasmatch2,
+							   &nmatches, &matchprodfreq);
 		CLAMP_PROBABILITY(matchprodfreq);
+
 		/* Sum up frequencies of matched and unmatched MCVs */
 		matchfreq1 = unmatchfreq1 = 0.0;
 		for (i = 0; i < sslot1->nvalues; i++)
@@ -2700,12 +2665,11 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 * lists.  We still have to estimate for the remaining population, but
 		 * in a skewed distribution this gives us a big leg up in accuracy.
 		 */
-		LOCAL_FCINFO(fcinfo, 2);
-		FmgrInfo	eqproc;
 		bool	   *hasmatch1;
 		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
-		double		matchfreq1,
+		double		matchprodfreq,
+					matchfreq1,
 					uncertainfrac,
 					uncertain;
 		int			i,
@@ -2721,52 +2685,16 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 */
 		clamped_nvalues2 = Min(sslot2->nvalues, nd2);
 
-		fmgr_info(opfuncoid, &eqproc);
-
-		/*
-		 * Save a few cycles by setting up the fcinfo struct just once. Using
-		 * FunctionCallInvoke directly also avoids failure if the eqproc
-		 * returns NULL, though really equality functions should never do
-		 * that.
-		 */
-		InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
-								 NULL, NULL);
-		fcinfo->args[0].isnull = false;
-		fcinfo->args[1].isnull = false;
-
+		/* Construct the match arrays */
 		hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
 		hasmatch2 = (bool *) palloc0(clamped_nvalues2 * sizeof(bool));
 
-		/*
-		 * Note we assume that each MCV will match at most one member of the
-		 * other MCV list.  If the operator isn't really equality, there could
-		 * be multiple matches --- but we don't look for them, both for speed
-		 * and because the math wouldn't add up...
-		 */
-		nmatches = 0;
-		for (i = 0; i < sslot1->nvalues; i++)
-		{
-			int			j;
-
-			fcinfo->args[0].value = sslot1->values[i];
-
-			for (j = 0; j < clamped_nvalues2; j++)
-			{
-				Datum		fresult;
+		eqjoinsel_find_matches(opfuncoid, collation,
+							   sslot1, sslot2,
+							   sslot1->nvalues, clamped_nvalues2,
+							   hasmatch1, hasmatch2,
+							   &nmatches, &matchprodfreq);
 
-				if (hasmatch2[j])
-					continue;
-				fcinfo->args[1].value = sslot2->values[j];
-				fcinfo->isnull = false;
-				fresult = FunctionCallInvoke(fcinfo);
-				if (!fcinfo->isnull && DatumGetBool(fresult))
-				{
-					hasmatch1[i] = hasmatch2[j] = true;
-					nmatches++;
-					break;
-				}
-			}
-		}
 		/* Sum up frequencies of matched MCVs */
 		matchfreq1 = 0.0;
 		for (i = 0; i < sslot1->nvalues; i++)
@@ -2830,6 +2758,85 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 	return selec;
 }
 
+/*
+ * Identify matching MCVs for eqjoinsel_inner or eqjoinsel_semi.
+ *
+ * Inputs:
+ *	opfuncoid: OID of equality function to use (might be cross-type)
+ *	collation: OID of collation to use
+ *	sslot1, sslot2: MCV values for the lefthand and righthand inputs
+ *	nvalues1, nvalues2: number of values to be considered (can be less than
+ *		sslotN->nvalues, but not more)
+ * Outputs:
+ *	hasmatch1[], hasmatch2[]: pre-zeroed arrays of lengths nvalues1, nvalues2;
+ *		entries are set to true if that MCV has a match on the other side
+ *	*p_nmatches: receives number of MCV pairs that match
+ *	*p_matchprodfreq: receives sum(sslot1->numbers[i] * sslot2->numbers[j])
+ *		for matching MCVs
+ *
+ * Note we assume that each MCV will match at most one member of the other
+ * MCV list.  If the operator isn't really equality, there could be multiple
+ * matches --- but we don't look for them, both for speed and because the
+ * math wouldn't add up...
+ */
+static void
+eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
+					   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
+					   int nvalues1, int nvalues2,
+					   bool *hasmatch1, bool *hasmatch2,
+					   int *p_nmatches, double *p_matchprodfreq)
+{
+	LOCAL_FCINFO(fcinfo, 2);
+	FmgrInfo	eqproc;
+	double		matchprodfreq = 0.0;
+	int			nmatches = 0;
+
+	fmgr_info(opfuncoid, &eqproc);
+
+	/*
+	 * Save a few cycles by setting up the fcinfo struct just once.  Using
+	 * FunctionCallInvoke directly also avoids failure if the eqproc returns
+	 * NULL, though really equality functions should never do that.
+	 */
+	InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
+							 NULL, NULL);
+	fcinfo->args[0].isnull = false;
+	fcinfo->args[1].isnull = false;
+
+	/*
+	 * The reason for this extra level of braces will become apparent later.
+	 * For now, it just prevents having to re-indent this chunk of code moved
+	 * from eqjoinsel_inner.
+	 */
+	{
+		for (int i = 0; i < nvalues1; i++)
+		{
+			fcinfo->args[0].value = sslot1->values[i];
+
+			for (int j = 0; j < nvalues2; j++)
+			{
+				Datum		fresult;
+
+				if (hasmatch2[j])
+					continue;
+				fcinfo->args[1].value = sslot2->values[j];
+				fcinfo->isnull = false;
+				fresult = FunctionCallInvoke(fcinfo);
+				if (!fcinfo->isnull && DatumGetBool(fresult))
+				{
+					hasmatch1[i] = hasmatch2[j] = true;
+					matchprodfreq += sslot1->numbers[i] * sslot2->numbers[j];
+					nmatches++;
+					break;
+				}
+			}
+		}
+	}
+
+	*p_nmatches = nmatches;
+	*p_matchprodfreq = matchprodfreq;
+}
+
 /*
  *		neqjoinsel		- Join selectivity of "!="
  */
-- 
2.43.7

v6-0003-Rethink-eqjoinsel-s-handling-of-reversed-joins.patchtext/x-diff; charset=us-ascii; name*0=v6-0003-Rethink-eqjoinsel-s-handling-of-reversed-joins.patc; name*1=hDownload
From 60093f713fdecd329bc394cc0f864cec16cd8e79 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 17 Nov 2025 12:09:24 -0500
Subject: [PATCH v6 3/5] Rethink eqjoinsel's handling of reversed joins.

Formerly, if we needed to deal with a "reversed" join where the
outer-side variable is on the right hand of the given operator,
we looked up the operator's commutator and applied that, so that
eqjoinsel_semi could always treat "sslot1" as the outer-side
variable of the semijoin.

This isn't great, because we ended up punting to a poor estimate
if no commutator is recorded.  It also doesn't play well with
later changes in this patch series.  Instead, let's handle the
case by swapping the left and right input values just before
we call the comparison operator.  While this theoretically adds
cycles to the inner comparison loop, with the coding proposed
here I don't see any real timing difference.  (But I only tested
it on x86_64.)
---
 src/backend/utils/adt/selfuncs.c | 44 +++++++++++++++++++++++---------
 1 file changed, 32 insertions(+), 12 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 590b3a0c078..53653d2d05b 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -156,6 +156,7 @@ static double eqjoinsel_inner(Oid opfuncoid, Oid collation,
 							  Form_pg_statistic stats1, Form_pg_statistic stats2,
 							  bool have_mcvs1, bool have_mcvs2);
 static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
+							 bool op_is_reversed,
 							 VariableStatData *vardata1, VariableStatData *vardata2,
 							 double nd1, double nd2,
 							 bool isdefault1, bool isdefault2,
@@ -164,6 +165,7 @@ static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
 							 bool have_mcvs1, bool have_mcvs2,
 							 RelOptInfo *inner_rel);
 static void eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
+								   bool op_is_reversed,
 								   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 								   int nvalues1, int nvalues2,
 								   bool *hasmatch1, bool *hasmatch2,
@@ -2394,6 +2396,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 
 			if (!join_is_reversed)
 				selec = eqjoinsel_semi(opfuncoid, collation,
+									   false,
 									   &vardata1, &vardata2,
 									   nd1, nd2,
 									   isdefault1, isdefault2,
@@ -2402,11 +2405,8 @@ eqjoinsel(PG_FUNCTION_ARGS)
 									   have_mcvs1, have_mcvs2,
 									   inner_rel);
 			else
-			{
-				Oid			commop = get_commutator(operator);
-				Oid			commopfuncoid = OidIsValid(commop) ? get_opcode(commop) : InvalidOid;
-
-				selec = eqjoinsel_semi(commopfuncoid, collation,
+				selec = eqjoinsel_semi(opfuncoid, collation,
+									   true,
 									   &vardata2, &vardata1,
 									   nd2, nd1,
 									   isdefault2, isdefault1,
@@ -2414,7 +2414,6 @@ eqjoinsel(PG_FUNCTION_ARGS)
 									   stats2, stats1,
 									   have_mcvs2, have_mcvs1,
 									   inner_rel);
-			}
 
 			/*
 			 * We should never estimate the output of a semijoin to be more
@@ -2499,6 +2498,7 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		hasmatch2 = (bool *) palloc0(sslot2->nvalues * sizeof(bool));
 
 		eqjoinsel_find_matches(opfuncoid, collation,
+							   false,
 							   sslot1, sslot2,
 							   sslot1->nvalues, sslot2->nvalues,
 							   hasmatch1, hasmatch2,
@@ -2607,11 +2607,13 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
  * eqjoinsel_semi --- eqjoinsel for semi join
  *
  * (Also used for anti join, which we are supposed to estimate the same way.)
- * Caller has ensured that vardata1 is the LHS variable.
- * Unlike eqjoinsel_inner, we have to cope with opfuncoid being InvalidOid.
+ * Caller has ensured that vardata1 is the LHS variable; however, opfuncoid
+ * is for the original join operator, which might now need to have the inputs
+ * swapped in order to apply correctly.
  */
 static double
 eqjoinsel_semi(Oid opfuncoid, Oid collation,
+			   bool op_is_reversed,
 			   VariableStatData *vardata1, VariableStatData *vardata2,
 			   double nd1, double nd2,
 			   bool isdefault1, bool isdefault2,
@@ -2655,7 +2657,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		isdefault2 = false;
 	}
 
-	if (have_mcvs1 && have_mcvs2 && OidIsValid(opfuncoid))
+	if (have_mcvs1 && have_mcvs2)
 	{
 		/*
 		 * We have most-common-value lists for both relations.  Run through
@@ -2690,6 +2692,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		hasmatch2 = (bool *) palloc0(clamped_nvalues2 * sizeof(bool));
 
 		eqjoinsel_find_matches(opfuncoid, collation,
+							   op_is_reversed,
 							   sslot1, sslot2,
 							   sslot1->nvalues, clamped_nvalues2,
 							   hasmatch1, hasmatch2,
@@ -2762,8 +2765,9 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
  * Identify matching MCVs for eqjoinsel_inner or eqjoinsel_semi.
  *
  * Inputs:
- *	opfuncoid: OID of equality function to use (might be cross-type)
+ *	opfuncoid: OID of equality function to use (might be reversed)
  *	collation: OID of collation to use
+ *	op_is_reversed: indicates that opfuncoid compares right type to left type
  *	sslot1, sslot2: MCV values for the lefthand and righthand inputs
  *	nvalues1, nvalues2: number of values to be considered (can be less than
  *		sslotN->nvalues, but not more)
@@ -2781,6 +2785,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
  */
 static void
 eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
+					   bool op_is_reversed,
 					   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 					   int nvalues1, int nvalues2,
 					   bool *hasmatch1, bool *hasmatch2,
@@ -2809,9 +2814,24 @@ eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
 	 * from eqjoinsel_inner.
 	 */
 	{
+		int			index1,
+					index2;
+
+		/* Set up to supply the values in the order the operator expects */
+		if (op_is_reversed)
+		{
+			index1 = 1;
+			index2 = 0;
+		}
+		else
+		{
+			index1 = 0;
+			index2 = 1;
+		}
+
 		for (int i = 0; i < nvalues1; i++)
 		{
-			fcinfo->args[0].value = sslot1->values[i];
+			fcinfo->args[index1].value = sslot1->values[i];
 
 			for (int j = 0; j < nvalues2; j++)
 			{
@@ -2819,7 +2839,7 @@ eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
 
 				if (hasmatch2[j])
 					continue;
-				fcinfo->args[1].value = sslot2->values[j];
+				fcinfo->args[index2].value = sslot2->values[j];
 				fcinfo->isnull = false;
 				fresult = FunctionCallInvoke(fcinfo);
 				if (!fcinfo->isnull && DatumGetBool(fresult))
-- 
2.43.7

v6-0004-Share-more-work-between-eqjoinsel_inner-and-eqjoi.patchtext/x-diff; charset=us-ascii; name*0=v6-0004-Share-more-work-between-eqjoinsel_inner-and-eqjoi.p; name*1=atchDownload
From 8a0544353014d60979bca6a83c909bb680c5b043 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 17 Nov 2025 12:45:35 -0500
Subject: [PATCH v6 4/5] Share more work between eqjoinsel_inner and
 eqjoinsel_semi.

Originally, only one of eqjoinsel_inner and eqjoinsel_semi was
invoked per eqjoinsel call, so the fact that they duplicated a
good deal of work was irrelevant to performance.  But since commit
a314c3407, the semi/antijoin case calls both, and that is really
expensive if there are a lot of MCVs to match.  Refactor so that
we can re-use eqjoinsel_inner's matching results except in the
(uncommon) case where eqjoinsel_semi clamps the RHS MCV list size
because it's less than the expected number of rows to be fetched
from the RHS rel.  This doesn't seem to create any performance
penalty for non-semijoin cases.

While at it, we can avoid doing fmgr_info twice too.
I considered also avoiding duplicate InitFunctionCallInfoData
calls, but desisted: that wouldn't save very much, and in my
tests it looks like there may be some performance advantage
if fcinfo is a local variable.
---
 src/backend/utils/adt/selfuncs.c | 128 ++++++++++++++++++++-----------
 1 file changed, 84 insertions(+), 44 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 53653d2d05b..4335daf9a80 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -148,14 +148,16 @@ get_relation_stats_hook_type get_relation_stats_hook = NULL;
 get_index_stats_hook_type get_index_stats_hook = NULL;
 
 static double eqsel_internal(PG_FUNCTION_ARGS, bool negate);
-static double eqjoinsel_inner(Oid opfuncoid, Oid collation,
+static double eqjoinsel_inner(FmgrInfo *eqproc, Oid collation,
 							  VariableStatData *vardata1, VariableStatData *vardata2,
 							  double nd1, double nd2,
 							  bool isdefault1, bool isdefault2,
 							  AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 							  Form_pg_statistic stats1, Form_pg_statistic stats2,
-							  bool have_mcvs1, bool have_mcvs2);
-static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
+							  bool have_mcvs1, bool have_mcvs2,
+							  bool *hasmatch1, bool *hasmatch2,
+							  int *p_nmatches);
+static double eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
 							 bool op_is_reversed,
 							 VariableStatData *vardata1, VariableStatData *vardata2,
 							 double nd1, double nd2,
@@ -163,8 +165,10 @@ static double eqjoinsel_semi(Oid opfuncoid, Oid collation,
 							 AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 							 Form_pg_statistic stats1, Form_pg_statistic stats2,
 							 bool have_mcvs1, bool have_mcvs2,
+							 bool *hasmatch1, bool *hasmatch2,
+							 int *p_nmatches,
 							 RelOptInfo *inner_rel);
-static void eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
+static void eqjoinsel_find_matches(FmgrInfo *eqproc, Oid collation,
 								   bool op_is_reversed,
 								   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 								   int nvalues1, int nvalues2,
@@ -2311,12 +2315,16 @@ eqjoinsel(PG_FUNCTION_ARGS)
 	bool		isdefault1;
 	bool		isdefault2;
 	Oid			opfuncoid;
+	FmgrInfo	eqproc;
 	AttStatsSlot sslot1;
 	AttStatsSlot sslot2;
 	Form_pg_statistic stats1 = NULL;
 	Form_pg_statistic stats2 = NULL;
 	bool		have_mcvs1 = false;
 	bool		have_mcvs2 = false;
+	bool	   *hasmatch1 = NULL;
+	bool	   *hasmatch2 = NULL;
+	int			nmatches = 0;
 	bool		get_mcv_stats;
 	bool		join_is_reversed;
 	RelOptInfo *inner_rel;
@@ -2367,14 +2375,26 @@ eqjoinsel(PG_FUNCTION_ARGS)
 										  ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS);
 	}
 
+	/* Prepare info usable by both eqjoinsel_inner and eqjoinsel_semi */
+	if (have_mcvs1 && have_mcvs2)
+	{
+		fmgr_info(opfuncoid, &eqproc);
+		hasmatch1 = (bool *) palloc0(sslot1.nvalues * sizeof(bool));
+		hasmatch2 = (bool *) palloc0(sslot2.nvalues * sizeof(bool));
+	}
+	else
+		memset(&eqproc, 0, sizeof(eqproc)); /* silence uninit-var warnings */
+
 	/* We need to compute the inner-join selectivity in all cases */
-	selec_inner = eqjoinsel_inner(opfuncoid, collation,
+	selec_inner = eqjoinsel_inner(&eqproc, collation,
 								  &vardata1, &vardata2,
 								  nd1, nd2,
 								  isdefault1, isdefault2,
 								  &sslot1, &sslot2,
 								  stats1, stats2,
-								  have_mcvs1, have_mcvs2);
+								  have_mcvs1, have_mcvs2,
+								  hasmatch1, hasmatch2,
+								  &nmatches);
 
 	switch (sjinfo->jointype)
 	{
@@ -2395,7 +2415,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 			inner_rel = find_join_input_rel(root, sjinfo->min_righthand);
 
 			if (!join_is_reversed)
-				selec = eqjoinsel_semi(opfuncoid, collation,
+				selec = eqjoinsel_semi(&eqproc, collation,
 									   false,
 									   &vardata1, &vardata2,
 									   nd1, nd2,
@@ -2403,9 +2423,11 @@ eqjoinsel(PG_FUNCTION_ARGS)
 									   &sslot1, &sslot2,
 									   stats1, stats2,
 									   have_mcvs1, have_mcvs2,
+									   hasmatch1, hasmatch2,
+									   &nmatches,
 									   inner_rel);
 			else
-				selec = eqjoinsel_semi(opfuncoid, collation,
+				selec = eqjoinsel_semi(&eqproc, collation,
 									   true,
 									   &vardata2, &vardata1,
 									   nd2, nd1,
@@ -2413,6 +2435,8 @@ eqjoinsel(PG_FUNCTION_ARGS)
 									   &sslot2, &sslot1,
 									   stats2, stats1,
 									   have_mcvs2, have_mcvs1,
+									   hasmatch2, hasmatch1,
+									   &nmatches,
 									   inner_rel);
 
 			/*
@@ -2441,6 +2465,11 @@ eqjoinsel(PG_FUNCTION_ARGS)
 	ReleaseVariableStats(vardata1);
 	ReleaseVariableStats(vardata2);
 
+	if (hasmatch1)
+		pfree(hasmatch1);
+	if (hasmatch2)
+		pfree(hasmatch2);
+
 	CLAMP_PROBABILITY(selec);
 
 	PG_RETURN_FLOAT8((float8) selec);
@@ -2449,17 +2478,23 @@ eqjoinsel(PG_FUNCTION_ARGS)
 /*
  * eqjoinsel_inner --- eqjoinsel for normal inner join
  *
+ * In addition to computing the selectivity estimate, this will fill
+ * hasmatch1[], hasmatch2[], and *p_nmatches (if have_mcvs1 && have_mcvs2).
+ * We may be able to re-use that data in eqjoinsel_semi.
+ *
  * We also use this for LEFT/FULL outer joins; it's not presently clear
  * that it's worth trying to distinguish them here.
  */
 static double
-eqjoinsel_inner(Oid opfuncoid, Oid collation,
+eqjoinsel_inner(FmgrInfo *eqproc, Oid collation,
 				VariableStatData *vardata1, VariableStatData *vardata2,
 				double nd1, double nd2,
 				bool isdefault1, bool isdefault2,
 				AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 				Form_pg_statistic stats1, Form_pg_statistic stats2,
-				bool have_mcvs1, bool have_mcvs2)
+				bool have_mcvs1, bool have_mcvs2,
+				bool *hasmatch1, bool *hasmatch2,
+				int *p_nmatches)
 {
 	double		selec;
 
@@ -2477,8 +2512,6 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		 * results", Technical Report 1018, Computer Science Dept., University
 		 * of Wisconsin, Madison, March 1991 (available from ftp.cs.wisc.edu).
 		 */
-		bool	   *hasmatch1;
-		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
 		double		nullfrac2 = stats2->stanullfrac;
 		double		matchprodfreq,
@@ -2493,16 +2526,14 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		int			i,
 					nmatches;
 
-		/* Construct the match arrays */
-		hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
-		hasmatch2 = (bool *) palloc0(sslot2->nvalues * sizeof(bool));
-
-		eqjoinsel_find_matches(opfuncoid, collation,
+		/* Fill the match arrays */
+		eqjoinsel_find_matches(eqproc, collation,
 							   false,
 							   sslot1, sslot2,
 							   sslot1->nvalues, sslot2->nvalues,
 							   hasmatch1, hasmatch2,
-							   &nmatches, &matchprodfreq);
+							   p_nmatches, &matchprodfreq);
+		nmatches = *p_nmatches;
 		CLAMP_PROBABILITY(matchprodfreq);
 
 		/* Sum up frequencies of matched and unmatched MCVs */
@@ -2526,8 +2557,6 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
 		}
 		CLAMP_PROBABILITY(matchfreq2);
 		CLAMP_PROBABILITY(unmatchfreq2);
-		pfree(hasmatch1);
-		pfree(hasmatch2);
 
 		/*
 		 * Compute total frequency of non-null values that are not in the MCV
@@ -2607,12 +2636,14 @@ eqjoinsel_inner(Oid opfuncoid, Oid collation,
  * eqjoinsel_semi --- eqjoinsel for semi join
  *
  * (Also used for anti join, which we are supposed to estimate the same way.)
- * Caller has ensured that vardata1 is the LHS variable; however, opfuncoid
+ * Caller has ensured that vardata1 is the LHS variable; however, eqproc
  * is for the original join operator, which might now need to have the inputs
- * swapped in order to apply correctly.
+ * swapped in order to apply correctly.  Also, if have_mcvs1 && have_mcvs2
+ * then hasmatch1[], hasmatch2[], and *p_nmatches were filled by
+ * eqjoinsel_inner.
  */
 static double
-eqjoinsel_semi(Oid opfuncoid, Oid collation,
+eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
 			   bool op_is_reversed,
 			   VariableStatData *vardata1, VariableStatData *vardata2,
 			   double nd1, double nd2,
@@ -2620,6 +2651,8 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 			   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 			   Form_pg_statistic stats1, Form_pg_statistic stats2,
 			   bool have_mcvs1, bool have_mcvs2,
+			   bool *hasmatch1, bool *hasmatch2,
+			   int *p_nmatches,
 			   RelOptInfo *inner_rel)
 {
 	double		selec;
@@ -2667,8 +2700,6 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 * lists.  We still have to estimate for the remaining population, but
 		 * in a skewed distribution this gives us a big leg up in accuracy.
 		 */
-		bool	   *hasmatch1;
-		bool	   *hasmatch2;
 		double		nullfrac1 = stats1->stanullfrac;
 		double		matchprodfreq,
 					matchfreq1,
@@ -2687,16 +2718,30 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 		 */
 		clamped_nvalues2 = Min(sslot2->nvalues, nd2);
 
-		/* Construct the match arrays */
-		hasmatch1 = (bool *) palloc0(sslot1->nvalues * sizeof(bool));
-		hasmatch2 = (bool *) palloc0(clamped_nvalues2 * sizeof(bool));
-
-		eqjoinsel_find_matches(opfuncoid, collation,
-							   op_is_reversed,
-							   sslot1, sslot2,
-							   sslot1->nvalues, clamped_nvalues2,
-							   hasmatch1, hasmatch2,
-							   &nmatches, &matchprodfreq);
+		/*
+		 * If we did not set clamped_nvalues2 to less than sslot2->nvalues,
+		 * then the hasmatch1[] and hasmatch2[] match flags computed by
+		 * eqjoinsel_inner are still perfectly applicable, so we need not
+		 * re-do the matching work.  Note that it does not matter if
+		 * op_is_reversed: we'd get the same answers.
+		 *
+		 * If we did clamp, then a different set of sslot2 values is to be
+		 * compared, so we have to re-do the matching.
+		 */
+		if (clamped_nvalues2 != sslot2->nvalues)
+		{
+			/* Must re-zero the arrays */
+			memset(hasmatch1, 0, sslot1->nvalues * sizeof(bool));
+			memset(hasmatch2, 0, clamped_nvalues2 * sizeof(bool));
+			/* Re-fill the match arrays */
+			eqjoinsel_find_matches(eqproc, collation,
+								   op_is_reversed,
+								   sslot1, sslot2,
+								   sslot1->nvalues, clamped_nvalues2,
+								   hasmatch1, hasmatch2,
+								   p_nmatches, &matchprodfreq);
+		}
+		nmatches = *p_nmatches;
 
 		/* Sum up frequencies of matched MCVs */
 		matchfreq1 = 0.0;
@@ -2706,8 +2751,6 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
 				matchfreq1 += sslot1->numbers[i];
 		}
 		CLAMP_PROBABILITY(matchfreq1);
-		pfree(hasmatch1);
-		pfree(hasmatch2);
 
 		/*
 		 * Now we need to estimate the fraction of relation 1 that has at
@@ -2765,9 +2808,9 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
  * Identify matching MCVs for eqjoinsel_inner or eqjoinsel_semi.
  *
  * Inputs:
- *	opfuncoid: OID of equality function to use (might be reversed)
+ *	eqproc: FmgrInfo for equality function to use (might be reversed)
  *	collation: OID of collation to use
- *	op_is_reversed: indicates that opfuncoid compares right type to left type
+ *	op_is_reversed: indicates that eqproc compares right type to left type
  *	sslot1, sslot2: MCV values for the lefthand and righthand inputs
  *	nvalues1, nvalues2: number of values to be considered (can be less than
  *		sslotN->nvalues, but not more)
@@ -2784,7 +2827,7 @@ eqjoinsel_semi(Oid opfuncoid, Oid collation,
  * math wouldn't add up...
  */
 static void
-eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
+eqjoinsel_find_matches(FmgrInfo *eqproc, Oid collation,
 					   bool op_is_reversed,
 					   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 					   int nvalues1, int nvalues2,
@@ -2792,18 +2835,15 @@ eqjoinsel_find_matches(Oid opfuncoid, Oid collation,
 					   int *p_nmatches, double *p_matchprodfreq)
 {
 	LOCAL_FCINFO(fcinfo, 2);
-	FmgrInfo	eqproc;
 	double		matchprodfreq = 0.0;
 	int			nmatches = 0;
 
-	fmgr_info(opfuncoid, &eqproc);
-
 	/*
 	 * Save a few cycles by setting up the fcinfo struct just once.  Using
 	 * FunctionCallInvoke directly also avoids failure if the eqproc returns
 	 * NULL, though really equality functions should never do that.
 	 */
-	InitFunctionCallInfoData(*fcinfo, &eqproc, 2, collation,
+	InitFunctionCallInfoData(*fcinfo, eqproc, 2, collation,
 							 NULL, NULL);
 	fcinfo->args[0].isnull = false;
 	fcinfo->args[1].isnull = false;
-- 
2.43.7

v6-0005-Use-hashing-to-avoid-O-N-2-matching-work-in-eqjoi.patchtext/x-diff; charset=us-ascii; name*0=v6-0005-Use-hashing-to-avoid-O-N-2-matching-work-in-eqjoi.p; name*1=atchDownload
From 28a9e2dd123aee5e3c1217fb90bf5b51fdb5d427 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 17 Nov 2025 13:12:18 -0500
Subject: [PATCH v6 5/5] Use hashing to avoid O(N^2) matching work in
 eqjoinsel.

Use a simplehash hash table if there are enough MCVs and the
join operator has associated hash functions.  The threshold
for switching to hash mode perhaps could use more research.
---
 src/backend/utils/adt/selfuncs.c | 253 ++++++++++++++++++++++++++++++-
 src/tools/pgindent/typedefs.list |   3 +
 2 files changed, 251 insertions(+), 5 deletions(-)

diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 4335daf9a80..3354fea6a76 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -143,12 +143,47 @@
 
 #define DEFAULT_PAGE_CPU_MULTIPLIER 50.0
 
+/*
+ * In production builds, switch to hash-based MCV matching when lists are
+ * large enough to amortize hash setup cost.  In debug builds, we use a
+ * smaller threshold so that the regression tests cover both paths well.
+ */
+#ifndef USE_ASSERT_CHECKING
+#define EQJOINSEL_MCV_HASH_THRESHOLD 100
+#else
+#define EQJOINSEL_MCV_HASH_THRESHOLD 10
+#endif
+
+/* Entries in the simplehash hash table used by eqjoinsel_find_matches */
+typedef struct MCVHashEntry
+{
+	Datum		value;			/* the value represented by this entry */
+	int			index;			/* its index in the relevant AttStatsSlot */
+	uint32		hash;			/* hash code for the Datum */
+	char		status;			/* status code used by simplehash.h */
+} MCVHashEntry;
+
+/* private_data for the simplehash hash table */
+typedef struct MCVHashContext
+{
+	FunctionCallInfo equal_fcinfo;	/* the equality join operator */
+	FunctionCallInfo hash_fcinfo;	/* the hash function to use */
+	bool		op_is_reversed; /* equality compares hash type to probe type */
+	bool		insert_mode;	/* doing inserts or lookups? */
+	bool		hash_typbyval;	/* typbyval of hashed data type */
+	int16		hash_typlen;	/* typlen of hashed data type */
+} MCVHashContext;
+
+/* forward reference */
+typedef struct MCVHashTable_hash MCVHashTable_hash;
+
 /* Hooks for plugins to get control when we ask for stats */
 get_relation_stats_hook_type get_relation_stats_hook = NULL;
 get_index_stats_hook_type get_index_stats_hook = NULL;
 
 static double eqsel_internal(PG_FUNCTION_ARGS, bool negate);
 static double eqjoinsel_inner(FmgrInfo *eqproc, Oid collation,
+							  Oid hashLeft, Oid hashRight,
 							  VariableStatData *vardata1, VariableStatData *vardata2,
 							  double nd1, double nd2,
 							  bool isdefault1, bool isdefault2,
@@ -158,6 +193,7 @@ static double eqjoinsel_inner(FmgrInfo *eqproc, Oid collation,
 							  bool *hasmatch1, bool *hasmatch2,
 							  int *p_nmatches);
 static double eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
+							 Oid hashLeft, Oid hashRight,
 							 bool op_is_reversed,
 							 VariableStatData *vardata1, VariableStatData *vardata2,
 							 double nd1, double nd2,
@@ -169,11 +205,14 @@ static double eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
 							 int *p_nmatches,
 							 RelOptInfo *inner_rel);
 static void eqjoinsel_find_matches(FmgrInfo *eqproc, Oid collation,
+								   Oid hashLeft, Oid hashRight,
 								   bool op_is_reversed,
 								   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 								   int nvalues1, int nvalues2,
 								   bool *hasmatch1, bool *hasmatch2,
 								   int *p_nmatches, double *p_matchprodfreq);
+static uint32 hash_mcv(MCVHashTable_hash *tab, Datum key);
+static bool mcvs_equal(MCVHashTable_hash *tab, Datum key0, Datum key1);
 static bool estimate_multivariate_ndistinct(PlannerInfo *root,
 											RelOptInfo *rel, List **varinfos, double *ndistinct);
 static bool convert_to_scalar(Datum value, Oid valuetypid, Oid collid,
@@ -229,6 +268,20 @@ static RelOptInfo *find_join_input_rel(PlannerInfo *root, Relids relids);
 static double btcost_correlation(IndexOptInfo *index,
 								 VariableStatData *vardata);
 
+/* Define support routines for MCV hash tables */
+#define SH_PREFIX				MCVHashTable
+#define SH_ELEMENT_TYPE			MCVHashEntry
+#define SH_KEY_TYPE				Datum
+#define SH_KEY					value
+#define SH_HASH_KEY(tab,key)	hash_mcv(tab, key)
+#define SH_EQUAL(tab,key0,key1)	mcvs_equal(tab, key0, key1)
+#define SH_SCOPE				static inline
+#define SH_STORE_HASH
+#define SH_GET_HASH(tab,ent)	(ent)->hash
+#define SH_DEFINE
+#define SH_DECLARE
+#include "lib/simplehash.h"
+
 
 /*
  *		eqsel			- Selectivity of "=" for any data types.
@@ -2316,6 +2369,8 @@ eqjoinsel(PG_FUNCTION_ARGS)
 	bool		isdefault2;
 	Oid			opfuncoid;
 	FmgrInfo	eqproc;
+	Oid			hashLeft = InvalidOid;
+	Oid			hashRight = InvalidOid;
 	AttStatsSlot sslot1;
 	AttStatsSlot sslot2;
 	Form_pg_statistic stats1 = NULL;
@@ -2381,12 +2436,20 @@ eqjoinsel(PG_FUNCTION_ARGS)
 		fmgr_info(opfuncoid, &eqproc);
 		hasmatch1 = (bool *) palloc0(sslot1.nvalues * sizeof(bool));
 		hasmatch2 = (bool *) palloc0(sslot2.nvalues * sizeof(bool));
+
+		/*
+		 * If the MCV lists are long enough to justify hashing, try to look up
+		 * hash functions for the join operator.  XXX should this be Max()?
+		 */
+		if (Min(sslot1.nvalues, sslot2.nvalues) >= EQJOINSEL_MCV_HASH_THRESHOLD)
+			(void) get_op_hash_functions(operator, &hashLeft, &hashRight);
 	}
 	else
 		memset(&eqproc, 0, sizeof(eqproc)); /* silence uninit-var warnings */
 
 	/* We need to compute the inner-join selectivity in all cases */
 	selec_inner = eqjoinsel_inner(&eqproc, collation,
+								  hashLeft, hashRight,
 								  &vardata1, &vardata2,
 								  nd1, nd2,
 								  isdefault1, isdefault2,
@@ -2416,6 +2479,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 
 			if (!join_is_reversed)
 				selec = eqjoinsel_semi(&eqproc, collation,
+									   hashLeft, hashRight,
 									   false,
 									   &vardata1, &vardata2,
 									   nd1, nd2,
@@ -2428,6 +2492,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
 									   inner_rel);
 			else
 				selec = eqjoinsel_semi(&eqproc, collation,
+									   hashLeft, hashRight,
 									   true,
 									   &vardata2, &vardata1,
 									   nd2, nd1,
@@ -2487,6 +2552,7 @@ eqjoinsel(PG_FUNCTION_ARGS)
  */
 static double
 eqjoinsel_inner(FmgrInfo *eqproc, Oid collation,
+				Oid hashLeft, Oid hashRight,
 				VariableStatData *vardata1, VariableStatData *vardata2,
 				double nd1, double nd2,
 				bool isdefault1, bool isdefault2,
@@ -2528,6 +2594,7 @@ eqjoinsel_inner(FmgrInfo *eqproc, Oid collation,
 
 		/* Fill the match arrays */
 		eqjoinsel_find_matches(eqproc, collation,
+							   hashLeft, hashRight,
 							   false,
 							   sslot1, sslot2,
 							   sslot1->nvalues, sslot2->nvalues,
@@ -2644,6 +2711,7 @@ eqjoinsel_inner(FmgrInfo *eqproc, Oid collation,
  */
 static double
 eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
+			   Oid hashLeft, Oid hashRight,
 			   bool op_is_reversed,
 			   VariableStatData *vardata1, VariableStatData *vardata2,
 			   double nd1, double nd2,
@@ -2735,6 +2803,7 @@ eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
 			memset(hasmatch2, 0, clamped_nvalues2 * sizeof(bool));
 			/* Re-fill the match arrays */
 			eqjoinsel_find_matches(eqproc, collation,
+								   hashLeft, hashRight,
 								   op_is_reversed,
 								   sslot1, sslot2,
 								   sslot1->nvalues, clamped_nvalues2,
@@ -2810,6 +2879,8 @@ eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
  * Inputs:
  *	eqproc: FmgrInfo for equality function to use (might be reversed)
  *	collation: OID of collation to use
+ *	hashLeft, hashRight: OIDs of hash functions associated with equality op,
+ *		or InvalidOid if we're not to use hashing
  *	op_is_reversed: indicates that eqproc compares right type to left type
  *	sslot1, sslot2: MCV values for the lefthand and righthand inputs
  *	nvalues1, nvalues2: number of values to be considered (can be less than
@@ -2821,6 +2892,9 @@ eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
  *	*p_matchprodfreq: receives sum(sslot1->numbers[i] * sslot2->numbers[j])
  *		for matching MCVs
  *
+ * Note that hashLeft is for the eqproc's left-hand input type, hashRight
+ * for its right, regardless of op_is_reversed.
+ *
  * Note we assume that each MCV will match at most one member of the other
  * MCV list.  If the operator isn't really equality, there could be multiple
  * matches --- but we don't look for them, both for speed and because the
@@ -2828,6 +2902,7 @@ eqjoinsel_semi(FmgrInfo *eqproc, Oid collation,
  */
 static void
 eqjoinsel_find_matches(FmgrInfo *eqproc, Oid collation,
+					   Oid hashLeft, Oid hashRight,
 					   bool op_is_reversed,
 					   AttStatsSlot *sslot1, AttStatsSlot *sslot2,
 					   int nvalues1, int nvalues2,
@@ -2848,12 +2923,119 @@ eqjoinsel_find_matches(FmgrInfo *eqproc, Oid collation,
 	fcinfo->args[0].isnull = false;
 	fcinfo->args[1].isnull = false;
 
-	/*
-	 * The reason for this extra level of braces will become apparent later.
-	 * For now, it just prevents having to re-indent this chunk of code moved
-	 * from eqjoinsel_inner.
-	 */
+	if (OidIsValid(hashLeft) && OidIsValid(hashRight))
+	{
+		/* Use a hash table to speed up the matching */
+		LOCAL_FCINFO(hash_fcinfo, 1);
+		FmgrInfo	hash_proc;
+		MCVHashContext hashContext;
+		MCVHashTable_hash *hashTable;
+		AttStatsSlot *statsProbe;
+		AttStatsSlot *statsHash;
+		bool	   *hasMatchProbe;
+		bool	   *hasMatchHash;
+		int			nvaluesProbe;
+		int			nvaluesHash;
+
+		/* Make sure we build the hash table on the smaller array. */
+		if (sslot1->nvalues >= sslot2->nvalues)
+		{
+			statsProbe = sslot1;
+			statsHash = sslot2;
+			hasMatchProbe = hasmatch1;
+			hasMatchHash = hasmatch2;
+			nvaluesProbe = nvalues1;
+			nvaluesHash = nvalues2;
+		}
+		else
+		{
+			/* We'll have to reverse the direction of use of the operator. */
+			op_is_reversed = !op_is_reversed;
+			statsProbe = sslot2;
+			statsHash = sslot1;
+			hasMatchProbe = hasmatch2;
+			hasMatchHash = hasmatch1;
+			nvaluesProbe = nvalues2;
+			nvaluesHash = nvalues1;
+		}
+
+		/*
+		 * Build the hash table on the smaller array, using the appropriate
+		 * hash function for its data type.
+		 */
+		fmgr_info(op_is_reversed ? hashLeft : hashRight, &hash_proc);
+		InitFunctionCallInfoData(*hash_fcinfo, &hash_proc, 1, collation,
+								 NULL, NULL);
+		hash_fcinfo->args[0].isnull = false;
+
+		hashContext.equal_fcinfo = fcinfo;
+		hashContext.hash_fcinfo = hash_fcinfo;
+		hashContext.op_is_reversed = op_is_reversed;
+		hashContext.insert_mode = true;
+		get_typlenbyval(statsHash->valuetype,
+						&hashContext.hash_typlen,
+						&hashContext.hash_typbyval);
+
+		hashTable = MCVHashTable_create(CurrentMemoryContext,
+										nvaluesHash,
+										&hashContext);
+
+		for (int i = 0; i < nvaluesHash; i++)
+		{
+			bool		found = false;
+			MCVHashEntry *entry = MCVHashTable_insert(hashTable,
+													  statsHash->values[i],
+													  &found);
+
+			/*
+			 * We're not really expecting duplicates in the MCV list, but it
+			 * seems possible that there could be entries that are equal
+			 * according to the operator we're testing even though they are
+			 * unequal according to the datatype's default opclass.  If we
+			 * find a dup, just ignore it, leaving the hash entry's index
+			 * pointing at the first occurrence.
+			 */
+			if (!found)
+				entry->index = i;
+		}
+
+		/*
+		 * Prepare to probe the hash table.  If the probe values are of a
+		 * different data type, then we need to change hash functions.  (This
+		 * code relies on the assumption that since we defined SH_STORE_HASH,
+		 * simplehash.h will never need to compute hash values for existing
+		 * hash table entries.)
+		 */
+		hashContext.insert_mode = false;
+		if (hashLeft != hashRight)
+		{
+			fmgr_info(op_is_reversed ? hashRight : hashLeft, &hash_proc);
+			/* Resetting hash_fcinfo is probably unnecessary, but be safe */
+			InitFunctionCallInfoData(*hash_fcinfo, &hash_proc, 1, collation,
+									 NULL, NULL);
+			hash_fcinfo->args[0].isnull = false;
+		}
+
+		/* Look up each probe value in turn. */
+		for (int i = 0; i < nvaluesProbe; i++)
+		{
+			MCVHashEntry *entry = MCVHashTable_lookup(hashTable,
+													  statsProbe->values[i]);
+
+			/* As in the other code path, skip already-matched hash entries */
+			if (entry != NULL && !hasMatchHash[entry->index])
+			{
+				hasMatchHash[entry->index] = hasMatchProbe[i] = true;
+				nmatches++;
+				matchprodfreq += statsHash->numbers[entry->index] * statsProbe->numbers[i];
+			}
+		}
+
+		MCVHashTable_destroy(hashTable);
+	}
+	else
 	{
+		/* We're not to use hashing, so do it the O(N^2) way */
 		int			index1,
 					index2;
 
@@ -2897,6 +3079,67 @@ eqjoinsel_find_matches(FmgrInfo *eqproc, Oid collation,
 	*p_matchprodfreq = matchprodfreq;
 }
 
+/*
+ * Support functions for the hash tables used by eqjoinsel_find_matches
+ */
+static uint32
+hash_mcv(MCVHashTable_hash *tab, Datum key)
+{
+	MCVHashContext *context = (MCVHashContext *) tab->private_data;
+	FunctionCallInfo fcinfo = context->hash_fcinfo;
+	Datum		fresult;
+
+	fcinfo->args[0].value = key;
+	fcinfo->isnull = false;
+	fresult = FunctionCallInvoke(fcinfo);
+	Assert(!fcinfo->isnull);
+	return DatumGetUInt32(fresult);
+}
+
+static bool
+mcvs_equal(MCVHashTable_hash *tab, Datum key0, Datum key1)
+{
+	MCVHashContext *context = (MCVHashContext *) tab->private_data;
+
+	if (context->insert_mode)
+	{
+		/*
+		 * During the insertion step, any comparisons will be between two
+		 * Datums of the hash table's data type, so if the given operator is
+		 * cross-type it will be the wrong thing to use.  Fortunately, we can
+		 * use datum_image_eq instead.  The MCV values should all be distinct
+		 * anyway, so it's mostly pro-forma to compare them at all.
+		 */
+		return datum_image_eq(key0, key1,
+							  context->hash_typbyval, context->hash_typlen);
+	}
+	else
+	{
+		FunctionCallInfo fcinfo = context->equal_fcinfo;
+		Datum		fresult;
+
+		/*
+		 * Apply the operator the correct way around.  Although simplehash.h
+		 * doesn't document this explicitly, during lookups key0 is from the
+		 * hash table while key1 is the probe value, so we should compare them
+		 * in that order only if op_is_reversed.
+		 */
+		if (context->op_is_reversed)
+		{
+			fcinfo->args[0].value = key0;
+			fcinfo->args[1].value = key1;
+		}
+		else
+		{
+			fcinfo->args[0].value = key1;
+			fcinfo->args[1].value = key0;
+		}
+		fcinfo->isnull = false;
+		fresult = FunctionCallInvoke(fcinfo);
+		return (!fcinfo->isnull && DatumGetBool(fresult));
+	}
+}
+
 /*
  *		neqjoinsel		- Join selectivity of "!="
  */
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index 23bce72ae64..57f2a9ccdc5 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -1649,6 +1649,9 @@ LtreeGistOptions
 LtreeSignature
 MAGIC
 MBuf
+MCVHashContext
+MCVHashEntry
+MCVHashTable_hash
 MCVItem
 MCVList
 MEMORY_BASIC_INFORMATION
-- 
2.43.7

#32Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#31)
Re: Use merge-based matching for MCVs in eqjoinsel

I wrote:

Actually, after sleeping on it it seems like the obvious thing is
to test "sslot1.nvalues * sslot2.nvalues", since the work we are
thinking about saving scales as that product. But I'm not sure
what threshold value to use if we do that. Maybe around 10000?

Or maybe better, since we are considering an O(m*n) algorithm
versus an O(m+n) one, we could check whether

sslot1.nvalues * sslot2.nvalues - (sslot1.nvalues + sslot2.nvalues)

exceeds some threshold. But that doesn't offer any insight into
just what the threshold should be, either.

regards, tom lane

#33David Geier
geidav.pg@gmail.com
In reply to: Tom Lane (#32)
Re: Use merge-based matching for MCVs in eqjoinsel

Hi Tom!

On 17.11.2025 19:44, Tom Lane wrote:

I wrote:

Actually, after sleeping on it it seems like the obvious thing is
to test "sslot1.nvalues * sslot2.nvalues", since the work we are
thinking about saving scales as that product. But I'm not sure
what threshold value to use if we do that. Maybe around 10000?

Or maybe better, since we are considering an O(m*n) algorithm
versus an O(m+n) one, we could check whether

sslot1.nvalues * sslot2.nvalues - (sslot1.nvalues + sslot2.nvalues)

exceeds some threshold. But that doesn't offer any insight into
just what the threshold should be, either.

Good idea. How about using that formula and then determining the
threshold with a few experiments? Could be the JOB benchmark Ilia has
already set up or some synthetic test-cases.

Given that there's no one-size-fits-all constant anyways, that seems
good enough to me. Looking at [1]/messages/by-id/CAAaqYe8x62+=wn0zvNKCj55tPpg-JBHzhZFFc6ANovdqFw7-dA@mail.gmail.com, determining to set
MIN_ARRAY_SIZE_FOR_HASHED_SAOP to 9 was done the same way.

We could also include the operator costs for hashing and equality
comparison to make it more precise, in case they're easily accessible
at this point.

--
David Geier

[1]: /messages/by-id/CAAaqYe8x62+=wn0zvNKCj55tPpg-JBHzhZFFc6ANovdqFw7-dA@mail.gmail.com
/messages/by-id/CAAaqYe8x62+=wn0zvNKCj55tPpg-JBHzhZFFc6ANovdqFw7-dA@mail.gmail.com

#34Tom Lane
tgl@sss.pgh.pa.us
In reply to: David Geier (#33)
Re: Use merge-based matching for MCVs in eqjoinsel

David Geier <geidav.pg@gmail.com> writes:

On 17.11.2025 19:44, Tom Lane wrote:

Or maybe better, since we are considering an O(m*n) algorithm
versus an O(m+n) one, we could check whether
sslot1.nvalues * sslot2.nvalues - (sslot1.nvalues + sslot2.nvalues)
exceeds some threshold. But that doesn't offer any insight into
just what the threshold should be, either.

Good idea. How about using that formula and then determining the
threshold with a few experiments? Could be the JOB benchmark Ilia has
already set up or some synthetic test-cases.

Thinking a bit harder, we are comparing these costs:

1. The old code does m*n comparisons, with next-to-no other overhead.
Sometimes the inner loop will stop early, resulting in fewer
comparisons; but I don't think we have any good handle on how often
that's likely to happen. Let's just consider worst-case numbers.

2. The hash code will do m+n hash-value computations, n hashtable
insertions, and m hashtable searches. (We can assume m >= n.)
The hashtable insertions might sometimes do datum_image_eq
comparisons, but only in the event of a hash value collision,
which is probably rare. The hashtable searches will do comparisons
in the event of a hash match. Unlike the old code, the worst case
is where everything has a match not where nothing has a match, but
we're considering the worst case so let's suppose that the m
searches do n comparisons on the way to finding n matches. (They
could do more comparisons in the event of hash value collisions,
but I'm still supposing those are rare.) So altogether we have
m+n hash-value computations
n comparisons
n hashtable insertions (exclusive of above costs)
m hashtable searches (exclusive of above costs)
1 hashtable creation/destruction, with O(n)+constant cost

What we lack here is a solid idea of the relative costs of those
primitive operations. I think though that it's reasonable to assume
that hash-value computations are about as expensive as comparisons:
data types with expensive comparisons must also have expensive hashing
methods to ensure the hashing gets the right answers for "equal"
values. Hashtable insertions and searches are probably about equally
expensive too, though it's not clear that that's in the same league as
the datatype-dependent operations. And the hashtable creation
certainly has an O(n) cost just from initial zeroing of the array,
though the constant factor in that is likely small.

However, if we fuzz things tremendously and just assume all these
costs are equal, we get 2m + 4n operations altogether, which is
probably not so far off for datatypes with cheap hashing and
comparison (like integers). At the other end of the scale, for
datatypes with expensive operations, we could disregard the hashtable
operations and conclude that there are m + 2n interesting operations.

I'm a little inclined to split the difference and take the hashing
cost as 2m + 2n, which leads to the conclusion that we should switch
to hashing when m*n > 2*(m+n), maybe with a little extra added to
account for the constant-time aspects of the hashtable setup.

It'd be good to validate this model with some tests of course.

We could also include the operator costs for hashing and equality
comparison to make it more precise, in case they're easily accessible
at this point.

Well, we could look those up, but sadly it'd just be
garbage-in-garbage-out. We don't have good estimates for the relative
costs of different hash or equality functions.

regression=# select procost from pg_proc where proname = 'int4eq';
procost
---------
1
(1 row)

regression=# select procost from pg_proc where proname = 'texteq';
procost
---------
1
(1 row)

As long as you are willing to concede that 1 hash operation
should be of comparable cost to 1 comparison, I think it'd
mostly come out in the wash anyway.

regards, tom lane

#35Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#34)
2 attachment(s)
Re: Use merge-based matching for MCVs in eqjoinsel

I wrote:

Thinking a bit harder, we are comparing these costs:
[ theoretical arguments trimmed ]

I spent some effort on actually measuring timings of the v6 patch,
and concluded that this is all splitting hairs that we don't need
to split. The actual crossover between hash-loses and hash-wins
is more than what my theoretical argument suggested, but still
probably less than 100 MCVs on each side. I think we should go with

(sslot1.nvalues + sslot2.nvalues) >= 200

and call it good.

To arrive at this result, I built the v6 patchset with
EQJOINSEL_MCV_HASH_THRESHOLD changed to either 0 (to force hashing)
or 1000000 (to prevent it). I then ran the attached scripts with
different values of "nstats" and collected timings from the postmaster
log output produced by the 0001 patch.

The scripts are designed to test both the cheap-comparisons scenario
(integer columns) and the expensive-comparisons scenario (text columns
with a case-insensitive ICU collation). My motivation for splitting
them into a setup and a test step was to allow the tests to be run
repeatedly against the same underlying data. (Although I soon realized
that because VACUUM ANALYZE takes a random sample each time, the stats
we're working from aren't totally the same each time anyway.) Also
you'll notice that the test data is based on log(random()), which
I did to roughly approximate a zipfian distribution. If you remove
the log() call you'll get a flat distribution instead, but it didn't
seem to change the conclusions much.

regards, tom lane

Attachments:

eqseltest1-log.sqltext/plain; charset=us-ascii; name=eqseltest1-log.sqlDownload
eqseltest2.sqltext/plain; charset=us-ascii; name=eqseltest2.sqlDownload
#36David Geier
geidav.pg@gmail.com
In reply to: Tom Lane (#35)
Re: Use merge-based matching for MCVs in eqjoinsel

On 19.11.2025 03:19, Tom Lane wrote:

I wrote:

Thinking a bit harder, we are comparing these costs:
[ theoretical arguments trimmed ]

I spent some effort on actually measuring timings of the v6 patch,
and concluded that this is all splitting hairs that we don't need
to split. The actual crossover between hash-loses and hash-wins
is more than what my theoretical argument suggested, but still
probably less than 100 MCVs on each side. I think we should go with

(sslot1.nvalues + sslot2.nvalues) >= 200

and call it good.

To arrive at this result, I built the v6 patchset with
EQJOINSEL_MCV_HASH_THRESHOLD changed to either 0 (to force hashing)
or 1000000 (to prevent it). I then ran the attached scripts with
different values of "nstats" and collected timings from the postmaster
log output produced by the 0001 patch.

The scripts are designed to test both the cheap-comparisons scenario
(integer columns) and the expensive-comparisons scenario (text columns
with a case-insensitive ICU collation). My motivation for splitting
them into a setup and a test step was to allow the tests to be run
repeatedly against the same underlying data. (Although I soon realized
that because VACUUM ANALYZE takes a random sample each time, the stats
we're working from aren't totally the same each time anyway.) Also
you'll notice that the test data is based on log(random()), which
I did to roughly approximate a zipfian distribution. If you remove
the log() call you'll get a flat distribution instead, but it didn't
seem to change the conclusions much.

Thanks for working out the details!

I've ran your script on my development machine with 1000, 100 and 50
MCVs with the following results. As the runtimes had quite some variance
I didn't bother trying more variations. I think your proposal to go with
200 is fine.

nstats | off INT | off TEXT | on INT | on TEXT
-------------------------------------|------
1000 | 697 | 8907 | 14 | 2417
100 | 13.7 | 213 | 2.3 | 239
50 | 1.4 | 7.6 | 1.5 | 49

The results suggest that the hash function for the non-deterministic
collation is really slow. If we could properly include the operator
cost, we could enable the optimization earlier in the case of simple
data types such as INT. That can be future work.

--
David Geier

#37Ilia Evdokimov
ilya.evdokimov@tantorlabs.com
In reply to: David Geier (#36)
Re: Use merge-based matching for MCVs in eqjoinsel

On 19.11.2025 18:38, David Geier wrote:

On 19.11.2025 03:19, Tom Lane wrote:

I spent some effort on actually measuring timings of the v6 patch,
and concluded that this is all splitting hairs that we don't need
to split. The actual crossover between hash-loses and hash-wins
is more than what my theoretical argument suggested, but still
probably less than 100 MCVs on each side. I think we should go with

(sslot1.nvalues + sslot2.nvalues) >= 200

and call it good.

To arrive at this result, I built the v6 patchset with
EQJOINSEL_MCV_HASH_THRESHOLD changed to either 0 (to force hashing)
or 1000000 (to prevent it). I then ran the attached scripts with
different values of "nstats" and collected timings from the postmaster
log output produced by the 0001 patch.

Thanks for working out the details!

I've ran your script on my development machine with 1000, 100 and 50
MCVs with the following results. As the runtimes had quite some variance
I didn't bother trying more variations. I think your proposal to go with
200 is fine.

nstats | off INT | off TEXT | on INT | on TEXT
-------------------------------------|------
1000 | 697 | 8907 | 14 | 2417
100 | 13.7 | 213 | 2.3 | 239
50 | 1.4 | 7.6 | 1.5 | 49

The results suggest that the hash function for the non-deterministic
collation is really slow. If we could properly include the operator
cost, we could enable the optimization earlier in the case of simple
data types such as INT. That can be future work.

LGTM

For simple types (integer columns), both algorithms finish in a couple
milliseconds when the MCV counts are under 100, and the difference
between them is very small (JOB results show the same trend). For text
types, the planning time shifts gradually from one algorithm to the
other around that range, without any sharp transition. And it seems to
me that the current criterion is a reasonable compromise, without
requiring us to complicate the threshold any further.

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com/

#38Tom Lane
tgl@sss.pgh.pa.us
In reply to: David Geier (#36)
Re: Use merge-based matching for MCVs in eqjoinsel

David Geier <geidav.pg@gmail.com> writes:

On 19.11.2025 03:19, Tom Lane wrote:

I spent some effort on actually measuring timings of the v6 patch,
and concluded that this is all splitting hairs that we don't need
to split. The actual crossover between hash-loses and hash-wins
is more than what my theoretical argument suggested, but still
probably less than 100 MCVs on each side. I think we should go with
(sslot1.nvalues + sslot2.nvalues) >= 200
and call it good.

I've ran your script on my development machine with 1000, 100 and 50
MCVs with the following results. As the runtimes had quite some variance
I didn't bother trying more variations. I think your proposal to go with
200 is fine.

Thanks for double-checking it!

nstats | off INT | off TEXT | on INT | on TEXT
-------------------------------------|------
1000 | 697 | 8907 | 14 | 2417
100 | 13.7 | 213 | 2.3 | 239
50 | 1.4 | 7.6 | 1.5 | 49

These numbers look pretty similar to what I got. One thing I don't
really understand is that the crossover point where hash is faster
than loop seemed much lower for integers than text. In your above,
hash is already competitive at nstats=50 and winning by a good margin
at 100 for integer, but it's still behind for text at 100. This
makes little sense to me, as the hash-algorithm overhead ought to be
the same in both cases so you'd expect that overhead to make less
difference for text. I suspect that my initial guess that hash-value
computation is about as expensive as a comparison is wrong --- if you
look at hashint4, it's not super expensive, but for sure it's slower
than int4eq. But still, if you suppose hash-value is more expensive
than comparisons, that still doesn't lead to the conclusion that
integers should have a lower crossover point. So there's some effect
here that we're not accounting for, and I'm not sure what.

FTR, the results I got were (in microseconds per selectivity call)

	--- looping ---	--- hashing ---
nstats	int4	text	int4	text

25 0.52241 0.54468 0.19544 10.1506
50 1.35082 20.9971 1.04862 80.5282
100 19.8381 288.855 2.74378 274.799
200 64.7243 1129.51 5.3543 543.265
500 320.178 5229.23 13.3851 1366.19
1000 934.281 12774.6 29.1749 2740.84
2000 2569.61 23840.3 64.7265 5491.69
5000 11280.2 63883.0 191.85 13800.4
10000 41249.3 187174 395.337 27642.7

The integer results might lead one to want a lower threshold,
but on the other hand those numbers are small enough in absolute
terms that I think it doesn't matter. It's more pressing to not
regress the results with an expensive datatype, so I'm content
with using 200 as the cutoff.

The results suggest that the hash function for the non-deterministic
collation is really slow. If we could properly include the operator
cost, we could enable the optimization earlier in the case of simple
data types such as INT. That can be future work.

I think there's other factors here we'd have to figure out :-(.

Anyway, I'll go ahead and push this with the
(sslot1.nvalues + sslot2.nvalues) >= 200
rule. Thanks for working on it!

regards, tom lane