Optimize WindowAgg's use of tuplestores

Started by David Rowleyover 1 year ago14 messages
#1David Rowley
dgrowley@gmail.com
1 attachment(s)

As part of making tuplestores faster [1]https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=590b045c37aad44915f7f472343f24c2bafbe5d8, I noticed that in WindowAgg, when
we end one partition we call tuplestore_end() and then we do
tuplestore_begin_heap() again for the next partition in begin_partition()
and then go on to set up the tuplestore read pointers according to what's
required for the given frameOptions of the WindowAgg. This might make
sense if the frameOptions could change between partitions, but they can't,
so I don't see any reason why we can't just do tuplestore_clear() at the
end of a partition. That resets the read pointer positions back to the
start again ready for the next partition.

I wrote the attached patch and checked how it affects performance. It helps
quite a bit when there are lots of partitions.

CREATE TABLE a (a INT NOT NULL);
INSERT INTO a SELECT x FROM generate_series(1,1000000)x;
VACUUM FREEZE ANALYZE a;

bench.sql:
SELECT a,count(*) OVER (PARTITION BY a) FROM a OFFSET 1000000;

master:
$ pgbench -n -f bench.sql -T 60 -M prepared postgres | grep latency
latency average = 293.488 ms
latency average = 295.509 ms
latency average = 297.772 ms

patched:
$ pgbench -n -f bench.sql -T 60 -M prepared postgres | grep latency
latency average = 203.234 ms
latency average = 204.538 ms
latency average = 203.877 ms

About 45% faster.

Here's the top of perf top of each:

master:
8.61% libc.so.6 [.] _int_malloc
6.71% libc.so.6 [.] _int_free
6.42% postgres [.] heap_form_minimal_tuple
6.40% postgres [.] tuplestore_alloc_read_pointer
5.87% libc.so.6 [.] unlink_chunk.constprop.0
3.86% libc.so.6 [.] __memmove_avx512_unaligned_erms
3.80% postgres [.] AllocSetFree
3.51% postgres [.] spool_tuples
3.45% postgres [.] ExecWindowAgg
2.09% postgres [.] tuplesort_puttuple_common
1.92% postgres [.] comparetup_datum
1.88% postgres [.] AllocSetAlloc
1.85% postgres [.] tuplesort_heap_replace_top
1.84% postgres [.] ExecStoreBufferHeapTuple
1.69% postgres [.] window_gettupleslot

patched:
8.95% postgres [.] ExecWindowAgg
8.10% postgres [.] heap_form_minimal_tuple
5.16% postgres [.] spool_tuples
4.03% libc.so.6 [.] __memmove_avx512_unaligned_erms
4.02% postgres [.] begin_partition
3.11% postgres [.] tuplesort_puttuple_common
2.97% postgres [.] AllocSetAlloc
2.96% postgres [.] comparetup_datum
2.83% postgres [.] tuplesort_heap_replace_top
2.79% postgres [.] window_gettupleslot
2.22% postgres [.] AllocSetFree
2.11% postgres [.] MemoryContextReset
1.99% postgres [.] LogicalTapeWrite
1.98% postgres [.] advance_windowaggregate

Lots less malloc/free work going on.

I'm also tempted to do a cleanup of the state machine inside
nodeWindowAgg.c as I had to add another bool flag to WindowAggState to
replace the previous test that checked if the tuplestore was empty (i.e
just finished a partition) with if (winstate->buffer == NULL). I couldn't
do that anymore due to no longer nullifying that field. I think such a
cleanup would be a separate patch. Annoyingly the extra bool is the 9th
bool flag and widens that struct by 8 bytes and leaves a 7 byte hole.

David

[1]: https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=590b045c37aad44915f7f472343f24c2bafbe5d8
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=590b045c37aad44915f7f472343f24c2bafbe5d8

Attachments:

v1-0001-Optimize-WindowAgg-s-use-of-tuplestores.patchapplication/octet-stream; name=v1-0001-Optimize-WindowAgg-s-use-of-tuplestores.patchDownload
From b26a88d08004b2558a850388bc91d6aec7e300de Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Sun, 7 Jul 2024 22:19:18 +1200
Subject: [PATCH v1] Optimize WindowAgg's use of tuplestores

When WindowAgg finished one partition of a PARTITION BY, it previously
would call tuplestore_end() to purge all the stored tuples before again
calling tuplestore_begin_heap() and carefully setting up all of the
tuplestore read pointers exactly as required for the given frameOptions.
Since the frameOptions don't change between partitions, this part does
not make much sense.

It seems much better to create the tuplestore and the read pointers once
and simply call tuplestore_clear() at the end of each partition.
tuplestore_clear() moves all of the read pointers back to the start
position and removes all tuples.

A simple test query with 1 million partitions and 1 tuple per partition
has been shown to run around 44% faster than without this change.
---
 src/backend/executor/nodeWindowAgg.c | 162 ++++++++++++++++++---------
 src/include/nodes/execnodes.h        |   1 +
 2 files changed, 107 insertions(+), 56 deletions(-)

diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c
index 3221fa1522..cc32a92bed 100644
--- a/src/backend/executor/nodeWindowAgg.c
+++ b/src/backend/executor/nodeWindowAgg.c
@@ -1074,57 +1074,24 @@ eval_windowfunction(WindowAggState *winstate, WindowStatePerFunc perfuncstate,
 }
 
 /*
- * begin_partition
- * Start buffering rows of the next partition.
+ * prepare_tuplestore
+ *		Prepare the tuplestore and all of the required read pointers for the
+ *		WindowAggState's frameOptions.
+ *
+ * Note: We use pg_noinline to avoid bloating the calling function with code
+ * which is only called once.
  */
-static void
-begin_partition(WindowAggState *winstate)
+static pg_noinline void
+prepare_tuplestore(WindowAggState *winstate)
 {
 	WindowAgg  *node = (WindowAgg *) winstate->ss.ps.plan;
-	PlanState  *outerPlan = outerPlanState(winstate);
 	int			frameOptions = winstate->frameOptions;
 	int			numfuncs = winstate->numfuncs;
-	int			i;
-
-	winstate->partition_spooled = false;
-	winstate->framehead_valid = false;
-	winstate->frametail_valid = false;
-	winstate->grouptail_valid = false;
-	winstate->spooled_rows = 0;
-	winstate->currentpos = 0;
-	winstate->frameheadpos = 0;
-	winstate->frametailpos = 0;
-	winstate->currentgroup = 0;
-	winstate->frameheadgroup = 0;
-	winstate->frametailgroup = 0;
-	winstate->groupheadpos = 0;
-	winstate->grouptailpos = -1;	/* see update_grouptailpos */
-	ExecClearTuple(winstate->agg_row_slot);
-	if (winstate->framehead_slot)
-		ExecClearTuple(winstate->framehead_slot);
-	if (winstate->frametail_slot)
-		ExecClearTuple(winstate->frametail_slot);
-
-	/*
-	 * If this is the very first partition, we need to fetch the first input
-	 * row to store in first_part_slot.
-	 */
-	if (TupIsNull(winstate->first_part_slot))
-	{
-		TupleTableSlot *outerslot = ExecProcNode(outerPlan);
 
-		if (!TupIsNull(outerslot))
-			ExecCopySlot(winstate->first_part_slot, outerslot);
-		else
-		{
-			/* outer plan is empty, so we have nothing to do */
-			winstate->partition_spooled = true;
-			winstate->more_partitions = false;
-			return;
-		}
-	}
+	/* we shouldn't be called if this was done already */
+	Assert(winstate->buffer == NULL);
 
-	/* Create new tuplestore for this partition */
+	/* Create new tuplestore */
 	winstate->buffer = tuplestore_begin_heap(false, false, work_mem);
 
 	/*
@@ -1158,16 +1125,10 @@ begin_partition(WindowAggState *winstate)
 
 		agg_winobj->readptr = tuplestore_alloc_read_pointer(winstate->buffer,
 															readptr_flags);
-		agg_winobj->markpos = -1;
-		agg_winobj->seekpos = -1;
-
-		/* Also reset the row counters for aggregates */
-		winstate->aggregatedbase = 0;
-		winstate->aggregatedupto = 0;
 	}
 
 	/* create mark and read pointers for each real window function */
-	for (i = 0; i < numfuncs; i++)
+	for (int i = 0; i < numfuncs; i++)
 	{
 		WindowStatePerFunc perfuncstate = &(winstate->perfunc[i]);
 
@@ -1179,8 +1140,6 @@ begin_partition(WindowAggState *winstate)
 															0);
 			winobj->readptr = tuplestore_alloc_read_pointer(winstate->buffer,
 															EXEC_FLAG_BACKWARD);
-			winobj->markpos = -1;
-			winobj->seekpos = -1;
 		}
 	}
 
@@ -1224,6 +1183,88 @@ begin_partition(WindowAggState *winstate)
 		winstate->grouptail_ptr =
 			tuplestore_alloc_read_pointer(winstate->buffer, 0);
 	}
+}
+
+/*
+ * begin_partition
+ * Start buffering rows of the next partition.
+ */
+static void
+begin_partition(WindowAggState *winstate)
+{
+	PlanState  *outerPlan = outerPlanState(winstate);
+	int			numfuncs = winstate->numfuncs;
+
+	winstate->partition_spooled = false;
+	winstate->framehead_valid = false;
+	winstate->frametail_valid = false;
+	winstate->grouptail_valid = false;
+	winstate->spooled_rows = 0;
+	winstate->currentpos = 0;
+	winstate->frameheadpos = 0;
+	winstate->frametailpos = 0;
+	winstate->currentgroup = 0;
+	winstate->frameheadgroup = 0;
+	winstate->frametailgroup = 0;
+	winstate->groupheadpos = 0;
+	winstate->grouptailpos = -1;	/* see update_grouptailpos */
+	ExecClearTuple(winstate->agg_row_slot);
+	if (winstate->framehead_slot)
+		ExecClearTuple(winstate->framehead_slot);
+	if (winstate->frametail_slot)
+		ExecClearTuple(winstate->frametail_slot);
+
+	/*
+	 * If this is the very first partition, we need to fetch the first input
+	 * row to store in first_part_slot.
+	 */
+	if (TupIsNull(winstate->first_part_slot))
+	{
+		TupleTableSlot *outerslot = ExecProcNode(outerPlan);
+
+		if (!TupIsNull(outerslot))
+			ExecCopySlot(winstate->first_part_slot, outerslot);
+		else
+		{
+			/* outer plan is empty, so we have nothing to do */
+			winstate->partition_spooled = true;
+			winstate->more_partitions = false;
+			return;
+		}
+	}
+
+	/* Create new tuplestore if not done already. */
+	if (unlikely(winstate->buffer == NULL))
+		prepare_tuplestore(winstate);
+
+	winstate->next_partition = false;
+
+	if (winstate->numaggs > 0)
+	{
+		WindowObject agg_winobj = winstate->agg_winobj;
+
+		/* reset mark and see positions for aggregate functions */
+		agg_winobj->markpos = -1;
+		agg_winobj->seekpos = -1;
+
+		/* Also reset the row counters for aggregates */
+		winstate->aggregatedbase = 0;
+		winstate->aggregatedupto = 0;
+	}
+
+	/* reset mark and seek positions for each real window function */
+	for (int i = 0; i < numfuncs; i++)
+	{
+		WindowStatePerFunc perfuncstate = &(winstate->perfunc[i]);
+
+		if (!perfuncstate->plain_agg)
+		{
+			WindowObject winobj = perfuncstate->winobj;
+
+			winobj->markpos = -1;
+			winobj->seekpos = -1;
+		}
+	}
 
 	/*
 	 * Store the first tuple into the tuplestore (it's always available now;
@@ -1360,9 +1401,9 @@ release_partition(WindowAggState *winstate)
 	}
 
 	if (winstate->buffer)
-		tuplestore_end(winstate->buffer);
-	winstate->buffer = NULL;
+		tuplestore_clear(winstate->buffer);
 	winstate->partition_spooled = false;
+	winstate->next_partition = true;
 }
 
 /*
@@ -2127,7 +2168,7 @@ ExecWindowAgg(PlanState *pstate)
 	/* We need to loop as the runCondition or qual may filter out tuples */
 	for (;;)
 	{
-		if (winstate->buffer == NULL)
+		if (winstate->next_partition)
 		{
 			/* Initialize for first partition and set current row = 0 */
 			begin_partition(winstate);
@@ -2670,6 +2711,7 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
 	winstate->all_first = true;
 	winstate->partition_spooled = false;
 	winstate->more_partitions = false;
+	winstate->next_partition = true;
 
 	return winstate;
 }
@@ -2684,6 +2726,14 @@ ExecEndWindowAgg(WindowAggState *node)
 	PlanState  *outerPlan;
 	int			i;
 
+	if (node->buffer != NULL)
+	{
+		tuplestore_end(node->buffer);
+
+		/* nullify so that release_partition skips the tuplestore_clear() */
+		node->buffer = NULL;
+	}
+
 	release_partition(node);
 
 	for (i = 0; i < node->numaggs; i++)
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index b62c96f206..4a91bad4b2 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -2619,6 +2619,7 @@ typedef struct WindowAggState
 	bool		all_first;		/* true if the scan is starting */
 	bool		partition_spooled;	/* true if all tuples in current partition
 									 * have been spooled into tuplestore */
+	bool		next_partition; /* true if begin_partition needs to be called */
 	bool		more_partitions;	/* true if there's more partitions after
 									 * this one */
 	bool		framehead_valid;	/* true if frameheadpos is known up to
-- 
2.34.1

#2Ashutosh Bapat
ashutosh.bapat.oss@gmail.com
In reply to: David Rowley (#1)
Re: Optimize WindowAgg's use of tuplestores

On Sun, Jul 7, 2024 at 4:27 PM David Rowley <dgrowley@gmail.com> wrote:

As part of making tuplestores faster [1], I noticed that in WindowAgg, when we end one partition we call tuplestore_end() and then we do tuplestore_begin_heap() again for the next partition in begin_partition() and then go on to set up the tuplestore read pointers according to what's required for the given frameOptions of the WindowAgg. This might make sense if the frameOptions could change between partitions, but they can't, so I don't see any reason why we can't just do tuplestore_clear() at the end of a partition. That resets the read pointer positions back to the start again ready for the next partition.

I wrote the attached patch and checked how it affects performance. It helps quite a bit when there are lots of partitions.

CREATE TABLE a (a INT NOT NULL);
INSERT INTO a SELECT x FROM generate_series(1,1000000)x;
VACUUM FREEZE ANALYZE a;

bench.sql:
SELECT a,count(*) OVER (PARTITION BY a) FROM a OFFSET 1000000;

master:
$ pgbench -n -f bench.sql -T 60 -M prepared postgres | grep latency
latency average = 293.488 ms
latency average = 295.509 ms
latency average = 297.772 ms

patched:
$ pgbench -n -f bench.sql -T 60 -M prepared postgres | grep latency
latency average = 203.234 ms
latency average = 204.538 ms
latency average = 203.877 ms

About 45% faster.

I repeated your measurements but by varying the number of partitions
and repeating pgbench 5 times instead of 3. The idea is to see the
impact of the change on a lower number of partitions.

10 partitions query: SELECT a,count(*) OVER (PARTITION BY a % 10) FROM
a OFFSET 1000000;
100 partitions query: SELECT a,count(*) OVER (PARTITION BY a % 100)
FROM a OFFSET 1000000;
1000 partitions query: SELECT a,count(*) OVER (PARTITION BY a % 1000)
FROM a OFFSET 1000000;
original query with 1M partitions: SELECT a,count(*) OVER (PARTITION
BY a) FROM a OFFSET 1000000;
Notice that the offset is still the same to avoid any impact it may
have on the query execution.

Here are the results
master:
no. of partitions, average latencies
10, 362.166 ms, 369.313 ms, 375.203 ms, 368.798 ms, 372.483 ms
100, 372.885 ms, 381.463 ms, 385.372 ms, 382.915 ms, 383.630 ms
1000, 390.834 ms, 395.653 ms, 400.339 ms, 407.777 ms, 389.906 ms
1000000, 552.848 ms, 553.943 ms, 547.806 ms, 541.871 ms, 546.741 ms

patched
10, 356.980 ms, 371.223 ms, 375.550 ms, 378.011 ms, 381.119 ms
100, 392.307 ms, 385.087 ms, 380.383 ms, 390.999 ms, 388.422 ms
1000, 405.136 ms, 397.576 ms, 399.021 ms, 399.572 ms, 406.604 ms
1000000, 394.711 ms, 403.741 ms, 399.008 ms, 392.932 ms, 393.335 ms

Observations
1. The numbers corresponding to 10 and 100 partitions are higher when
patched. That might be just noise. I don't see any reason why it would
impact negatively when there are a small number of partitions. The
lower partition cases also have a higher number of rows per partition,
so is the difference between MemoryContextDelete() vs
MemoryContextReset() making any difference here. May be worth
verifying those cases carefully. Otherwise upto 1000 partitions, it
doesn't show any differences.
2. For 1M partitions it does make a difference. About 35% in my case.
Moreover the change seems to be making the execution times independent
of the number of partitions (more or less).

Combining this observation with the first one, It might be worth
looking at the execution times when there are many rows per partition
in case of a higher number of partitions.

--
Best Wishes,
Ashutosh Bapat

#3David Rowley
dgrowleyml@gmail.com
In reply to: Ashutosh Bapat (#2)
3 attachment(s)
Re: Optimize WindowAgg's use of tuplestores

On Wed, 10 Jul 2024 at 02:42, Ashutosh Bapat
<ashutosh.bapat.oss@gmail.com> wrote:

Observations
1. The numbers corresponding to 10 and 100 partitions are higher when
patched. That might be just noise. I don't see any reason why it would
impact negatively when there are a small number of partitions. The
lower partition cases also have a higher number of rows per partition,
so is the difference between MemoryContextDelete() vs
MemoryContextReset() making any difference here. May be worth
verifying those cases carefully. Otherwise upto 1000 partitions, it
doesn't show any differences.

I think this might just be noise as a result of rearranging code. In
terms of C code, I don't see any reason for it to be slower. If you
look at GenerationDelete() (as what is getting called from
MemoryContextDelete()), it just calls GenerationReset(). So resetting
is going to always be less work than deleting the context, especially
given we don't need to create the context again when we reset it.

I wrote the attached script to see if I can also see the slowdown and
I do see the patched code come out slightly slower (within noise
levels) in lower partition counts.

To get my compiler to produce code in a more optimal order for the
common case, I added unlikely() to the "if (winstate->all_first)"
condition. This is only evaluated on the first time after a rescan,
so putting that code at the end of the function makes more sense. The
attached v2 patch has it this way. You can see the numbers look
slightly better in the attached graph.

Thanks for having a look at this.

David

Attachments:

partitionby_test.sh.txttext/plain; charset=US-ASCII; name=partitionby_test.sh.txtDownload
windowagg_v2_bench.pngimage/png; name=windowagg_v2_bench.pngDownload
�PNG


IHDRL�^VsRGB���gAMA���a	pHYs�����e��IDATx^���$E�����erNG��J�HA1<���_���>b@@0!J�Y$HT�$H�9��qy������n����p�{�y�ng��CuuuW}���:��$I�$I�$I�$������$I�$I�$I��r�J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�j��R��[�\sM������Xy��c����#FT>���	����}���K�Of�g�}b�����k�M7��^zi�]�k����o6,�?��3�?��O�{��Qq�����.����������1n���~�����~��1z���^o�:uj�z����#�T>�X`�����E]����vO=�T��O���'���|�;���p�[l:::����������3���I���������?��n�Xg�u�g�<r��7����x���"����w�Xj��R^������r������kMI����;�H��W^y%�M��>������v��7�8�\r�hkkK�����4y�z����jL�$I�F�=L����OO
������8qb�����^xa�<����L�}	���Xn��fKA-G0�����md��6L�2����=���o�/��b
�w8~�I��cs��\(�3�{n��s��E]��UC�������N;-Mi�����7�H��<O<��Cq�q����^���|������7�3s�\9���z;�����7�|s����P?Wz������\���z��.�9�?�����+��'�|2]s�2����}��t#������o~����?sk9M���W_��Q����&I�������b�-�z�dT��{������y�O������o��.�3���nK��{��7U�JT.���������t#�r�1���*��8>�?��@�����qy�
7�����t�T����/��& z�y��;�i���%��#��R����N���:+5���<WJ/����_�2]�{C���
���w�uW�O����z|���'�������7\�o�3���?���n���$I��9���)��K/�t�]�Jw�6�J���>Zy7c����_n*�Jc0��d��C��&�eO�y����������?^y�F�9���Ro�<���6��|��E������������$3�+��B��������+��r����}�0�w���x�;����yX�+z>sS
�s{O�����&�SN9%��@/F���7\�~���Z"�}{{{�����8_�����_�rp����kp��g�y�7��&���<����$I����T�VYe����5��N�o�+t��V���S�Zm�RU=0����+x�G�^���7}&�\��'�H�y��������1c�{*a��n��qy�'�l�A�����ih�������>��O�'>���{����g.��"���f���l��R��G>��4-��v�m�ws�\��z�A��Un��\)
,����Q���W]uU�o�2���r�!���<+}�%���_<�^{�tm�5I�i��P����KSY)e�yTCl�7$I�4X50�2�,33�	�QR.�Co�������K�dh�F�y^e��+w��XO��_��k�#��q�3�|&?Qq������G�$
U4<����VZ)=�{����\������R���9o�|��$���7��>W���K���P�/o8��a�}�I7Ns��
�\o����y�G�|�cK7t��2�#H @�p�W^y���K�$iPk�er�%���Z��.���^��a�;>�����)|�!~�y����wE�q�S�!Xi8V�a�2x��v&���G�!{%i����������<�4���$I���rT�
6� ����� x���[l�E����}���wjU\�rc<�������!�%I�4�50�_��2U/�!���SOU��B��}�!~�������e�lnM�� ������|�_z*�J��k�'�$
v4L6*��$I���G}t��W�����<��k
��nnu���Eoe�E��?�)��������O��"I�$
ML�����Ge�zx�Z�,�����C�����~8��.���^�]��v���M 4W��G+��b���<w9g�^fX(I�$I��Q�*���������&�\�79;�jk"/���q�=��<�������~����n��K�$I�M[����c������~����z�t�A�T���x��q�y����x}���L-����oS@+��r�Ww�s�=7n����7w�~���w��]�}��3�����?�o����,����}F���O>y���|���Z+�MO����i<�;"Y�	���o�y���;o��f�z��q�]w�2_z���M6�$
{<n��8��cg��%������0�`�����|g/w/����k�����[�.��P�`���p�qw��������+�"��z��n��*�j{������NJ�
���{��m��L�����3��w���������^���:�����oCwH���CK���K�k��f�*W]����CM����~��'���oN��<M��]j�����o�?y�c�<�m��6��f��wo����O?=����y�#?���Q����w�3��{��wO��Iy�����LK���9�U}�?6�h�Xl�����CZ���!���������;��g�,�H���z���7�������?�M$��|G6�?����Y�SO=5m�+*�Y%?�=���7������yQ�3<������gw���^�K9p�e��s����S�n��5\wi����lc#������:q�pW}>�k)���)S���A+�b���O���y|��������h�\YK���3����Ie��G��;����v��~G9���/���|���d��7n�<]���r�<�v2��:����>`�n�a��WY���s��r)C8�8�:��|�����3�3�Tx`�i�������nKs|}�#IeK3����|Z��������^~a���7_J�����se-���1?�q �5��:�oy�<��u,�/�y�mod����:�	���_�����/mc^N�����r�<����>�\��G��|�{���{5��n�!�AyD�|]���[��Z����5��aW�;�=0o��k���?�G�?��3����|sY����,��a���:����s�g9�����uQ_�
=a�De7���W���3J���(w/���tC4���4��F������7i>`_v�a���OC\����|��t
�g (SX�F���6�Z����|��g��r�7����3�H�)j�A���������;n��m��b�EMi��:�$I�4��}�K�����E%;?��������T1����k��6U�A6���9`J��z�*.������**4�r�b�� �+����^����
����h��rE��F*�LC���Y?*7�/��T4hn�2�o����Np��K���+�C�R���+T��*��0�%�\g�uVj����a����B��y�C�R��f9�!���[���~�!F/`~���~�]�����{�A�r��jT�XN��������Zy7#�@���`�Vw�_�S���W�o����
(�X��l���4�tW��� 8�6���g��X&�=k�_�7n`_2
y�
{o�����+7Lel?��ByU?��� ��4�E!�W+����4.`����qD�����"Ot�'3~z��O��+Wn���T^4ZN��p�UW�B�����Y�r�4V�/�����*o[�������~c:�h@������Ny.o'/����_N��G�!@���^�o��y������_>�xb8��c���b���iF$h�q����RF�9�I/�a���F6�/��a�t����m����sVVN��,39W��7�{���S9Tk;9��<��c��� WK���e�i����D��t��'�>��4�<�1R�:�T���� o���L7}�*�9�_�!��e-��s�9',s��=/��8a�9V(�(��y����W_}5��4�!��G�W^yeZ���z�k�f��sO��^9��:v���_���Z���Rk��=W�*�f�g��5��r8�����XK�KP��&O��=��r���\�
�[\#�������w\������2��S�y��,��c��!������9�p�AP��e��v�?���W��s	��%�#_Qv�y/��7��������.J�6��,�j���q��GYww.��t�����?���]��e�������7��� Z3A�Fq�E:�/X�M^k4�FK]7_�q�us�K>$�L�����.=��Y�c�2�4 x�_�iL[�_�������G��-������5`y.c��Pn���<��`���y����<����m�����u���d��6�n���e?��&I�$�M���A�x�E=��z� S���mn���E�,W�����=���
Dw
���@�
�T�r%��{��rA@� ��;L���W\qE����/�S�c��G�@4�
w����+�T��-�u�Q��NH������ACR��~�4`����>���T���D����Bz�CA��������T�3*e,�4��}���q���F���+���NOY��,���`?�i���4(�*����z��}@���e����'���qF9q�q�u[��������Zy������i��b�46�g�����������b����q��2��2WXa�Y�@|���COi���G��y����Q,�I/>�{���g����l(`=Y_��`bO�����f$�����+���L�����'��W�-7i��l�1��v�����a���������)��2�2Z��C�y��I�u$ �(�;��Y��f��<v���%_{��_��9�W�w��K�6����b�
p|����_���H�F��'x��=m?�q���e4�ela���.�������Yw�A�����^����|e�Mw�?\+0}N�Zy|V�?��������$�{�tG�|Y����������~S��,��e=�?�+��>(�E=�>��up�o�f�s�!�?��KIz���F���`�����9�X����������)kM[���m=a����3��c��<���k����zy���}�C��/|!��m&?I�$IsJ�=L���2@�"P�B��]���]�����X�m��T����i.�k]LS���X�Xp�k����'�:p'%�VW��l��ExOe����~�x������e�&��������B�*R�qMC&g����N;������l��R��
�I���pNtw7)e*_l/���]��7�`HW�1��Y������7�1���@0=�W>��y��,1u�-������T)�������RG�t��iX�&���T����������S�[�~#O���yMS�&��F4�q�@�
�
?V��o�i��y[�w���w�9������O�*��8H���k_z��_Y&�C��^�+���.�;�w������O3w������0��/+�c���j���t!�H+��+���iI;*���{3��qFc7'�����"O����)�x�~$/���y����Z7y��4�0���F����*v�a����y�c�A���f;x�mdq\�C������W|pJ3�Y6��y^w�uid���G� ����D�37��n�/��������gZ�!�q�^�>�c9�4���YN��uc��N���1]>>����7rz�[�L/�3�e���#qc	�<�#�V�S�M.���GZp��2�����;^���sza���<A�-C���yz���8����+�'�����q�<9�N�,p�$��N�#�k=Y�����3�Kn2��k����o8F(/Y~��\�\~�{}�7�������>�:Q�tx$�S�0_~�9�=�s��|=@^%��yS6P�p����d���`;��S�4��w��a����'l+�7��S>e�������c�D��3���\����7�7�������y���.����������@_k6+���,3��o����~����Qo�r�q�HK�v�lW�9�����B��L���������@�d�q����o�w�N��C��������u.��u�����irP�m`y�iy�`�|z�g��az�}���g��y�s&�W0=y��q�T��7.���L���3��m���y�|�{�[^#s��y��s������l ����/�b_�[��=��#�-���9�m+���0O^�le��(or:w��H�Ky
�y�e���7�k3�q�u������\��e\���	�-e(��}H�����9s��6W��6��Plh��0�1���e���F}��qF=�����N���fz�����N�f���$I�@j:`
*(4R�
]�;�UI�q5��J#�*���a��fP���-7�����*/T��IXK#����Tt��P��Y`T�h��BNE��
������U�=��lu�
����{j� M�?
s�#�I��"�z�#*j�� ��������J����
xT�iP���+���\*J��X���2�{~[����i����DE�������� @�:�C�p�mN*_4��j("_R��
?�K�F��m��\Y�g�i�k��f�)iE��rGe�������0e�h���<@cy�ud��Y��}OC_����5`���?x�>e �+��wT����Tt{0%���1i�+���E�4�OH��V�����s��x�Pn���%��w4P~��hPA��
���N�|�p@jp����+�a�`n��%���C��<�o8n�����C��W���1��9���������7s�H�=���'}h�!��zJs~CzP&R��?IK��|O�T���4�����Y>��#]���{���:���~���@^�,�����?�����.��E���m���T�a����E����Q���?/������Q�FP�H�{��l�j4`Y]&��'����v�[��|������<����7��@�����<#��?���/�Y����iM�!���c��A�'��>�|�<��,��q�oH�Z�0��|R��y�.�eiH^ ����	i�4`��_r�'y�������g.8���,��o8�H���)�m��8v2�I/y�`�V<�k���u.����(��e^N�/oK3�����Z�78�q]�����|�����Z�L��g]ip�VL�]"�:_�e�m��}
���N>�M�/��e@�c����f��:�l�������4���<W��fz~��	��|�����Yy��q^���>��C�c=���g���
�O�.�$����%�rH*��y����(3�kx�O���s�Ay.������2x�?�O\?�����~�k�����'��\^U��j����}�o(���
��_������Q��k�|������!������S�w��|����}��	4����?`���D�8��P��+��e-�in�T�$I�E����A#G�8EE37�����C�P��"�D���(��N#H5.��J��`�*�TRr���:�\���rA���nY�9W�K�	����*�T��`���o���	���[�� *:[r���o��Re��1�rl�F#7���������40d���PP�
"
'��
��1�Z9t��Z
�%�!�A���D���F����h-LGC�y�Q)'}���t���&��7,��FZ��Ho���%��_�9�x�K�=�)oO��y�����u�}#����F.����������34���U�y��~4�`~KCan�(�y��4�PFP��
9/�mdy4��p��gY�R�
�j�w���Y�Y��4������\����,
>e��BCU#X�C���7i��@�q\�����}MZU�i��sc�Hg������ �I�|S��u�]SYA��J/�(�ior�eMu����W����W�F��Nu��W���_�(.�a�������qHcd~���4�S�3�5o�g}X/zl��	��Yf���9
��m�e���8�X��e{�sLu��9�2?oCY��7�������E�[��eC7�Rz��e��z�s9����y�V^���z�
���/7b�t&`�v�i����Kl��&7�g�7���U?��wv\k6���r6_��l����ZeF���>������=K�{��Z�����e�����������������T#8��G(?������(���� �Nze���,���"u7z�U�^����?7�����r��D/�����4�5o����g;�z��?���U�������N����<M���e9,o�����A��8?P�w��c�(��R_d�����
*�]F�C>-���b���W��('8�k��yP����}�1���;�C�M�Y�f������;���=�W��H�$IsZ�jH\���hh���LG��NS*%*T�re��D�XF��Tb��?�.T�	��w=T����Y��`P�q��R��bD%�*E|�Jp=T�J�

���te���F#��\��ME�la]���U��^b?��p�'7>��c���q'�$��l����2��U�3H�2�i8��/Q���n�z1�Sw������WO�_ns���A��
g�|��Tj��F��h��q���2�������zrCMn����=!�+'�����&�/����n�)�4���q��MC�1i�PX���f��Y6���d�w���-����&��'�/�{�f����J�/�uO�q��0��f�����T]Vp������L9]�H�������r�(����=��z�&(���"�{�0_�s��{j��z��|^!�����A�g(G����8,��yW�,�m(?gh_���m�-����Q�fe���(��Y�2�@���F�c�4��:�����
��ci&��:���foP����#���u�j|O����k�FX��etw����~�J�k��@^��\o_�/�{t��N]���2HC0&][������q\3��e�7�q,�k�Ru��|U/��w�����%�Q���	zkv\������avb�9���e{w�M]����8����,�@ ���#�FD������H/c���2���,)�M��������&��{Y�P_/����N����+I�$i0���Q�\`�
�ZA(�k���
A���������
�����;�{�(5�,��]�,��n���
�n��.��N�z�x42<�������4�.��Jr�Ohl���xXV��{87�����P��4"�������O�-��]��4.z�?����u){C��h@��(�'������2dSO�y�EP�����j|�����8����|���y0��FI�U�/�S#�D��e����(��y�5e�Q��_�����_�b��!}E�����A���!�Y������Z�^J4d�-=!�����F���+��|l�%?���
�����D������t��%<X�^e ��H#q��|�
��K�xs�OYL����G!@�qsWO7� �zB�������i�-��w����G��oh4%=��U7x�����{u���7[4k���[��	��w��1?z�|�k_�O����|_�!�#���f�(W��f�����^�������c��s	������V0�?pl�t������`�ziT+}���K�)��\ktsM���u`���z���?<���/��l��F=��i�p=���O387�y����WU����:���������������z�5_���&�RR�P���F���k�
�6��`�Y���HgnN�ew5�������$I����|
��JKD�V�b��|QM�D�@������*
��2F�wOC����Ft�+.4R�h�(��44�PQ����hV�Q�o�5�u*�o���`"�+�R}�,��T���@D�x����j�L%�J%��l�����w�(�����Ho�Z�Y�-lc�zXnt��N=�3rop\4D�R�������������;��ER��(�8�)�y�[�A��-�q���s��>���<(�e3����P^4�4���r���2(����h����\�M�!��'�X������^�Oy3C���U���8���z/~Su(�j��9�4/l��f�e�6��o|#>����!zi�l�T6��_���iY���[�I���F�z(��F�)�������y��F{9�y&`.���.�����
�<{�^p���o�c8�f��c��%�3���SN���?>=�y��IF����������������Z�Y��Z�����xf�i��M���z���u!��tcOop|��������#������������(C��;���6a��N:)��	��<S���~��_��5k�����}�8���f�uZ5�}N�.��;�(��3�M_�A�+���~#XV�`~W]uU
��7p�7��>��tf��vX|��_M�nww����v�K/�4~����������&�[�G�>��)��>S�M��<?I�$Is�^����U6F��\V�i�(YiH�w�Oe�jq�^6���Q�#��F�fU7Z4����u.��������*!"��,�I�
�m&��FG4��Y�����
�H���/�E*���2���iY�z��g��y��YO�Y*���U�
��������F�/�XNO
(4��wbsl4�`M��?"�
O��#�����A���r�[�`��~���^L[�������2���B>��w�����G?�Q������/�<�=��Cu��l��)AOe#f-�4��n���_|��5�����O�e�hP�K�������/�K�e�{�v�i�44��Y����Y6�q.k�p~�X$o��f�s�q��(��9����Y�E��R���<g4�V��+���#���a#�O�c��z�O�o��Y��w���p��1;��C���b��~n�8����<�:���\nP�KY��������@\k6��l�l&��U����7���5pV���+�"��������|(7(o(C(9��	�887��'?�#�8";�=��tk$���k9<6�&���1�~���/~��������W�����N���vN���������eQY�����f�fP�\x��������=������'�9.r>�o����^y��)HO^��~����������7�7�Jm�U}c1������2oQ�5:��$I�4���*�JK�S�����
J����@w�T�r��JPY�����l�r{�1;U72S�h����7���7�["��P�-4��2�W����}��y[	hQ�����('e�T����L�]���n�)���������n_���ogI+*���~���}�Q��b�(�[O����l%��7zW����nf_�Fe:U��FU�/�CCb3���V}�9��?�C���B��L0�����)��O?=5�����Q�>��7��<��g��VKuTK����VZ�{��F,��7��:��7�k-�����u�S�`�N��2(>���eC8���Z�Y�U���6��2������?�1T>?�sm���<\�����{kv;\������%�D��e�G��g�qFy��)XD[^���@�_�a��5��:��3��X��sI�g���r�F��$�����Ko����G^#o�g���`�����i4�R�_�;(w��L�M�U�������:�Z���@���r���^�A��M�K��9�I�SO=5����\����{��g�K��W�>����������t���W_��7y��$�H���,�s
�2���,���>�F����|�47i7;b�$I�4T���@�H�� T��@�3-i��i].���L	��4���6.���F��TW��Yg��=�}���g���;���^�]�2s�
��d)�`��U�z���;�����I�N���T��w=��%�1�����t���������l���]������ M���0�-��I�9��Cc�v����1F�'?��B��?����gDw����-�zSn����f�`[�����5'�Y���\����9�'��V�
�l���D���d���8����J��z���'>��G�������V�Z�QQ����T�����m�~��>m�ZsN�[�����3���y��)�D���Q�)���y�c��[ll�A��'�~�o������F�`�,����e�g���]�6��N�1���`�����9��[^%��{�&��{�xz����������@&�\��q����������(ey���[��������:?
�r����6�1����������$I���a�����K4F�}��3R�fR1�.� �"|��7���H�#��{?P�ah.�i��r*��n�m�w��^�[�s���[�v�4��>���e����+��I����dT��*7�Rq�YB���~"9�Wk�zZ�F4���9=��a[��2$*�<_-��h��74��hI^a���3��l�M�  ��F�F��b��������:�w�	�q�u����{�~#M�y&/��:�}���^O�����:��X��;���ht9�qL6�/X��o�}f��V9��6T�+��A��lo_���7/�7��&�l��-�4[9�Q�8����Ya_���:O�+��Zfe�>C���M���������k�o#/�*���m�guz��>�����6����k��6K���ub�z�d���i��~��\I�M�d�6_�������^1�~x��k��sU�����m=�7�?���Yfg,�r*�����87�������	F�������F���<v&0�'��}�r�	�V����>`[.�(\+�=�
t��k����f��rm�U�c��
�\���x�N#�\Ko��z*;Ayp��'��P���q��B9@��y����^�M�����Y�4b^�Xo��q}M���e)_��w�?��zT����]���i����F0��@��-y(_/S�QW�l������;��I��.���;�=�2r��� �6�g�=���m�����V[�s	y���u���y�^y��r�:�U��c9]b>,#�������[n��������>�QK�I���������$I�Z��9PA+{�R!�2���T�2*�=U
��������xz4fy����Jj~�H�Z
�0}n���:�H�Y4���T����F�\����i�G��S���N�~*���1e�����2��x�yK�M����y��Q*���)�I����-�L��^6E��T��������������34��U}��h��!���.��_�����_�z����i��������<��ln
�e0:��>�������=�~�q�������X��}��Z��g�����u���`Q}.c����-��L���Z�������Cy�����'��H����r��{�I����\�a��k������c�e���~#H�����7����l���N����
��k@�l���o:�V�q��,��4��f��H�����sI+!��n�����(_��W���L=��ps+������|�1�>�x�~������|:�9���t�MS��<�?��u�5�x3��}�6����2�����|��]���i�����?��?�)�V�y�2�!x	P�9�m����R~��}�S��o|��,�{���M@��MYO^d������a0����y7�#���5,��5���o%I�������]�p��8�@�}n��r������4*���l\�B?����:��
��]���R�S�4��e�T07�����$��r�
 y{�7�NZ���G����4(����%��k�}��z���W�]v��r�-�������\n�Q�<������7����
���.�T��g,g(k�� k6PC�)��7�/��.�rq3��Hy8�h�!Or��^{�_��W�_�����e�F�XVy����
���R0�i4�F�n����sec��P�N4f��G�&������D9�(����?>
�x�)����f���!�I�f�?p����In�l��7�?��O�����s�9'�X����r���B����i��
����k��mN;��uq>�Z����;,5�S�����4�K~��KZ��f���e��9���~�/�H�F{ci����������[��^w9�D����:�|�F3����8���__������ey��.o���9u�6X����$�A=�4e�sQ��|@ZQ�5�s�Yg����<�+�v�C�}9P�!Z^[�;���y�����|L�����G���9a0�������������\�"m{��[I�$i��S�TV�E3�@4��C?QA ����`�r`-W���w�f����c+�fT^�	f�������Ve�C�6S����<�N����i� p�+����^|����G�M�4���T��>=A�2�p=4
��f^��r81����� 3�G�����7lO����_���8s�A�
����L�����HUo��e����.�!�������������!��t�I'�O������*���
�#]XnD��~zmd���'v��wy�8
4{��*Y)7� lo����C�7t�o������<0(����>�Q^6s.�X�X��������Q���g��C	77�7P�4��I~"@�qE�%����1�k���4���� +��e�����!}�k��9�����^��A�:y��v�C��_�7��f���
t������U�_�_�����.�>�g�lZ�[�b�J��(��uZO=���gJr#��~���o�sry�e!=Zy����gu��������EY���c��&?&�<{2K����}�co�x��/��|~ �p,A����z���s�`,����B�>��.���iy��>T�b$I����s��;Us��
	��2����4Z��r�����H�S�cq��Q�����F���������b2o�i�(��lD�]/`Jc=A3R�}~)������b�0e�N�ww��������V�X��g�p�u�(DE���/H�Fr����g�~#x�h���� ��B�(K����K4^�&`���F�d���\�g���H�J5��@"�<����}��	'��z�������O?}�s�7�{���H�|O�;l�\u/����U�}��
���K�45�0���l�1�,�z��Gydj������_��Z�eb�^��{o��L=�����0��<���3���,h�x���eo���&�g����2�zB��<��>��l4X�2�����QG�g4�7{#@_q�R6d4#@��|�.�����8��B�V��!�9�P���!�}o���2���e��]�G	7�#��)�=��2���������Z�Y�c��
�-��F�[����2��_37ZhF��i��s�Ag��{:��c�7��7=���O�D�����k���N
((�Icp=I���:{����Zk�4�a^p���i�#�lX��f�9�}X��
75�
���R�h>H�����G���Yn���2�	�H�$I���������5
{���\|����P�)��H��U�:�� P4�1!��!@��'�kY9&�n���Y*6���z��W���Q�^C,�>W�h,���x����Q�Ui\�P�{��W�[�f{�g��4-3������
F4�P�.�g�;��4p�|X�N�����o<G-�sP��������!�\{��=N7�T�G���7.�@�) X���7��c�A��(;��f��x�Wy��F��0-y�<���}��L7�����I#]#Aq�-o&@����)K�h�4�d��S_�Y���#z�6r<�����a��N�a}R���:��<K�����\s�5�7tl�OcP�F�r?����h�����>s:����7�����W^Gll���c5�t%��+��(�)�s�����������)UI���b5�Sy����!9�H~-��9e���%���M9����&(��k�r��f���;����A>-�����\G�=�����M���#_��{����X��</����|�~��i48E�����<F�5��iCE9,;e>7��G���T��r=I��*kA��a�9���n��=�5�~������z��>V��t5�<=�3�9��s>�����9��%I�����W�4P�0�Q9��M\X���FP����\���0X�P�����{�33�H����\v�eu{P��7AyGow�)R�^����NK���h��9��SS�)#��s�� PI�Q����\�$�X9���Q�
f��FK"�k���MIc3��}��A����r�#*��E^�Y*�T���O���3�hx�$�[�TJ���^:��|C���_���G�)��4��`q���g��T/�j4�/h��/XW�;��sg�M�6�d�n�=�>����H��^��AnL�
� X^6$S>��97���I�����s�,?��k$(����;����V[���,�<Gz���v��G9
��30C��qY���qC���z�0l ��o���<6�h�>7�����E�����e��K5�s�w�=�w���w�+�l��[l����d�s��]�x��g�R�}���S������LX�z�R��`������e��^i0�o�T�9������2�F�����	�c�I����<�u��
p\��}�����Z��-U�e=�����O�k�j��+:���k�fq�o���3�*���m�����*M��
�g>�)7Z����N���u�c�|Cp���c:�V�7]d�?ynft�{nd�w}�q���#OC�H�G����mi �����a�	��7��F���@0�2�������@P������Zy��N��rK�=�)3/�������|[���i0�������:�s!7���b?�7�I�$Is�a��R�����&B%��I��RY�f�mfVA��
;{����<��v�n�o-�>�A��8���^��+W��7w(���p�y�.�Z�
�I�&C��0D�e*&C��i����KR�Z��z�Fz������_��0~,��������i�i�<?����`����[(�d�.��#(�+\��3�-��F�KF~�n�����AW���}Hz�.��,�C�y07�
�'A,�����F����z�����u&�Y�)�?~������� Kc���G��T/��
��������C��4�
p�7�������&��
7��g�wl���}������V�6���8�w���+/GX?�AO�2������<������my�m/{<s\���|�1D�3k��e=�y<���L$/�69P�oHG�Wy�h�2i�'M���r�-k�����G9�z��m�����J~�E��Q�Y��(�X��7�?!8Ns�����3��y-�����.���	�pl�x�6�gi�c?Pf���?���L�y� N.+X/����������A@�2z�m o�/8��g5���'|w�<�J�����;�����s%�N�]n|%=�#�O����u�]��3����<��n��m=Y>iH>��
�,�}LyE���&�K�;������l�=��y�DuYS�L���������f��q���9���W�y���4�e'�������K
���#�1-������G����j����5��1��I�y���C9@Y�r�L_�#}����y����t>/�_����K3�����Z�Y,�������������$_?d��_�A��r��sIo���T���a�����sb�
���>'�����B�!y��Ik��}B�Mp��aZ���3�:�T�x,��k]���{T��r�sU�y�u*q~f>�g���p�Q�b����;��@^�U�_��������ONy�c������?q��b���Y.�8�w�a���e%�Y�����W�EyNZ6��L"���2���<g�X�n��_s})�1�0��9�|@>���r��V}6S�6���:�-#�YN�n��������}�$I�@���)�U*2e�

�]��\XS��D��DC�|'sOzjH����=4� �!�� X��T�i��N�@n���@�%�i�u#m����Q W��&*�Tn�7/��5s���m��v�,*��"��xG0��^eo��^����^q�3z@���5*�4��`���a��/����}��hg����iJ��mc���<�{�����}J�d�1o���Gc�����p,�\��4��Q9ULY�Unlb��4�N,����v�������c�m�jHo��^��}�{S�V>�
���4V�~�	�1y_�/�We��}Js��F+��[��ry��>�k>��2���y�}F/����/50V�a���j�y;���s�>p\�h�>�X�JC
�;+�������a�1y�C��u"��e�����85��:V��@��X7��� ��h���f�n���Y�;���M<�xQ��7X��2���L������c��HK���
+�m���Zu`��c�t��)i��[�/h�+�e����<C#�����d�y���s���-����>ey��%�V.��:�������Z�������)8W�p������������c?#9�n���=��AZ�&���86��jd��z������|$�P�P&������>�����U�c��Y�0�*�����r�V~a^��+:��r��������Z�7�y���������9=�3�Fz�����u�-���f�%�=��S]�vW��z{N����� ���r�D�W_���\{�<G�����r>����B��X����lj]�������v������YiY������y����u��uZ��V���:���8����AZ�?s=$#0�H����v�HK��)��}�^�)��SO���].�A^ ��R�c�u���>��T/�����A�qY}�6���<9&(7J���;��cy����$I������5T�k�.$`J��Y����`�zvTrv�i��(@�4�Q�RG��h���n�j��G#����Lr�S	c�y4R�J	����C9$��l4x@E�F���T�������K���h��X?�z��7���~U4J4��a�\)�N���X?����hP���6t�A�7�>b_1�C#��c��lz��f�`H �Lg��u�U60�m���m�y�ue�����q���h��:�q�a�r���e�}�g�{��>�����������qV��>C�p@�{��0��P���|�d���s�
�� M�������q���}J�#�,Qf����|l��Z�M�;�9������Ry]k;�y���z�,����9����v�J��V`�/�o������W����SsD�e����� F�sYNwp�p�|��H��/y��R>�^��7���\�y�/���ny���$�y�s���j4�0��r[��.��p�`;�>^��5�@;��{u~-�1^���l���6�������+�n���@_k����|�#�|\��m�����
�������<�9���������L�3����A�f�j�c����.�y�c�?\�v�a��K�_�C�)i�\��u�P��`�J�}�<{��%���%�}.��}��vo����b����W�'����9�|@=��Vd���c9]�eV��>�V�$I��KS*&\��+"��F����a=�2��4�3cE*��j������4c�
i�#8F��W^6��<v�u����{���w2��n�*a4�q1����y��>��^w�4!����f�z�����k�Qy�v���]�e�}Y>�w�rg{F%��F���!�X'�Hn�$����2��q�%iF��3$7,�}�/40q�6\�%��~ HX�����<�l��L�g}@z�XDP�
6�����l��V�� *�C��cz��9���\���������q��4�_����W�wGu/~O#��w8>X�
���F/[9Iw�S=�����q�4�%������g���%��|�:�}�����9�7��� �!�XOz�f�d���#�'����M���a�1�mb](�ig]z������������e}ry��+��4l��P��q�K#������e��?x��tg0�0����G��1�v��G�1Oz�����f��<���7���M9�ye�A�5��%��u������i����WH.�{J�|W���������/>���`G���e�#)��g�@��6���Io5���h��\��@;��+i�zU��|B~�������{s������y��,���e{��LC���A�F^������0���$�8�������$O�iO2�5i�~��`���������r���.b?�����E�������1����?�����?u��2�eh_�U����zT����iF���2O5R�"}y�E��}�H:5�<N��Z�y0�>o���k�6�8��L�C9�
��6��"-9��^�������> I�$
�������gq�K�O�+��4�Tc�����F������/�AC]��P�����{��^e�D%�l�a��`����~�2Y>��r��Sy��f����e�
x`>���42�Z����m�N/�����z�f�������v�KS��|�������;�RK�(��]����K���������o�[�8�g�}��u)"2��c��F�|_{���SO=5
M�q�?�,+7~�iUC������n����^�l���5�.��}����]+����f�U>�X~���o{�.}I�Z�_N���b������K�������4/1����SYU�;H�o�<����~��eU���<�����Y��������u���:�z=��`���
��.�K���q��H#�P7��p�	3GN���!fg�q��p�`�J������}����W�v��g��J�|~�_������~`^l_>O���^k�F�}��r�7�G�OY.��������NK4R�1}o�����9�5�����ez^�]�^�\�e�w>VJ��O�_��I���=��j����7</����\���<��q]�����tj�X����'�ry��Go��u�������9��iDY�:��#e�$I�4��-`*i��e���o����Nh�*�r�_�9���T,���s�zSIR}�F9���S#,
�4�s>�$�^����?��sx�=%I�$I�S�Eq��C���'?���?>'}���7=c��r(i�\��r��I'�G}t
^u�U��F0�'�|��nF�����$I�� )�5�=Vjtn��F�;�6����l��2�$I������T���x���?��zk��Y�T������I`(�Z���s���F�����y��s�U����*��yP�yN�$i�D�|��k�	���$I���g�y&�|����.��7�H�$I� g�T���B�|�������[����4�aw�W����q�Yg���l���O�jK�����e�^�I�<�aZ�}t���������6����)#I�^}������f�t����a��Yg����q�����V�f�mF�$I��a��R�[R����h����?��=���G�N��I�&�^�7�pC\r�%���O���Ku��vKC!�B@������z������ys�Be�^���z�������t�zF#�V[m���[�}���'n��:��MSIj%�#���9������/����|6�|������$�^� I��k�}��'�\s����]�$I��m��u��Z������3�HA����4v�����{�H��C������k�ma��o�=�=����/e�LO�J��1��S���2��}��c�H���x���w�Yyq��@�$�:���vZz^i~�G �
+������<!I�e��)S����#$I�$I��57������E�,	n2�!���/=D	��PM s��V�C=��`)��^?|p,����3��{�2���Y�\�u�]c���������8����o��[l�t���	I�s�p�n�T�$I��{�J���p������S/��%������z���J�E]����	�2�.C(����GI�������c���u�]7V]u������s;{�JR}<����.K�"p^�|�������n���g#�$I�$I���R8D�aq��F�Wo��/�g9�7iV�������VKI����Q�y��7���oI�$I�$I�1`*I�$I�$I�$�e9V�$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�j��R�[�$IR��8u`����b�������+�����������j��������h��_�$I�40�$I�Z�q���oZ�]�jo����#b��FT>������1�7�����W����6jt���c��|�^��|):^���A?k��!���t�I�$I���J�$I-������7M�IS+��F���w��fWS���_���8:'O�|�����m��c�#��X���zc�����'=p=L1|�h�i����*H�$I���E�$IR���i,��:��':*���L�������3:_S�������}�>�`}����86�t��}���[��V�v�m��1��z�d��^�x�����e��i����&���/��q�*�J�$I��0�$I�Z�����m�N���YL�81.�������*����a�?V��)���n��zj|���N8!n���x��'����w�q�q�!��/���'��I�?X�����;��SN9%^|�����$I��'L%I�$i6�2eJs�1��o|#�x����-����������N��_~9G/��������o�[|�+_�a���@�Yg���{��`BP�;��N<���O$I�$���J�$I�lD/5�g���J�Us��_=.���x����3��Lv�a��w�#�_~�Xm��b�����}�s)Pz���/�P���$��������o;���^��$IR0`*I�$I�`��������k��;�,�@���������|���n�m
�2���>�����>��~_��S��g�J�$I��0�$I�4$�7.���/��?�x
l����=��#6�t��S������������������?�q���>�7�?��8�����W_�L9+�=y�9�������M�9��C���c�YX����c������;/����>���������-�8���4;��C���?L�Xk����4�QGO?�ty��i}����>;=KS�s�5�����7�Yw���'��g�.� }F�Yj��R���[,}Vm���O�S~oO��{��g������K���Xd_���ep,����6�(
�������$I�$���J�$I����)��3 ?��O�o~����Az��l��~��q��W��>������z(\&G>����I'���rK�
��.�,�����������c�U~1���?��h���w��x�������*~����'>����l��	��SO���{�?~|z���e�]w]�����o�|��i	��)���X%����-��{6�y�.�l��0���gI��}�tk��f�l�
6�O<1���n`�,���1r�������^8_|�t�vk�X�������Zk������{��3O��'?I7�����1c���$I�$���1K�$IRz���\i��Rp� APzR�������Xc�5RO1��9����g�yfz�hF������N8!��;��#R���,�%�E�@��Es/@��g)��j����3�H=Xo���8���R�N�6������`��������L�s��������S�����������/i����p���G��{n�g����HAY���Yw�yg�}@���'�o������"0��.�[o�Xn���g��Xb�����!�������:i9��|��7Oi����f�`�n$ XJ�3<2F����c��vJ��������$I��~��%I�$
)S�L�u�]7���/��n+��B��������+�����P�L��E����/�����Xxn�?��4���/�;���\~;i����7�|3n���X9���f.�3D/�G��<4������i��%�\2-g�L���J@���,����.���F���3/������m�]������Xz��+��7����[+G����<��[�����;��3
�L`��K�H�
�O�������#�t'H��U��-�b��O�$I�����$I��!��s0z��;6	|��=��e�Y&�
���_�|������"���=	r@!�{��/�����^z)�N����w'������UVY%�?��4���+�X��{�|�7)�������1�9^�n����]�� ����.�.����xG����LA�����yJS�t�r��������a��m�O��8��/���'vn�1bf\�$I���I�$Ir
V�x���}Op���fC������;�'&�G_x�������sP�cs����Y�������LU�z�=��g$�,�c�Ep�L����W��[~F&�y^)�T"P�3���Zj��t�MS���e��</� ����;����;��#�>��CR~R��fn� Jp��A����&�Hp[�$I�����$I��!'i[O3�$����O?�tz^��>�����]w�5>��O��~���=9	�����i8^��������������|����==���i������v�e��,���K�;��4==^���z����y���-��,A8��Y��#�t�go-��'���wR��^���?�������'�d�M������W>�t��?����%I�$	L%I�$
9�\�������z�����|0�4%h�sP	����?�L=+zr~�+_���:+���o�����7n\z>��g��~���������aC�mJ�����W_M�1}��Qk�5�HC��A8�c&�Jp� ]=���J���o�#�<��qk�t�,��"i��=�	n����M���+$I�$���J�$Iji�=��cR�����n\p����_��Wc���K�y>j-������W/���8��R�Sz��q�q�e�U~���3���`���O�3���:���g��N�-�p��zkzOp� ]-������G���Z|�K_�C=4Mo�t`07AQ�u�{�f8^���%I�$)3`*I�$��@y��gg����+��P����J��j�=�X|�k_KC�����iZz���Q�E������y���{oCC��Yt�E����O��,��^Lk�m�!�sJs�|C��G��[n�����`�����L���������o,��������+�:��3�Gpn��~K�$IRf�T�$IRK#�����G�N�� �/��\sM��[�
�����^���+���uJ�O������i�@-��`�
��-����4\p5pGuT|���L�W�0��=�4%w�u���)�l�UV�L�z����`��1c�[��V����=>�W��5��%H��c�W�7�x����$I���e
A�$IRK�G(.����$ 	�e�[z���oK��x����n��O�3No����6mZ���^q�q��g�<���m����%P�C����2�I��#�H��v�q���'�/��b
�1�SO=?��O���c<��C��j�����I�0��~���	������������\�8 6�h���}�W#���8�5����0��	v�
nK�$Ijm��%I�$�4�����K�I���|'
�K�?��������/�Zk���Z�z�~��N��������i��Z	p2,/C�����KOR���H�Y���~S�LI�O��s�K�\������|�=��SO=5T?����u���~�����/���q����r_u�Uq�]w��Nw�}��i������������ )���	�1J�[�$I�JL%I�$���[,J���7�_~���C��<����KA����+�����4o������~7�Z{��W��M	�m��6i(�O���h�8;��CR����-�{2t��{���{I@��L��g�t�A����&v�y��{�~c��M��������\5����S���W�x��n_<�V��a�9A��g�V�%I�$���"�Y�[�$IR�8�w������o8">������aHZ��e�[������|O����@���T���I��/�a(���-�.���C1bD
t�{z�V�7�x�7��������9�3o�o`��|����~��g��V�P�/��]tNx��n������<>���g.����o����{$7�<0��o:��5����+�N�
_��U����_��?�|:�96����J��$I���3`*I�$���0��cn����!`*I�$I=��HI�$I�$I�$I-���$I����X`�T��g���Y����������k#���1��F-]�K�$I�f?��$IR�{���|�����4��@��y>���_g��[��-���So
[����N��[G��V�I�$I���3L%I��4uz���v����c��[�>,���z��I�b��������I�j�g�����'�\�cRtN�7:_���A?k���1j���$I�4�0�$I�Z5��S�:�������7R-��G��I�7���=�F���Q�uvt��	�7���-b�|�7�$I�4g0�$I�$I�$I���|��$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYm�]*�I���j�{��q�W�}��K/�tl������������ho������������{��+�mmm�)���g�����/���#{��4�>���e�]�|zk��+I�$I�$I�$
VL{��;�����q��7�k��'N��#G�|���-�\~��q����Q�*�x��o������}��.�����J+������5����v[|�;��[o�5���'ON�Xx��c��������T�n�@�W�$I�$I�$I���^x��8������.�u�]7�<������S��o~�����/�O~������*�x����>:�;��Y~{��W��{��z�2�|�������#�L���w�9.������;��[o�u��������5c��+I�$I�$I�$
v������D ��?�il����_��;vl����|g�-J t�����v������^�zr,%���f���.��2�����o���~,�����&���a�����<�9��x���?�����~w�=Z���������^k��f���:�w=��J�$I�$I�$IC�=L�4m��x���c���J���R��R��%H������w��?�|�s{��W�ax�sN�o	�p�w�}S��^�/��b������/�<���~���{G������+��>'�o	�6b��+I�$I�$I�$
L�D`�`�i��tP>���[�����I��k��K/�����Xl��R����xf����k��v�x����CU��x��'�sF�Xc�h%8[�=��=�x���*�to��+I�$I�$I�$
L�DPs�E�UVY%�[���y)C�2�nF��g�}6V\q�����y��7�0�0aB<����O#�6%��0�\kYd�Eb�%�����?=G�5_I�$I�$I�$i(0`�O:::�����O<1�8��Xx��c�}��X�2E������GI���������O<�D�6�N����<�z�l�gkl��@�W�$I�$I�$I
���;��#6�`��~������~,��B��_�*�/��%�J��������<�;e���/���L/�Z��m�@�W�$I�$I�$I
����%hz�=��!w�����N�I�77n\������+����@�W�$I�$I�$I
�:���z��x�z��������w��k��&�:��/~���n���k��m��&v�q�8��Sk>?������n��;��N��O�St�A��O}*~����ar�M�81���/�	'���rJ�����o����B:I�$I�$I�$I���~�P�g��!w}������]tQ|��_O�92n����r�-{0e��~�������B���_��N�$I�$I�$I����g�uV���>����?N:��Xb�%���o��w�=VYe��\z��+�x�-��W����/����mz����K/�4v�y�8������u�7�|��C��[�����+��2=C�'5�Z���>}z��$I�$I�$I�4�0 ���?b������_?N?��Xu�U��'�����/^}��8��3c����L����������_���/N�L�v�m��}(�\s�8���c�%�L�����$���z�U��o��[�`I�$I�$I�$i01`�$�����������|l����ofE@���p��}�K�I_|�x��7����l
��v�i)PY����K=S���3���W_=}������p�������c��6J������`�9����2{2P��$I�$I�$I������j��#��^�s�=7�>���|�j/��r\r�%�o�.�`�{�y�IAG�s�����p�yK0��-��2�o"[l��c��_�s�9�m��==R'L��l�I,����o�7P��$I�$I�$I���a��R�[
>|xzF)�M��=ztz&)�P>���?��OR�P����7�c��M=Fy<������k��I�&�ay���x��7���G}tZ������{~�a������x����'�]m���r_z��8��c����O�}�k_�%�J��u��������e��|%I�$I�$I����!y{���_OC�y��)H��K���#��$��0��x�;��#�����:}�M�6-��������<�L
@�5*�.��*=:	�v�a1���V~5�Oz�~��_N��y��x�:ujZ&A�������{��L���N8���|�����1f�������$I�$I�$I�4����p�����&=@z������c��q��J+�A_���b�
6H�����S�4?+��L�e>�n�m���������D��W\16�p�����h�W�n��_���c����%
���_~y��ow�i��z;_I�$I�$I�$i���iL�2%
q��k����yx�EY$Zh��� &C������������<S�@ewX.�Q	�2�/���E]�fPz�>��S�9��/�x,���5����J�$I�$I�$IC�SI�$I�$I�$I-�~HI�$I�$I�$I��0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I����������!�o����7-^~}p�����2<����oT[�SI�$I�$I��9���4�y�����������:��� 3�=b�y�b�E��k����0h*I�$I�$I�����0z����i����,����W��������6���$I�$I�$I��g�T���ujLB����1mPw%I�$I�$IRk1`*
a=�Q�k�?�3�ye���$I�$I�$I�;0�����Ss����$I�$I�$Is�Si��Y�w�Y������g�~��f�2$I�$I�$I�e�T��{��������{+D9��3��*��������;$�$I�$I�$I�JC���u�	�Ry�GKgG��p��1���$I�$I�$I�:�T��4L��']75.����45b����u����J�b��3"�oN��=2=.����if�L��&�c������m1}z��t��M��{+z��<m��F���c�����0������������G�����]%���*�b�MG���e�C���79�����q�^�c���%I�$I�$I��{�JC��/w�MNO�R�����k�����1qrgz��d{�������n�
G������:c�Q[�9<|��Xj�EA��o="v]oD,�`[�n���w.��rd|`�<?��o�k1eZg���������u�z���c����]�v��[5$I�$I�$I�`0�{]*K�2����q����zj��7��������{j����hoo�w/?,��-�|�#V^�}�t]����)q��S��G;�c�c�������OL���{l4"J��pJ\w��4�E�k��������^�;���:nbg�����n�|���]]��t��1�������?;�'��K
�m�����$I�$I�$Is��
i��dh���C;��==���O��_�L�������]`L[,<O[�c��1�������������]��z+�1����
�����i��^���t�o����M�F��8���v�3]����m��j��OG\so�7b���1b�"%I�$I�$I��(��B��7��5�����_<eb���))h���'M��'_��%hK�����9���_���Yx����=��eJ|�����*�gmmm��'���j�b�������j����eUI�$I�$I��9���4���E,��[�3_��=�O�4c��l�U�������g;��	��w(A��^�&G�w�F��g��K��Ow�3�k��*3��<Y,�����+K�??�#.�����DZ�m�T�$I�$I�$
L�!���f������������-�/������c/v�����Y�+-����l{�;�-S�O+HZ�g��������w�y�M�|���W����c���oiK�!I�$I�$I�40����=d��q�{GV>y��k�=7�z��y��������������z����3"�������G���R`����}5��;�;<����\?%^z�vP��Zc�c������:��fmgjl�$I�$I�$I��Si��w&�$�F�����L�:/�cj\���1�2.�S����k��`Dl���x����:�3}_>K�]����ej�������jG?7[mx
���������~���w�$I�$I�$ID�JC�����������J��}7���>5��uZ�1q�`&��\49������3'��w��x���>�-�ze���������8#�:9-�:@���'C�n����4�3�q��Y��J%I�$I�$I�`c�Tb^�g�sj<Y	r��T{���Xa������q�����:��$���K����Ow��c��]����7;����F+��l6����wL���)����V�M��2,�.����7?T�W�$I�$I�$I���������!������oL�Xj��8�}#��B�~�#��#TK������x���c�"m��B�������<mq��S������Sf�T��{G�jK��C�M��^�H�PKt-c��m��u���;��WLI�I�0�����X�k���8-N��j�������$I�$I�$I���XHC�7��1y����.}���1zD������
��71���u3������2,
�{��3��%X�w.7,V]�=F��cu�5��m~�8,��-W	��5�x��Xy�a��k�qu%H+I�$I�$I�4���Tb��kZ����i�]��K/�����@O��_���� �|�#�w�%`���]��U����o��n6����i�)�#�|�#�Tb��v���	�>�bGt�)]�a*I�$I�$I���������&����:���C�M����$I�$I�$i�0b!
1+,��m1"=�tph.X*I�$I�$I�4�0���Q�#�������*�4�sF?������y�$I�$I�$I�4�0���yG��j�i�V��c�����-�$I�$I�$IC�Si�2X)I�$I�$I��wL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I���e�T�$I�$I�$IR�2`*I�$I�$I�$�e0�$I�$I�$I����J�$I�$I�$IjYL%I�$I�$I�$�,��$I�$I�$I�Z�SI�$I�$I�$I-���$I�$I�$I��������w�1��'���?�&M���{.}��RK�|��K,�D�5*}&�����	������/=w���9���q7G��u�����`2l�h��h[x��7m3>�$I�$I�$��9`��_~�����[���n����/��S�N�q���i\p�(]`�b��W�
6� 6�p�Xt�E����z���N�/���1�����B�'�0`�>*�F/mm��~6b�r�/$I�$I�$Ij-���3z�^r�%q��W�#�<�=�X�������W^9������)�c���W\1�Zk��z��c��vJ=P
�J�3`:������=���;+�r�������5~^�@�$I�$I����������W\qE�w�yq�-���i�b����w��)�IoR��9rd�~��)��/��o��<�L��z��w��7�x��}��c�v����?M/�1L���N���?[y7D�X$�or{��e*H�$I�$I��:�
�2)���O>9����Xh��b���J���VZ)�Yf�4���#*���������^KASz��s�=q��7�����y�{������^���R��>���Pt�ta���1l�s�m�]*�$I�$I�$IjML�x��8��#R�t����M7�48{�3��<e^7�tS\��i��}�{1�|�U�������V���h������o�}�!�w�$I�$I�$�����{������/���^�
��|������t��vsh^�AL�iWw�_�������ot������5�����V�I�$I�$I��:��X�3&4��?���k��7O�f�4uN|df�=�6��[��)��/:�|��o-I�$I�$I��V�T�t���5�w�qG��?���S�V>���2$i����pt>�����4��0i���s���7�$I�$I�$������e��I���(���|�VX�����������	���O���c#��K5�|�3���3�}������W��q��Xn��h���2���t��wGl�F�JK���<�����N�8�����]������->�M[��>��K���.�������$I�$I�$I-����'���>��C�V�����=����)X����#O���1zd��Q���������o0	j����8��������S:��W�f� g���7lX�����5rD����O���V��sJ����7�$I�$I�$��>LBw�y�I��N�>���$��������IO��'G��������m�������=���=�|8��v���4i�������q�C�-����f�e��O�OW���
��
��{����}��K-��;��thk���f��$I�$I�$���9`:f���}��c��i����%�����(��4ttN���p��I��K�:��;:�p�[��-�.���zm��������*/��1rD[
^�s[�C[,Z'^��t%z�2�����Z���;���Vh��W*��W��Q�T�H�$I�$I��:�����'�e�]��_��{��5�\3VZi�Xj����w�E�=��3�N��;s�3L�?�dL{���7��|2xtv�i��#���ItL�������1����n��w�����1	&L�����c���������oN��~����Ov�G~��|�=6_�k����Et;]�z�3�yG�[{���[�Sm����������-+I�$I�$IR�0}�����_�z�p�
����g��7�|���v0�d�M��OL�SI�37L;'M�I��Sn�Wt��B����o��-��_1���K_s���E�����'~������ow�����c:��j���|{��h �/�i�#N��#��3��k�����}���}�����$I�$I�$�u�9`:n�����<�@���������o|#V%���0�t�91��?��v��1r��c���$���7:_�):�zt��%������s�t��N�L�7����U�(T����O����YG��M{|l��V���5��������$I�$I�$�u�9`:u��x��c��)�O3r��Xm��b���O$5kn	�v��z����c�SOT>���c�V�M��v�vCt>Ft>{rtvVR�e�����w>��n�
Wk��@�0��*�O��#�|eg�?�b�e+_T��y|��=��N�$I�$I��������\k��b�u�m��o�J���r�RL���������1f��L}:g X���;��;�c;��z����>��2�f���������z��X~����$I�$I�$)�}�K��~A���_=}�����;�������Z*}��s���1c����q�Aa���q�-�������vZ���{��7�x#�\r�5jTe��#�����8����oo���x��W�3]ylw�}�����K.I�����+=;v�EM��[5_
���Q�����.���E�+�O����r�u�wC���1f��)�����G����*�N_M��5g\���3���=���-F�r�������#���3v��-�[�����t�'OG��������O�6��w�/
m��m�_y'I�$I�$IR������y��'��/LA�W_}5����w��G�G�����w������o,�D��!���������q�W�#�<���O�v�������[�'>��4�p5~{�	'��_�~��K/� �J+�n�a|���N��
�2����W]uU<����k��B-������';������@�Wkn�w�E���8���[=D	g���rm�������D���/_��jSc���Kn���.��=��{n�c��?��������W~3=��G|�=�]��HG���$I�$I�$��~��I���[o��|�;����4���?��w�uW<��c1}�����k����>:N:����r�b���c�9&�
������Ew�q���|&��o��8��c��^��j�7�|3N>���d�����I��?H��s�9'~��_��O���V"����S�o|��=��3�<��?�!-�`g3j�RC::������h���������tN�4������q7u�1��I�J}nG�6�-�X�-�z�3|���+��������^tSg�|yG�9c�f��������7j+����AgI�$I�$I���~�����~�����b�-��O~�����;��?��;o����iHW���v[~�^��-�\eC�������7�������v���~��V[�Fm���^,���i8��n�)��}�;�Q�e����������GR�������k���>�z��������	�^~��q�QG��k���=��#6�l����W^9���������3bW_}�����|5{�!y;:b��w���O��q�*����(��&���R1������/��W�]:=�����:������������Y_+,�+-=���4$o�i�#������}���
�c�J�V�����3������/{���!y%I�$I�$I���Sn�K��|��W"�R~�@�t�H�7��Y��/�|l���1l��4�P1m���|�3�<3>������/�p>�C�S�!z/������v2d/�o�E�p�|p�|���K� ,��G���o��c��	��_�:���������m��f>#u��)=���s�M��m��&}�����f��0�x���p��1���)Lb�
+���w�Q�n#7�*Fn�y_y��|}\t�{��������;| F�w�Y��x���O���@b���1j�������]�x�����������b]���k}�m]��������@����l��e������kR��k3b����t��x��m���o��j{,�@��L��������-�������c���'b���b��m1�R�vt���������y{�X�SI�$I�$IR������&M����>�9���q����og5����;����J�}����C��)S��g�I�cy�hh��M����0�Y�s]y���.�z�2�m����4]k��R/�G}��M�e�|��)K�y����of�=��=�O����J=��>-&����z��RO��+��|�����c����UV��nc>�o�����VH�#:�C��<{�#7�r�tl2c�}HA����|��1�G?�w�5F�s�����������i~�~�s1�~���#�X��m��h�g�h�pz7������'wi��Zml�t���Vm�����Uo::�o�f[��a[�9�w+F�����k����$I�$I�$I�U�L�w�VHC��d��O=)���z\5���k���g?�Yl����OgE/Z�����<���'�H�V��L%-	L2m��Gy$�X]j��*�����2�����=;���������c���1���[l��|<&���1�����~�������M�H��x�z1j��v��ov}��;���x}|��r���fi:����1��{GL�������c������y�3�Kc��wF@v����}�]:��o$���&�����6b��'sZ�n��$I�$I�$�m�����$��z[(%���C
S�{��w��'A�k��6��sI�������<�Xb���!}	P����J����^�7�|3���gjFoW��k�	:P��z�������[y|�:P�����o�.��~kL���1����m�<1|�=LG��a�/�pL����t��fLw�51�?wvM7&F�{����X���9yRL8�w1��bJ����sgtNx#MSWWY6�����~�y��a����D���T����h���:�:��~Wjt����%I�$I�$Ij}�2����c�����������)��K�i�
�����Q��y�u��&�l�n�����	:@��P��9p�����1����j����y"��7zU�|�M������x������_L�q��	�YO������4#�[v���3��w�i�=���G�����#6�$��].�?�\�\w����/�|��j������N�3��3��3O���\��
�R�-�_�(nx��f��~Wj�f�f��$I�$I�$�u�9`:j���l��R���OL�����,,}����NH���x���o�&K�9�����������>V]u���&4x������������cRO�����K���O�55�'��*�1~|L��?���y��@��:%��:�����;�}�����]�k5:�/36Fn�M�X�1r����I��s@[j�4���x�x7�����������1���Hm�}3�$I�$I�$I��:G����}-.����b�-�3/�����������_/�������c��v��������_>}?7�Y�K�:����������C9$^����UW]�o�}����q������.Z�fV?������nq����|'}����.>��O��>�����^�w.A�/~��)(}�)�����_�����o-S���R������s�����U�S��8&��O���K�o�����1����Q[�7��rC�q�����+��O����Z7=�t�I'T�����c��}5:^|>^9d�X��#7�2�?�x�y����������1�G���c��N<�������K�������Qd���9l�5b�_�>�����e���W�
����+�$I�$I�$Ij�0�����n�-~����E]�������?�|�~��WNS���}��o}�[��F��v����g�qF��W�J=6?����G?����n�!=��7S�g�����������y��|��3�w;�|{�Wb�E�F�������c�k����>]���`92�������c��O����N�,E�S�[g��t�����~2c����c��~%F���r�u1��_�������WX)�������R�|(FN���n�xy�#b��T�I�$I�$I��:�%`�������������>���	���j��z��������������wCA@ziH�Y�����b�����_�2�[H��w�9���w�@��K�=��sN���o���K�\pA���nq���1�3���%����'���O��/�8-�'5�Z~��4���W/_������M�e���6��X��b�����KG��w���}�c�����_����G�:F�����;��}��1���|��C�V�t�{�O|.�=po����U>������e���>���w����i�U�
O��z�2j��;I�$I�$I�ZG�L3z>�����3��|f����c�e��VX!��o������G�c�=6?�>za�������V���#�<���o
�|\}��+����7���?<���?�y�����������y��?��f@��-�?�������^�=���B�ay������������'����]��Qem��m,���B!D�$�{H h�e�e��,���.�H .�������G[��:���{z|z��!��<�t�����]�u�=�AeFj*�S~����p�Z��c��	��n�K��H[0��j+��k*Mo�_�4�A��
B���]���}e^x1��D�O� ���2�������o�z�~r�Z����h�x�}������p&���J�������@{�������������u�4--
K�,Q�%��^gG�� ��������Kf�G������U�Tz�J��w��Y�����?���u���j,�HR��w��#G��1Q��m��K��;�Pi�%�*�i���0`�5k��2�ln�U�t~�~�j�P�||o�T��]�����1=�D�]C�H(��1��:���R!���;��o�J�y�)^���Z��/#�������*o��TZ_���8��K:��/������������^U�r�S�����4R�
,���
{��p4�����sDDDDDDDDDDD����c��US^���m���o����VJ��F��}����[�l���^s
�
�]��kW��r���*�m8v��*������c��T��.]�`�������2�����3g���C�hV=E�r��%��:����1J���e����JU�������W��I���*8��@�����QS��>X����N�[��~���-R������p�o�x��O��r��;A?en�h��.�[O������5ODDDDDDDDDDD�|L�Cjrr�J�+���g���2��������7c���8q��*�����;G���+���;vT���~^�]N��G�������zkJO[Y/�c�y������P����2e���D\\�;�f�����/To������_�#F�A���jxO_I,A�?�������\�����/�J����
����=pV���koB����Oq���~C�wlE����g��7Z���E�DM�����R��X��c�D`�nx��D�� ��;�����
|������������r5ODDDDDDDDDDD�|����%�'=D����5k�z-���j2������X�|�A��2��i9t�PX����]vY�i�[�h�|0}�V�a+�x_y���n��S��\�z5�l��A�����S�?�I��O>������}��];������e�p��Q<����J�.m�e���������z����
��\*z%9%o��I8��K�.���y.�g���|8���o�
���V���Q��X����3��[������9i�J����V����0N��o�����\)Gz���w���4���Ep������mZo/�0%/Q�W�1Lg���x;v����]ll�
���������MY�,_�\�����y!?��s*�Q�N�<��Q]W�X���V�PA�^z���[o��7���H�'N��?�������G�V�����{�x���Q����%���(H�T�J���H�9R'���k
�4������)Q�W�����)�]<xP�B���b������x<h����Y�uY����]��c����R��p���a�m��zpJ�M����������������Y���w���l��iS5e����c��yX�nZ�j�n�������[.�0����m3�G�zvvj��.<���)Q�W��i8��O��z������Dt~���iu���}+�'�B����������>�q�|�Y���E�kc��������������s�����9p�@5�4�g��g�W����U�G"��9]p5iw�����dF5��3n�Y���y"""""""""""*i��J�s���j�KT��2��_|���d{)]�J�X�DDDDDDDDDDD��u�4--
��MS����������?b����|�R"""""""""""""��/�c�J/R	����K�K��/��R����{����^gG�9r$.��2|��g(W���������ajK��=�{��+98�)Q����i ��	���o���3�u��S�*U��#�N�g��U=Q_{�5��O�����Q~1`Z�0%""""""""""*��0{������q��	���������Bll�z�M�P�N�p�
�_�����
�����)Q�W��i�W��Az��I<���j����/_^���Le���8{	�E�S""""""""""��/�������U�TA��5��aC<���j���,��F��Q�P��i8I�{��7�)<�t\MNNV��NDDDDDDDDDDDDDD�E�SI���@ �5k����?����7<������O������~���X�|9�~��7Q��:`t��	>�>�,�|�M|��*X:e�����������s�=�����qP���������������R�L1r�H�������k��kW:M�4���z���Us�������={��k���������������F�L�.]������X�"^z�%�����3���koa�uz�m���[n��9s0s�L�2%""""""""""""�"u�T�&�5k�=�xw�y'�7o�������t:��U+4���Sc�J�^"""""""""""""��u�4997nD�����W/��4'���A���?�DDDDDDDDDDDDDT�����~�9s*T@�2e������L)))�R"""""""""""""��/�����A�J�p��A:t�^��c���me�����������������D0���C��-�s�N|��w8}���&��g���o�U��>�/QQ�:`�r����
6���#����f�������������8��}����K��_={�T�����M�6x���T���?�K/��a��a��Mjz��������>PT�V�!"""""""""""""*J�0���7�p^~�e���[�n����w�^5I���U�Vx���q��7">>�����������������hh��~5���R��^����W��W���-��)�.%*��H�_�,��&�C�5R&}������JW�f(��H{�X����\��h�15��������������.�0
'��@ �^k�������
�E�S""""""""""���PR���1J�9��k��4�2m��'O��9��H��0�@�������TZ���#11Q�+W��V��6m��o��h����uJD�a����DDDDDDDDDDD%_��0�`��3������w���q��y�f��T�5k����?��o��a��a����mJDDDDDDDDDDDDDE�P�[�nU������k��x������o��7�PS�u���O?������o�>{o"""""""""""""��uJ�@ ��>�O=�n��<��c*�������x�^�Z�
o���
�~�������p�0�D��-ZL�Kyu���-�t:�C/�	b��W����L�ODDDDDDDDD���2N���C1o�<�1��w��d&�{e���z�z����$$$�k�(�0-Z�R^,����~�9��X���������s�]]��u�Ri�M�����������u�N�9z��q��_M�4��fMz�J�S����CHKK����H���s��}�_�0=�h�dR���6�jw���2�}�DDDDDDDDDD����z�r��8{�,��������|*�Z�\9�\.{)���l<��s�_�����I��,�9u�4..={���'T�]	�f���c��E��g.��R����k����xo���J�S��*9A^"""""""""�h�+`*����� )))}JMMU��=z`���>|8v���z����b�������p��W����fS""�C�q$��czp��N���2`JDDDDDDDDD��(hI���/���M��%![�l����Q�Z5t��I��v��:	��:u
��-������wo0d/S�(�~#�~U�||o�T��H��=�{��+9\M���G#�9K`igV�s%����p������r�;IH+�!A�J�Y/�=���A���5������������._�����������S�%��O�3+V��Q~1`Z�0����,��+���K�B�������ZL�������������������_�s�N{I���__���1P��`0-Z�RV:0����2��M�����
�8����9����m�8������"�k�'�hk@�����J�3C}~�6�%c������B�2�������x����u0%""""""""�C��DT�0`Z�0��$�xwR�n
�>�5�;���M���N������~��k�����:q�%n42�;�h@����58i`�</�lM?�?u*9p&��0�i���3��c�wn�7u�O}<�TJ��]<=6�^<j.��#�DDDDDDDDDtaE,���(j)i��S�@f�6.�u�=Z��b���E�\��um'��
���>|9�����G��'*=BE���
��
���������9>l�C�R)Cz���t6�"""""""""��DDD�HR���b��`�~#���f��m��^e�J��`k@��]h�?oK���������i�
b\P�K���a��4}�N������U�y�<����DDDDDDDDDDh�"�H����N[����^�����I�3��Y�z}��HJ3�k����"�,�m�������C�<���W�s�|B]W#H/���]�������1`JDDT�b4t��@��
^n=�c���{}�8����5p�qO��5_�s������*���\Z����tpys.n���%������S�����Z6^S�T(���Gbh�R"""""""""��DDD�Hz��n���.x��e�B!��V������
�r�[�����:~Z���Tk�MtL_���U~5����>�f�����u�m��K{D����Nt���v�}d��:�}�`"""""""""�?L���
Y�
����zr�U�*�����Tt�n%��j��
������^|����,������T�Uz�v��T����Z#�O��)k�9�z]�+�#�1%""""""""��DDD�@��J��3��B��~��Nn�(�a�z?��������v�_�Kz�E.���d8i�D�x���w�a]�V:��W�2�	���i�B�*N����m{i���0����1S"""""""""�0`JDDt�E"Tv�iuS
|���[���O�}8rFG�jN��k������W�9�H���4L��tm�D��
�����{yTz^�YLM���{xp��;�N&��5��y	�&&&b���8x� t�`����I*^��04��t�����p[�Ltk���]=���^`�^�u*i���
FcC�SY2���#:�<�
��T.�Z/����������%"""""""""�Z����b��E�9s&�i�G�.]��_~�?�<�{�9|������ZODDDP��JZ�r�n����-]����[��Q���C�:�TH��Lp��M�v.�0���"��E*�z�l�R�s��/u�a��g��J�>�����jI��c�\/V���Cz�V3��1S"""""""""�h��~]`)))���o0z�h�i����*bcc�g�<��3���oU@U��Y��?�����|��jL�7��W%�����I�P{��I�#��7�������4����v�qf�=Wr8�}G���9*,}��mGB��{�{pGW7~[���&��K-$����Kk8�b@�1���p"��/+|����z����P)u;�s�kn��(�!9��O+��e�
�8��u1(��������7+��Y�7�����K�6��x���%""""""""���[�3K��u+�U�8<@\#he�@�ol/�hJ�t��e<x0N�<����/x�����c���GA�F�0`���o�����w/���+\q�v	DT�-L)7}��m�C�����h^��]�t�4����P����������fO�a�f�*9��,�L�������1�jwgRT(��k#'b�V���8�_��
����Y37���w]����{������������89��O���a��2���&���J����C����WP4�N����1c�l����s���:��n���b��8s�n��V��T��C�"--
s������K!""���8������L�R!�Go���>LXhM�z��,<X*$�:e��0����%>���W�R!�R'����e>��7]D����KE�2��DDDDDDDDtA1��w����0���`���J�
��7�xa7E/�����]�j�����n�
��7��������z�jT�^��uS=N=�w���
b��
HNN�K!""����
�]0q��up� �c*��&""""""""*R���0N���J9^9n�^�S�%z��)��UKG��l����-Z�P�����K�\�r8{����JDDDY	��34����2����	��_a���Mr\����a��i�*Y�z��M�c������WR����4
x��w�����>�(���"66Vm�s�N��N�:����U���
�c�-�aJ�:<[���ry�#�a/s�a[	��?����<���m���)�a���E@�sA1"@3��u���Z�����W���o|����\���1���������JJ���z
?��#���R�:t?�0�N�������;�T�z�^�1BR%����o�T�DT0�-L)7�L�Nn����������G��pV�f�eM��$����	{I1��G��p4~�^@DDDDDDD4'�9c �p�9��P�������L�4��������Dv[�mo!�u��.E'����>~�x<��#�������Fk���q���^�zX�b�.]�/������G}��n��.��
�����)���0�mX��9:#�x&��-g�Z������!�$�m`��%#X��g���������������x�����y����:�a��n
U�j�������L�p�#��,$���e��pD0��a�0a��*UJ�O*�v�{�9�}��*���[o�`ijj*���~U�T�K ��`��h1`J��#L���"���]^��x��J=���qN���[���JG��������t���w/~_������4�\������91RSa$�����|h�,�_��89��g�c_g/,90-�06lPiyw��
����;����C�
���T�t�������1`�4h�����
�����)���0=������m�����������6�qp�=w>����?���p�(ychQ�������HN��4}w`�Y����f�jto$���Z�rp7mw�Np�)k-4��B�����|sA�Y^b*�n������V��:�7�z�����Y��AC���}�`�^k����w���a���t�}��2�`��}G�Z���5�7'������>���J�BUhS!�G�;�����+��i������J�����D
L����?J�TO<��7\�n Kw��(����E_{���E�,�(��{��~����8��OI�O+��\���}qhX5�lWH�4��O���N�.�\����"$��'h����E`�s0�~>����)�6C*Wl5T��o��~��)���g[����Nf����P����')�e���+x��n��e�F������'q1�����2p�,0��=�ip����<�6�Z3T`��(��'W�Z�P�z��R��m[�l���R""�F?~��K����IR��
#�\VX1�|�J�|���0�'�"""""""*�6���}����i/�(�G<;�f>���E����>X*�;�#��o�[��Z��);���O�;m��
|=K��3��/"���[��#��4�j4���SS�Y���}���hTC�m=x�V
������l20�w]��}W;T�C��c=��S�c3�+��5���K��a����)S����Sj���}����e���T��c������?JS��M8�� {�d���u�h��}�K�K�b�o�)�J{
=��*��o����T�j��7�r#m}#�����_Kk��o�.2o���b�Xq����Lh�Z[+��������D�����s��B��#O{C���t���d����Q"���<]��o}�O"�n0�������
L���4������U5<70���g��g?�\�� �
n:a���u\�B��>���7���C�z]����pG��{��@���tLz��v��?�V������)���T�������������e����e>�B^76|�����"sFW
��4��"o������e,L��NK
����[��{��������c�f+����;2�B����F���=���c�N#���0	��F2DDDDDDD��30w�?�`�(X4S�%�����9��F+>[���%.X*|��X/44W��S������p��T��r���r��i������:i*X*Vn5p��_5|3[��u|>IW��T��L�)6&��l��@�zv��0g����r�|�d��������Q�lY�i�]�tQ������y������.DT#�ZiJi�T�t����u����s%��b%�]s�=g1|n����J�Rhe:�sTX&���xb��Y����&�C�����"����s+������0�h4~	$mT�$e�G?*��������&�4to*�e�����Z[���e����<<t���j* ��B����l�!qy[k�A�kT��Lo�f����OZ*^�*c�2�7?����g��������=|5ODDDDDDD%��o`�<N$��%���9qYS�'8��x(&��l�Bs}vS�-�>��
m�8��������4dx���1������e���_��F�"u���\	��Y��4�g�������9+���M��e��C=�	�^��b����b�@��+$u����I*����gP�%x�a�>��hZGC�rY��i��4��0���y��Z�=�P��n���t���W���uY�7�J�p��!8�1J�U�����Gp	�Q�0%o�bJ^��!%�~�R�������%� y����Y������"�J)�����*I)�c����������x������Z��#<Z|C8/Z�+�y����H��=7��9����V��YA���������&)�����a���z�Q���k:����k;Q���7��6A��U3+U�h��������R.^�_�zpi��>���o���8�X�N�g�j�B�����L20n�Oy�J�PNa?�zn$��C��9����HA}�c]=C���(�/p�.�~���[4\�����������t���z�L����+Y��������qI#I�N����Rq����p��{�Nn��@�N���
��h?����W����L�����05�^�N��c��~����<_����U;8k�6o�7��r�Z��Q1���o��e�HNB���8 �ZB7�����~��Q�
�!u�Oj��;�P<"l���[���~#��"m�,�<���
$A����3LT����&�f3��o�7�d�&��T�K�5tok}��2oT�Wu�@
��� P�2����V�48Bw��y���������z:�E������GaD%U ���a��iV����l�(>T�4�&�Rm�U�Z���"""""��=c��oR��~^4��=�;Q:VCb��������M
LTq�j���*d��nt�������������vw�T,�3W�0�����{z�p������
�M5����cgecK�����8������q���sz�Tx�"��n���t{A������������G�9P���<���c>y"�\����]�^���Y~��	�)�xg�1���t����y$������\�A��M����3�|n
L�J0L�����0
9���?�>���n}�����q3+`Z�*R�����V�SW��H2�r�{Aj���fm�����P�Z��\z9J=��
�J��������
M�s��Z
�Z���Q�[���N}���������E���50�����`���k,�o|����m����	o=�@�R�v{����
e�/+��/?�47���������G�u�H������������*�vrT���#�9:�������%�������_�"�-���]�d�s��p�*�[�D?4�����J��^R�9�U�N�����2������Z�+���bs��!��3R����\1�.-��=Ct��1��>�E1|n�L���#�no�C�<�M*v�������q6�����}Z�TP3<`����ypk7o�����;�$��x��K0o��@��}2S�4L���6�j80f��W�����j�����F�����hd�D&��l��S�jp`�=��s��I���O��=4��Oz~ZG�_�;���M]j����1�������y��+�5��SC�2@R*��|��xu�C
1��7������u�
�S������)���L}[7���OB?zD-/������b������U�<nd�M�V��M��w���P�]}=�:#m�T�}�5{��Y�&J?�\-������g�F��~��_a�_i��p������2�+�Ej�'n���N�"N�10a��4�#cJ�����}c����(_��8���9I<�=��h��G���f�q�?���0��d�?���q���Z�7��J�;�KCbB
y3���	������T�`H��Q�<]/��y+{i�i�����Jg���x�D
��b�&���
f�-�<���^��
�����������F
����b�U�������5��v�] �B7�(���H;`V�b�x�o��z@��pT��^H�A��m*�����3���zs����;���0�T��]�:5|<��ikC�P��`/�l����~���Des���]�����J6�p[�J�e.OL5�v���B_�����/��
e���mXf�ej�<����[e���	I��l:���=��Q��Y�F ��A��/A�h�
�$�������1�+B)������������2Q������4	�J�Q�tL�e���:���,�����/~�c�a?�T����T���
<����/8��N���,1���w�S��z	�zC�}�5���:&�S�.���SE�S�0`JT�1`Z�0�������z�~�)�'��je����e.
����g�%�!y�H$}�s+Bg�:(����
n%�5��w�s�us(�A�
���aW����]0�������t�6���ac�^u
R��s�T��*a��a/�{�TR�|����k2�V	���9�����:����7�h]?�}��p����Y:>�������7�R?��R��i�?���C�������:f�F�i����Es�2�f�����������l8��<$`Z�h����E�K5��qv
����q|���s��`�����<U��Dl��0��U����K�/��Up4|Z�6��?:���C?4��o/�=����
g��U`����������z�O5�
�e�4�c���������x��6<en��.���gRt���^<{]L�S'u���N6�7�'����2������^�{��;.q��1���L�K�4��Ls����t�Fj��Th	��@�������gNY�F���G=grT�
�����Re��#��1H���Z&*MY`�W�;vA��������M�����l�~����u|���R>����N��U>*��)�?���L|��6
C�w�2��u��G����S
�.�0�R�a"""��i�q�b��9�&����4����HJ����sq78k���&�����Z�-Z#��U�>������
~vR�MB�h�8��	s�D�4�g��E�ft�Q�jp�����a<��px�P�9�����=�l��Ce�;�h��.5o��W�z*|�O��8��������=|:���-��Z���`��.[�����s!F�v�U�RK�����,z*�#��8����8��:�KB�T���|�]($K�~���,�B�a�Q�d|�(	b\��\���[������I�{i'�����8,�����w!!��1�m���}�B�.��l��u~���5'������=[���{�����O!��4��[��t�->^=W
��)
�%�)��"'��$Q����$=Qcz^���I�wG�&y���D��W����]j�op�ohKk�F����������r�
!��Mj8� #%�C�<
��4�_����S@���z$���\�RC���O6�t�����S��ogI�km-�d��S�#�����e�����j�@���FO3�s��MB��9���3����b������$)O�m��/������g$7����g��Vk@��7m�,g��k48��El��U����0���r&�\{w�s���V���P�����ox`Tl�g`�y�*�J��w�q����X�����P7��"��Y�;�����G*F�xW���78��I���#m�l���>P�/��8��=��?6��D�C��WD|������C>W����B�z�����K��B��9*�+:�����jyamQ}'Us`�I���3�.o�B��Nl:�c���{�fEp�C��-�a��f��c��|�@�:����#g���/Z��@�������d��/����^h�'���w�bx��0�3�I����dP��t��7i3���$����([����v��m;�U��"�������i�))*-��Zu{k��
0
Q
���)��v��z�4��&�R|���7���a����>�v
YWnFN5p�����C�w`�Q���c�W:>����C����Uz63��,=K�NT0�Q�dL��koDL�K�%�'���5A`�x�,��Z����cgvnG�o��K�������P-�T��Q-C�e�^�c�����E%H��
������f#1����nYnv��v�:W6��x,	��o��/�"�S'��S����i��Km�]	�D(5R���;k��\�Tt�?����?y���|}�Dn�q�8�1����������*��0?W�����b��8�u���7%#&I�[*�������O����n�����E4��@��.������C��Hj_I�$�d/P6(m��k�����~��d����wyn/<]2g&K��;�G|
��yj^��G�������f���=�[���������>i/����3��D��m���v�/{��0�JJe������O�;pqM�W*��|�u����Le��j(/��M�����x�Z:5����������q��$��?1����W�e�B�L����s5"�6�l�W���;�^�������4�����K3�����}�5����?�����y��*5��{u��W���|5����V��9kL�i�F���Ve���l��SC�U������
��d~Ybc��J���F�>
���e|�"�f�����g
���>kv��Bzq��LztK������d}d���T`�F��p�Y��F{������3YlS�~A��O�_��b�����)���y��P����)]��%����L0�'��K��N4���Q�{�����H����*@'=B�����r��N
���pC'���)�p�T����
�	3�Y�)��%�L�2����d�5���#;3��a���X=����#u�/�����j�%��j�H��o����Xe���@��H�>E�������]
�a�
�BX��@��������\)
��8��������sQSM?������;P�R�}d|S)�|���8����!W;��]V�T��c�
�gw��_S44�d�.�@ �~���o���Q�F
{
�k��(�������I�P{
1��7�������4����v)���9�}G���9*,C��`�!ukY�<�����C7��-�p��A������#��~H?I_��\"�o
c.��R�=�nd���,�v�k������7��d!����6	�<�����vN?�'{���I�m2�����4���K�W��
��Y$
���(�v���h�z����������!����R�����zZ5�n�?�Y��>��C�U������q������O��T�����)��5�|z��L��EY��O����z�[�����9�AL�?�\G]����d����������$��[c�,�l��}_�!.�z3��g����G�:9g���;��;���S|��@��-.o��o���E�#��{
�6[�=q�<or�q��?�V����{Pa�sb����S3���JYVu�b��+�~���.c1�(~��5O,�u�����9��g1R����1����K
C�>D������7y�K2��vsJ1����
f�lP���s��/��g��}��h/�Q*���uT��tn8��zz"�x�Q��kh�Q��X�������}��mGB������������/����������������Dg����d[��}=hQ3s/��5��4�?�c�1/g7�
;�n����=����?�a���!��;�c��?���Z�cKy�C�x�����c�#m�\�.(��F"��'��K=��w��������^�5�����([����(_QR���\�d^{:tF�����������Z�Sy�|�I�4����W��g�m��d���>7*QL��=��C�b��
?~<�4ib�!�s�����)���
���D��U�e�m<�z"u�OH����f�i�e�����[�����rg���
G!m�$����w�R�.;�Le|���Y�s�j-(cQ�0O��j�%`���t)�w��v�}��t�t)�4� ]H�Fz�
�TC���v~Y������%r|� L����t����U��rU�������������j�G~f�-�
����������<��"m�5����_���-����g�c�b�j���j�j$'�:�[�F����/\�������B*+�@�Y�}+�"p���P��_���)���A���Y���w���u56�����hY_��CCSy�#�U�"I����t�v��+���qb�<h�V�RW%�Q��D����gZ���d`�`���
)���<��}�+v���y������&���TkP��-\�P/�TX�KTj���mV�T}/R�e�(O�N����
���������g��6I/�}�$�pqs���{��{�R�7g�3v4��};Y��z�q��E
�?
T4?::7�T+���;?>����	����p������m���kkL�
��N]�����<��s�8(���7��:U��?���xv�$���:r��J�������C
�����9�����[/���h^���k���l���bn��\�]���6X��������e�}w�����-�V�"{�
��M~��PA��I��������o^G�4t�OW���J�<��`v"!�M�����k���ac���s�[ti�0wkl��_�F��Q����K[����S0�����|ntn�%`���?0�y�s�� ����)iX�%c�5��i����%~,7�������������h�\�u}�_��tb���!��1�M���f�7������)I���]q�������sp�������4������z����<q�GI�2#O�K���bc�(W����i����h��$��]n���Y�p�#p6j��O%���iss�Ys����qa�������D�����>7*QLO�<�{��g����1c����<b��h1`J��������3�����7^��+����SW��5D�B	��'�Y�:��g�:���?#��o���B7���nz������+*���+��9U����,/�����ArmjZ��N���g�`]��i_���������L<*�S'Uu �m��O%X�7����l��8�������JY�vo���c��E�_���k�����))H���H����9����y+�����J}�6{:������P����6�ip������~��I? �����mR/O��N8���o�z$��������_}!���n�[��������b�����!��1��T�������
��/�`?��c���7?":4�Tz�c��w�:�!�PfL��7�C��?Y��70�,�fE�E=
|��nU-OSi��m��:�L2��p�����9^|���$�|q���/��z���O��W��o��H���J!����uVg�#�~0�l�>�}-����Px�k��7=���i^������e�/'��1�����"e����+/2?��������m��Mywi�����!����p�4+�#,
y����4�*]y1$�g���tv$�_��U��7n���;k��X����q\R�[)��~,�d`�:+����G�q���B��2\DV��Q�r��O[P���#|������FRO%����{�:T6�yve4�X�f�*~������K�~x�m�����48*�����H���~JS����������1��Q���D��A��3O�����0o��U����q������f
����&d�w�n~DI���5'���T�T���0A����I���n5#QC���r��:����`fi� �]������|���F�F�S�g���k;��j����^�I	���oi��q���S���`��t��������'��sC'���������%=S���w���|����h��s���7�:3���������<#8*U��a�}�Q�<���UN���P�4M/7�_�|7��c�j��]�I#>E����a
n���Q0`.�u��d�� �+���
G����T����0a�����{����O�7�DTx0-Z�Rn.����}q� m�<�y�E����s���f7��w��|�7�`L`�^8�K�%��"m�T{��{�?`z�S�dYL����o���0�y1j�O!b�Z���vu�h\���t��Y�02���>�����e5$������r����;qw7jW��/�fU�wkX�3�1���wB��"�y e�z�[�/w�Rv���D��0c��V�i����{Tk�3��C����@l�+��.#)I@S�N�P7�-ZC3�dFr������"ph?���,���(���p�j������1Rgc�]��m�o��l6���O>��W��J�>FZ�zhw���1K��O��U~e_|1�{@��/�;_1+i��%&(c�������:��[�T�����Wi���C�/?i���T���6s���6�	q���*�G?`��|��R�ko������.u�/8�O�/A$�Y����S�����yS ��s�}-�cy�.���i@�����$8�8|6���=i���:P5��1���'3V��
4�e����>7�}�
W_������,�GG�`���u����O]���"A���j�5y
��[l�\����ekx.�\�F�f�kn���I�Kf�O��!�:��`�*_��Tc�k��$�GZ$�����q����7;�-���u��gO��D�FP��pc~7������"�������0��7u7�{{MM�����������;��b���f��H�er^��(F���gE�)�1�o�2�W���y���+�U����:z�Y�����a%"��.��NW
�x�6f�r/�0po?��`e.��
��d������;����f�����%2`���-k9T#��[�V�a6��(=A���d��^�MPX�>��\����t[;��e�nM����
���4*���N+�����+��k���x�8���V�����L&bz��o~�\���=�R�{�_���k�G��*�ov$kJ��U�}���H�0Rg8��*�<Z\z��l������������k�A�-�����������c����3�i�����g��`Q�B��P)w=�.���
��yv���2�_��d���G���J��]8��!�
O�.H��^�0$�/<���Bd�<�����:���Y>E�0���������/������YAC���/�J6���]j;ia��2F�����^�dT*���Nn4��a��F��b�$���M$�j��K#'�j�B��0���}go��^�7vvg�I���n��P��E�FL�%|kV���`[��6��T�dr�*��J�SZ�:�7���������8����R��C*����yk�0(�������y\���Y�V��������q�+��!��,=��+�V�3[O-�<e�/�9|�����������T�����<H�oyB�C��T4�API�
������0R�����J�D>C�)^���U}�g�`s�$�Mz�Ho���zE
��hTh�����CF��r�����v�k����R����8q�JuE
��Y)>�_l]��4?��N��~E�E�o%-X*@GH�a"�G}��Y���q�[7��<.9>9N9�t�YG��=�4��pgo�p��.�J*��:*��3�j������35�
|vi��_����7\&���^i�����b+i|%��Mf��}��K�k��_��P�ta����dw�g����X��y�T��T�e����HQO[6�{_�1y��0R��$�XG���d]G%C��}@�N�j(��6@5���&6�i��k/q��y{-
�$��%��H�^�y��a�������+�;��=�]�KE�637�1f�/=X*5��-9��~^����>,��:��r��h�05��w�bF��������!X*�gH�^02f�d'�O�T�#�\�	w��E�K,��W~q��y�$C�u����b�6��2X$�6�������M>���`�����I�&���^��/���^z)�i��Qj"""*y���B����c�0���N�Y��(��)y��%eI�VJk���H2��M�.�(��O��ous;�<p^R1TxCK��
�����
�N[�Gr��D�
�
h��q����/�3���lG =
���kV��������nn3k��PAQ	�Z2�]:Q*VSi����!�LIRkJ���>H�O5�uy�%���J�I���|?Q���+i� �s�������
�X���c�"Izm��Y`�/��CG�O���Y2j�q���T��AW��C���V�#�u�
��W�y^��������z%V�?�#g�.~n�����A���W�h
�7�b�y�p�X�&��G�j"��|�C��]���+	��Xi������Lz�6����D�#F�|:a/����ws�qP�����p�>=S#	��
�;y��Q�	��������NO_"ix�TR�r�r�r�Bs&��4T�A��Z)�%�n���
��&=�[����v�^�;���`oPQ�����58f�d��c
�]��B^Ic�L��ITx�:�-y�sj��?�M�������	�8�M+�����M�?;=La�Q	��^e��Y�!�I����Pi����\����hv�K�6w��p����g���K��?7Y�m����>���Y����2�I�.1=���|�7m�O����{���e�v�W]�zm��w���1�4�j��A�#�W5/�Qb���^W��gU�2�� �'	�
9$5�L���t!�:`*)y��L�:III����i�0z�h�n�3g��l>�����X��w�.����_�����Jp%���H�a��Mj1��xF9������'�K����)c�D��)�� ������\��"�/���H�<|����g�y�^:��1�����^LX���z�1M�I��:8xJG�
�y���{p]G�����8/2��<�	'JZ	KPV�&��kH���'��~�e�'kd|��Gt��;���{��4C���i�)=}������e�����z�J�3�E�Q�4��eD����T2&iL,�����!���H�n���u�����\�������H�9KC�v�J��>�?B��1w���?��NCV�$T���R��s�W*`�G�Z����$�B�����D�o�ty����:��Z��O�5?���NO�,����P*8l�������e��Z�C�o��w�:�N���G����B
L�p�g�u-/��y��.[Tb��Ar�r����Y1/5/��M�dV(H�c�+��/�z�	�Tz�J�'��K��iC�����t��P��,���}�
�HO���{2�2@����6�������������0O�&m��1�:�e8f��%�������AH���J���{`��x���>1��yA3�P��.�������/C1�}kd}�LxY��(��d"��I�Y��Z
��5�w?��;����2���I*"3�94Fl�+��U��R���}���+��m�\O�a/���QB||<���n6,_��#�Q�W�7�Y	���{��eGRN���D��,��B�X�E
?����<��\����:qi'��ua`77n��1�g��qK�!�<)���i5�
oz`9�b=�*Z#��~���ul������Y[�8�������j�PVONd�������a�����N��.Y����.�\��-��=�7�#��/?/4pi++�l��t�	+w]�@9��?�C��x�������lq�q��;E���a��t�g\g�gI[���]b/����U���z*)k�5��a�l!E2�bn��00l���1������.-"~C�K�
��$#c�@%�w./�������s�P���5�4}�]�q�J�Q}0�n��@�Q���U�C�/�
����������YG���
w��5^���W�I42�ix�H�T�_QaH���%���J��\h��m����_e�>?�8M�D��y�<����^s�u��U;�Jz]i� ��{�1dw-��h�y"�P���mVu7�e����-��2 yW.�����E2%Hf"��������M?���P����LG��UZz6F?t@m'��Tf�Vf2��	���5���)�~P�EN��lHp8�������qqq�������/�k�}d_"""*�2�<�����0R����v�
F�����M��(���X������~�_�3:v��^=��pqC'����l�W,�esTz���X�Pg� d�����J!Y���eK�$�U�: C���<���V���6���������������u����E�!�
�������������`��h��b�&��A���.�J&�TRR��L�5�N%
}Z��X���^Y]Z�v�������w]�FC�>��2OwO����~�"����7��Y�wk��1��DkX�U�������A���sQ�� �������Wvl����c0?�����k��{�����r�d��8k�B\��0��m���U�3y��;�����V�5�S���Py�xr���������I�5?���Y�s2�������E���m���}��r�����>���}�����!�KY���^���qN\�!����GH���v`)��;�'~�
���q���L{8����������2C��O���.	��uz�1GN��~+[F�~F{�G��dh�1G��XG���"�>X�e��u5;5�k���w]����=��i�����+�:����}�?�48^W��#\��!t�9���
�ew�p0�JX�w��>J�����AC��~"�M����G��zd�/s��p�y�����p.��|	���j>��Tf��������L,�z��`Y�m[���w�����P�R��V�����O�t+[���<~��}6Sxf3W�:��q�>�����_Sr��_��g��������e��WZ�K~n��u>�������<Pm\Mn���7
?�b���5�f������SV�T�]I/�����*���B����7w�qO�!m�Xk�T	�fe�n]�����������7u��e-�:|�9��r�qW�� $0��r���#m�<a��X�Y������
�zr��0kj��koFL���?�_}i��l8I������Z����
�����[�}_*\r�m=���S}�)g�"\�@���<���n��F�rf���3��W�r��nn����+[;��ah�`�_�/i�y���S��n�� -�|I�-�-n�����3N���XBH@z�ii����+d�_�)��{/���������:��������w� ��qn��[�Z����e5l�%�e9�^w3�nW��j[#��)���o��w��Rr�}��W�{�Mp�	��4��4Mhi��M��s�.�B�"���.��!�n�^���9pO_
K6���PA� #���{WH�������6fx����n��:f]�V��Y�����K�i���fUG{4w��K����+�O�\������:����fzZ|����/m�������
E����������7�_��J���Piv/
K�-�uX��t�:*�����)2����5<o�S�w���n%�����i�0c�������W�.�I���f�Kv�Icz�.s���;�U�A��	���#�:*���]���5�gq�d�r�~WN�gB��a��<Y��\�d�]���6�"�o��9���I�����f���~:���,6�mGNBL��\vuTH���2V)QQ;��!�{�:�c����m��oH���3��������������.X�0MJJ������{����_V��Q�����z����/�����<�P�F{k�GT,����������>r�H���������k���O���w\G�FN�{�H�V�PZ��?�u�E����%��qHoi���I�V�����b��������p�m���.�o/���O����Ch�j�2��z��m�E�\2���W#����8�����[�y���e����o����T��0O2�a�o��/:����oD�������s�����[Lz�5��@i�o,=��"=��G���������|���G�6���KJ��I�K4T=]�7���$�w�8t��s�����><:w����[���|a-�:!�Jc��Wc�j2DMx7.���$����"�W���n�9�~�����9H�Y�)m�Ls�W�;��������t����f������d��	��_��W^W�������O��
N~���fW(
$&H��l�iV
����T����7�w�@��nU
�jj���
k�-7��E�=j��h�0��1��t]G7������*�g��� ����!�I]���2�x�~s��j��H�����y>�5�
��2|�~�u��mF���Y�n�.��� �Xrz����m���q�.2p�%�T������2f;9���q)=D+��wO����%=����h�$�D�*�W�pYk
7v�0i�n~.���;b}`P����>���6�l�R���N�l<VG���[\�^_l�������>�2�������������V��uT��}W���Zz7����������7���A�O���x�����SO�����68����f�6�irM�,
�Y��0�v�
����N#��;�u:���r,3�s����>����{T�{Oz�}����b%k6J����I
tm	4�<p���_��X�E�-$�������y�M��P$D��,V���xfv!����T��I��!
*�����{��'�`��ax��W������/�������k^�������S�'M���G���S
��*2��<E,����y^LX����~�Pi����FR�3�&�Y�S�����9���y�gR������IDAT� Nx�5��E�1H+S1�^�=�._��{�E��1��Y�\��K���v��T������`i�+w�M*�������m����v%�����O�!��V��,c
����9�-�>����]�%TTd�����$=�o�����N��?S�8
��s�l��Yw$3m���Tc!������$�#)A��1����1�4�����R?�'�1��T	1f%�������4��[�<n|kV�@M����1=�/A`�v�L��k������WHzk�W��|88J%��y|�$"�fg��*���)c=�~2���([�����9m#�6�E����:U����}F�[��������a1a���
���c�J#��R���L���������4�	*�a�y�����T	��gYG�z^G���tG�:������4"
�D�QkUp ���0�i�/C������A%
�y���U�|)�UZ�knP
2	�m�,j<�^}�`P� O�4{��T�G�0��e^�g �3Q������$��k���3W�k�vgl�p��7���@�*��"0
;/�.�]c`�4��p*]vVu2�e�o���Ar��~DW
dx�P��_����M]hY�����{��Yw��uP���g��2I�5��0�d�@0H�s_����e4�9v���������'�H1O"����u� �����f��2�an+����i���+�VCQ8*�'�b�������[u����P��.�V:��>k��/�4�	w
A�57���'\
���M�R
*�>��f���@�N��f��5��HU���?H��n��y�����7��"*��}�l�|���]�
%`z��)>�����9�;��O<�5
=\q�\h��
�o�������s��������x�s\��3�������P5���������Bz[��%��m�O��X���f`�n���6����|�a�\%p�3��Q��C��_�+�@T�C����Ep7i��a4�������U�$���V���W!��+ �D��WA?~�������7�S"�[$�>��e���]}�����N]U�V�6���
��Y�6�_�q�� �n����uT*���E������/�U+������ B�*�C�j����3���M�i�Q@�W���^�T�����M�;U�2!F��]<����i����^���r���F3�������g�q�e�u��5u���A	M����Z������j@��z�ff�����A��E��<�`I�]CT��6YQ�w����w���`m�s]�UM�����KL���������=�<�5{��C��z�Ko���5��n`�:�X�����
�6�w���v���P/p�Mz�L�i���;�q�������m��1�bWE�EK��(�����dY�4(�:j�I�[����?������VG#�M9.����Tz�I�RW�w���p�$�����j9�����`�/w�.Vt��t?b�l�d��c�%��\�����w���<��z�����6$�G����wQ�U�%�#����_-e�m�B��v\�,�1�6�p���^���:�f������z����g����M,����t�t]�(��G�U3���)��,]�#�[�a�~����5ToV����O�<�j���_I�n�/�qOP�7.�:�wB7�x�P��fV�2�h�u.R�*���TQ24<����i���6�l,�N��k�cg�<�T���w7l��;UO�����V�y��d,�c����C��^��~A���H��jN�q�od��qH��k�:��X"��;h��k�y�����u�U���*�'�6�u>K��)K
�~mf.S9t3�y��_�������������NC��k�{����`.�����\��QV���(��.\9��������_�I�&x����K/�o�6lhoa^wbcU ��[o���K1c��~4�"JDDDDTD~�Z����'4������*�ru;7:�w�l��%�C���M�����.��M'���1cC����m]*���V�v\Tun�D�.����;�ZO��W��c����9*��{/ ��z�#��"gN�^m�m�UO��A���Y��+� u��j;�
�Fl����������N}���0��������C=p��D�� �������/��z\%qo���3����l#eI�������������jW��`*��sx�G&��FU��]��=K��u�t$����IuJ�j*�yE+'��u�����	���K�+�Z���<�m_��z�M_��4���B)�<�b�W�e_�����z<�2.o�I�	8���nw4�����=�s��1���?��w��V��[�rP3�=��[f����J��u�����.����?���$H�j�H���%�
E� �^�	��y�e�_���:^���u��qH?���n�^���F��w����:��lo����x����JSi�%`��f���MR�7��H�{J=|:s�	��:^�4R���?``�������T��z�K����u�WK'n������>R�4���}�Uk!�5a��Mzb���9�����m�Ee_��UAU������^�3�M��V"~$�@I�9v���@��O��F���KJ� �lt��eW	h�:\uQ���B2lH�����F�H�kx���
�Az�������V�T�I�{��m0���V����<��P�����P��N�Y���6	��Mt��/5kWb�\w%�����}=z��G�lK�.B�������f��
����W�C�xK��k��JdI��}�ke��5S�o�T:y�T�i��Z*=������Q�Nd��y�����'���Y�d!��'�F��i�.]���sl��[�Ic�#����6of��l��|���P���u�P��	
��l�H�-�k���P�S��o��P+I=��P����A28D\DDD��c�T�3g�Djj*y�\���Z���QN3?�����;��C�_�l����������|PW��9���V.�g��n84SV��<��%M�������TK}I�;~���z��k����z��N���<@����P��.R6��R_�@��K`��j�F}��Y����\���N��^��w�"�M��QH�=�3�!y�W����F��o�Z��>e�0��l�y3�1�k���;3��d���C(-���y��0Y|p�)��r+��S���t��M��B���!n����!���dL5��v��-3~?
���5�9��@@�0������5.xG������3��4�KN�[$�_sUPG�v���S���1{��@)������:7�3����J�UY�z
��C�4�=��jL�����q���N��Uc�XR������������<����l#z����z�H��M5��&�������.������[*����9��p��5��F���/(Z�[������A^��v��D���ph���:*'AI9*)��7��V�i�YI���4R
�4�RA����$
�4�I��k\���J��~�A��� K���C��(�3N��_4��&eH�-
�S��4�v0);R7��J]�JE�n�z����[��������X���s�����������F���3vQR����pG/��G���-��}�]���^'H��H7L&�m_a���m��/s'i�e����N�.Y�9/V��������j�Hr
���^s7����(��Ph?	�Jos3\����'��Z)�&Z�2����i^�~��z�+�}B��n�.��b^G�5Uzf�uNz����������N=��A��	v#��7�U;�]��z:vV�����*��a�/
��YW��������4,���C�p!���+�}�#��I=����\��_�QO����S�Zr��BDt!��z\JJ�J�+�I�v�j~?����n��j��G�rS""""*Z�g�8x�
�Jj�����Wx%��<���FG���H����d��y�e�_�3����
'�F�.��^9A����37��x��^?��e([D<�`m�[��c���p�����C����<�K��4�������QH�������Z{-�kyX���w�-�S~�&}����o����*cNi�I�?`��?���	n���D�>9�!(
�J�Gs'.��7K$�U&uc�a]�I	��:?�o���
�������,���Nx����f���1��z1~�Odd�E��)Cw�
 |fy�O[u�Q�:�n��
�|n����T5����4��cE�����FM5f�%t>J`�������!����T�q�d<7�U��P�|s���)�C�����.���S������h�zXq���*���Y�}B��C�.�Z�����o�;��m\{��*���0(��d��r�K����O
��$��4Br9
��>8�iv��.J�)�uv�z?&,��@��T��.�|	'�����y��H�v��e7���t��z�� K���G���{�Mjyp[��a���wB�dY��^���R����������<�y�6���cJ�|���DH��:���I~t	`������ZV����7u��k�j�gx��� j���:R��ix�F�~��
�dj3��[��������h�����������{��f��z:����N2TF��=�C.k�B
���qN3����#=�%�Jb��_Vf�����.������D2 i$��F�Yr ck�����1���sYO���{w��p��2"���Zl,��*#�����1}�Uc��x[�x�����������5�����#bz�Q�!�X$��JC� ��!�g�I��{���
�/R�G4$}ZZ�J���)�T���� 0mo]3%�����3�]X2_��I7?�%h��������a�IP�/����
�������QBO	�2�C��g�,8>�H�W�B���gz��`k@���&���1-��$`��{B�������]h��[�p�vg-eWX��*���<@�<Y��+tO�2�n}��s+���vi�U!�_W�GJ���t��#.r�LI�Y��C�[�bg�=@�3@R�������'t���'Xg���M#N���P���L��HME��~{���&��������N��������]^{�H�p��S'{��*�8z�<���zV�
�S!;Rr���j��{?���d\���Om][R�:q�L�"��x�;ad�q�ICr�H���cz��0�����H`�n�:;4��%����aU�T���sY/��`�gz���<�^�n=H���9b��7����K�4��UfIV����jx$c-��j/��Q=���l�������8�9sN���{M�x�\���9$�*e�_G�>Jf� y}��S�n���0
��V6��q�\&m�"e��
�� 
 �����_�%��a��Y����5��{� g������35�i���I��������S�����$�����&��}����K�O;��c���� c��w�P�%��o�u�q���~��������q|�`%"�$�Oh�����+c�����g��4{T��>�/QQ�x������~@��s����j���.��W�2u1��[���K���~� ��9v2%��GB�J�2s���}��78��.��s-�O]QzH��1�\��o���e6-�1���;j=Xu������I��n��f��=�z������C��~�A��Q=���g�^��u��(W����[jVz���1Y
�%D���_]8��������Wz�I/�U��aC&��h�B�6.T��a�U�i>s��������|�z���Y��A!�44���cV��Vzm	�Jzmg��v���������]����]��^c��+�S�4�_B�����	��fy9*"���^>��%u��C�
��fE����H��X�-x��z�6uj�
�y�'A�;��n5����e��dI�g��C==�t��k7�</T��~��n����3C��M�?[�w���v��G��f��2{����f��x��w��S��H�����I��%m����E7�I�{����j�5.�z�S���y�&R���"�?���qqq����
�N�0���7oF��p�4����]���}{�/Q�R(�	�*$����6'-��*�d��� ��<�;J��� ������HKT4��@����&c�u��D�j��l��l�F��o�RcKJ� I�[��i~G�X�2~\A@��A�s��������^��5k�HK3�[)��u0�W_8��S�"f�y���+�V��8���t	�z��?�s���
[��h��5��T=L�7��yj���:dl�����d�� �U*�IF����[N����qW_�Rxf'�<�K�E���^{�/j�`zmg�Z����*/���������:��7������(���r��3�i��%���>�d�:#�
��R
I��)�����x��&N5����}����Dz�K��}�v�;�[S��dyp}�FN��)��r�F�%u�8}����6�:�(W�J�-t��������2^�D��Rds.KY�q�����U�����������iq�:JD�I�SI���W/�i�FC�z�-|��w��aRSS�$=O�������G�F��m��g�\�;%"""":�.���]�?�_��P�	;�$���C:���p[7�7s��Vn�C-�k�an�<����1n
k�T�4�E��*8�����@�����u���.����N�����s�Q#=���*����<�������Z����{-b�Yi<e�4��j�� 	�HS�-m�{i�������20=��~p?�e���pjl�K/G�U��r�����m,c���\�����_�
XGE�N�/��t��f�]�^G��Z'�:��|�C����c����z�I��e;B�T3�rp�M	::���y�� �)����e�^;�K����7��� ��Q��^a��H/���K�c]��fT�E���H=t���CV=��b�
fJ]
3��+
��*C�Yb����wu��v.�ku�� c����q���B����vo���V� ���j�;�a����G���h�����
k������_��mt��k��n�j��A���>��i��������E�~_FDD%W�S��iS<��c�^�:>��36���?�}�v5���_~~�!*T����z
��7��&""""*F
�9A.�����I��e�	�����R������Q���Y��������'�t�
��=������2$
o�/+�q�[��2����`����~�O��qCV�;wR�MRp���_�w{��*�����c����G���g����H�CR�p�oW��ji�o���x�N�\L� ��#��z_���j;��\�,��I�����n�:j�k�+;���i>
�����"�::s����Q��C�-�qM;�����t X�
�����v^�,����J@%������Q�UJ��������8y�H���e�	�����I�)��:d^/�I�\�C��:��������(��Sb4������E-'�����-��J2��-���q:e�i,����G����2A�1S��{�jd���
���@������3��I����q�X�������Ed!�c+��'�([64��I19*TR=O%c�����""*
%`*c�^s�5x��q�]w��7.\�}���i���8q�������^m��K������(?~Z��7K|8t*�T`e�</�^�S����=��o{���B�����q�(-�)=a|*��v��z�H�Y���/�����-��t�8��d��1���8z�q�H��3��f"���H�y��I`�f�L���gN�e��y(,�R�����j�o�F5�b�wm2�f�@i���H�v�ya��c���a�V?F�ug���u+�:����t�)��Z�s����^Ge���f���R�|��J]�^l�����f����y	�H=�1�����g�����:ZlR~������&�w����(��nJ��I���EV���CRO'��U�}+"z���#�D���\���?�������^��"�1rn����I��W���o�2��l��ju���(��^*�B�e=�J��w�b��w��������q7��2:��O�N*���I
���� ��Uj^��w�"U�%-�Uv/�������7���V�-�.8$[������ EI�t�����{7�?���-[���Si{����*"*��H�_�,��&�C�5R&}������JW�f(��H{�X����i�JG����y�=G�e��l9���nq�x?�����/�'d��,�_b�����B���=WrH��zJ����^�c����)�4��+:��J����4H�����F+��N��7*<R?���H����yj^6�b�<�o3���k�=g/��z7�[7��r)0����"�E�4��R�=���7�s���}����D��%�����rP��/S��l����Q������	�$��H��{p��e�>L�&=1��o�n���|��U�����o\�Ti��y��X$��}����Ri'����H�8
Fb"\m�#�O�^��?����z['���2��w�=��q���6�7UF�@�m[���Z�2���+8���W����Kfo6�����
W���
����e�}pa.���?��s�
_LP=����|+��K-�.�"��{��U�����hq��.���c0[C�U� ��;��uP���@��{8��q0N�B��C�u���|	�<����U�!�ow�.*-�4��z��
I��2�g��N+W���>�������Q��s#
uS	���VnrA�]�6�G}T�������
7���
2XJDDDDDD�G������������m~W.����������9M����QA��o���|������o��|3��#���j�6[�ZkN'R���
���J����a���K�=�
������N�^s������������r�Q���4�|���=p5l���1Se�T�����eY����D�G�����zz�����H������!m��Y!���v��*-m�4$�2�3��w�l�N�E��j�-�R�]�)c�B����������	��<V�5L��AL�����R�(U
�'��#"��.��iJJ
������c��uHLL���C9<{��`5/i��&��2=���q�\��^�E�Y�K���
�*��}�������s0�'&y�_0���L����N� ���� ��� �7��AUz��' y�p�M�Em'�'���3�6B��2F��5�[�\gR&J�g6��f���~���6�_	����s$�7�M����:���K���T���K"y�$������!��o����^+�#���6w�
�&���Y_?G���T�
�r�F}���&���q�wlUu<i�Y���sUR��*�6�QLSSS��7������
�+������
��-����UT""""""�s���C�VN��s��f]~v������c�La�P����0��@�d2�-�b���$���w*X�*��B���j�<&I,�V�*+��P���&�����Em��'�Q��#�y�K��G��]�A>����d�#�g���Q?z'"��(�O���8�y��������3O����a��8z�(t����&"""""���\>o���w����eV���sw�DyS����z���.���V�g����������|��9m���>����]��,1}����9�����OHDDE�P�w�q�
�J���_�������K�����o��<���0s�L����@�.�����������EJ2Nr����8I�}mY�/7o���Cs��9"�]a1�)�0������B��i��+�N�:��{��<����P�V-�^������W_}c��U��Q~h�\.�5���A����
0_2�IDta:'����i�&Mp�M7��'���!C��{w�|���*M��1cT
_""""""""�� 2P�e�$}a�Z�e�����v"""":�
=`*�Fw���R�~��gx��70|�p��;��G����sgt����������������������:`*c�n��
�'O�G}����x������^�'�|�u�����w�y'^x������V=N���������������J�SI�+�uelR	����;w�T�;���?���T�K �/����j4h�.��@DDDDDDDDDDDDDE(���������x�b;v���h��5���:������>�k���5R�4�2Q�u�466V�������M�<y�g�V�N�}�]���;7n�,Y������{����kt��A*����}��'��woH�?>�����T��^�7}���0j�(,Z�H�N%"""""""""""""**QL%�n�r�T���n�ILe���_~YJ�z�)�5!!A��}��7�r	�������QL#I�L�2h��9���Z<���j�N�P�bE�~�����};��Q�*��iZZv���Y�f��O>�������{O�c�|�rT�^}��E�~�T�^"""""""""""""��u��0>|X��=z�
��X�����^���M�6�e�������2Y7x�`5�)QQ�:`*���;��
��/������OG\\n��6<���j�R����^��!C��K5����%"""""""""""""**�0�����U ���O�E*����z
���G���������������������������^���7���|��p8
}�T"""""""""""""�BQ(���^��7��������x�b5��L�z���HKK��""""""""""""""*zQLeR�t]��
��'���JeL��I��~���X�v������������������J�\�0�d�����*0:z�hl�����8{�,6o��q���u��Wz��>DDDDDDDDDDDDDDE�P��|�����[���O?�^x/��������W�:t���~�	��������������������(E0����g�����q�%���_T�A��W�^����p����e��g���:u*���g�@DDDDDDDDDDDDDT4�����������C=��.�L��$�d�l#�-Z���4{-��W(�}���Q�F���#����u��l�g�����k����������������BI������m/��l#�&''C�u{)��u�T��V�T	;v�PSn���>Y��%""""""""""""":_������K�.8x� &L����fG���3Fm+���DDDDDDDDDDDDDDE%�����D���q�E��o�������_�j�
��$�e�k�����me�����������������D0
6�c�=��u���O>��/��W^yEOe������>K�V�'"""""""""""""*J�0u��0`�
�2�������1r�H5�kY&�d�V�!"""""""""""""*J�0111�����Q��K/�����3�<�&y-�d�l#��B�
M�P�Z5\u�Ux��U�T&y-�d�lCDDDDDDDDDDDDDT�+`jRSS����$�HyDDDDDDDDDDDDDDE%_S	tN�8o��v���#��|L���a��E=I9�QQ�W�466�^{-}���')G�#"""""""""""""**�
����c��!x������)�����������������+`�i���T�3�I������������������J��0�;w.N�:e/)<�O�Ves\S""""""""""""":_�0MMM��_���{�f���3g�5'�R)K����=����������������|L%�n����d�5�9��W���~���*w>�;w��w�}���~[��x�bU�������ill,n��6���@�f���O?��_�o����_��7o�n������,�u&L�;����_/���*C��2�ly"""""""""""""��!_S�v���{w(}�����uk6l�{�9����**A��I���g�}���*V�\�.]��}�,)S�&""""""""""""":_�0
�P�n��v�������C=���2�����1|�p|��'j����0c�$&&�S�Nx���T�TR�JR��V����4
��U�����z����k**�u�~�i�U&y-=K_z�%��Tz�^w�u�R��*���������������(D0
'c�6o�����#�<���2V�L���
~�a���
6�����""""""""""""""*:�0%"""""""""""""*i0%""""""""""""��DDDDDDDDDDDDDt�b���������������.X���S"""""""""""""�`1`JDDDDDDDDDDDDD,L���������������U����d�8q����>}S�N��~�Q�Fa��5����Z"""""""""""""��S(S]��a��2e
|>�Z�������������O>�����x��W1}���m���������������J�L>�>�/��2~��7������W�����/����{�F���1{�l����jQQ�:`j�����'�C����\.�J�+��m���`��,}���p�m�a��e�5k��]
��u����b��*H����w�}7bcc���+V�@BBn����T�{��U�T�������j�BDDDDDDDDDDDDDt�E0MII��}���Q#t���U���{U��~��h��4MS�k���z���4����DDDDDDDDDDDDDDE!�����MLLD���o/��]��;w�U�V�V����J����=GDDDDDDDDDDDDDTt����n�-[G�Uix���]�t�z��cG��7h����k*V���c/%""""""""""""":��������I�o��_~�E�?k�,��=[�,����N�
��_��G������>�/QQ)��W^y����O>��o����~�6m�u�]�-Z���b���x���1a�,����
�����u��x��gP�V-���������q����B�
����2e
f�����;��'�Tc��B	��X�7�t^}�U������>��_~Y�_�ibbbT/���~Z�2���8~)�B	�
	�^|������0x�`4n�XK�������?�8:t������B��F�:
P����������������|L���0}�t���QOR��GDDDDDDDDDDDDDTT�0MJJ�����)�v�r�<"""""""""""""�������=��I�h�"�T�N9r�v�R�����u��5C�����~l��	111��eJDDDDDDDDDDDDDE)_���x�{��x���2L/���v������/��7�|3�6=�4h�Z�j�O�>�<"""""""""""""��������S������S���_��G67�|3Z�l���i�����k��s��������m�6h�f�LDDDDDDDDDDDDDt��+`����4,=}�4n��6T�Z�^�Y�r�T0�l���1cRRR�5DDDDDDDDDDDDDD�_����dl��Y�<�T��)_��
�:tH[���������������J�S��������������8p@K����GDDDDDDDDDDDDDTT������y����e���[?~�^������7�`������������������������D0�x<���7j�������?���M���k�b��}jZ�f����w���#��iS\y���aJDDDDDDDDDDDDDE*������3{�1�c�������>��^{
���?�������������Z�j��_��V�Z�{�B	����c���*Pz�M7!&&K�,�������_c��(W����^���K����U�T"""""""""""""��T(SQ�T)�u�]x��w���/�o��x�	<��������W^yo��������X{/"""""""""""""��ShS�i�J�+��:�<��z�)<������'*V���!"""""""""""""*
5`JDDDDDDDDDDDDDT�Z�411������#����:����HMM��&""""""""""""":�
%`z��YL�0/��"�q����u��iRR�]��W(��K���7���+��uk8C��q�qNcbb�������������������^����;�����n�	��������>�q:t(�R�����������������������u+����Gy��uC��U04�)>>�����QL
�@jj*������k�K����������������������Y�&N�8�3g��K����������������B	����g����9s���f�!"""""""""""""*����K/�}����_��c�b�����o8��t��a�"""""""""""""��/����_�p�Bh���+W��^��a���;��_��W�������b�BDDDDDDDDDDDDDt�E0���?���{�\����w�}�z�f7��=^��.����������������+�1L���z<�����d�����������������D0����������%_��#����YINN���q��5����$�aoADDDDDDDDDDDDDT�
5`z��1L�<��������_������,�4i>loMDDDDDDDDDDDDDT�
-`�c�|��������&	�N�0����|�g�yF-�����m�6{/"""""""""""""��S(�S�Na��x��w�����o�C���O>�'�xB��e~�_�6���/�>DDDDDDDDDDDDDDE�P���-��Q�P�zu<��Sx������*X*������2y]�^=�7N�CDDDDDDDDDDDDDT���z�^��9'N���?�A��J�*�4����,�u��l;g�������������������D0MII��-[��aC���111���d�l#�n������"""""""""""""��/����={�,*T����K�K�'���'O�������QL].��)�C����#����6���#�������h���m��i��!11�^�����1e����#����n��z�B�����W_a��X�r%�;���T5�kY&����K���#�����M�6������2}���0l�0�������O�$�e�������d���CDDDDDDDDDDDDDT�
%`*�u���<���*�t�R���kj^&y-�d����L�KDDDDDDDDDDDDDE�P��b��x������o��'������A��I^�2Y'���DDDDDDDDDDDDDDE���"&&�:u����������f�B�<�P�C�M
A�����j��TS�z
�E�G�jQC��xQ�<�yJb�9�����Z�Wn�&rsorr���������or�������_�~q�e�E����0`���k��b�5����Z,0�8qb���+q�u��C=�'O����!��u�]q�%����>���+���	LSX��#���J�<������E��O<'�|r�r�)9PM�TR��C���O?=�����$����555��)o��Ul��&���{����s_�i�Jjv`:i�����{s
�]w�5~�����;v,��<��o��l�}��'�|2o����f����9���Wr�!��k������{��������m������4�O:l��X~��c���.����K.={���4��`^kv`��M����K�92F�U�����g�}�;w���[s��f���UW]5��w�,��M5JS_�o��f��S�N��y���i�v�b��7�X .��������
�5IS@��4���|����?�)���[�m*���i����~��}�Q��7����>;����]vY�x�w��'�o�p@���Z$0���[x����_����G�v�mq�	'�G��4��-���q����A����	L�e�Y&�;����oGyd������^{��o��y��g��{l�����
�rZ,0M:v��{��M���J���/�<��r�-�K�.������i���'��	b���Q[[�[�����?~|�@��h`���_�s�=������.�?���q�M7��t�������3�<���+���L����SO=5?��8����w��]�z��9 M�UW]����4���"�����������N:)^���t�Mc��w��={kD�����'�x"~�������_,��	LS3�_|q,���q����E]��b�5�,�����S������;��>����)@�4;0�0aB�{���I�#�8"<�����W�k��Xc�T�t��W�8 X`�x����u}��92o��V1g�R�/��R�~��q��W����~�������5f.��M��r�-y����/��1c�5����/�����;6�x��Xi������~�i��X��W\1V[m����Orh�m��d���{r���?�x1�q)M}��~����_�"��=��C��SN�?��O�\���u�]�����_�6��}��i���[���Y��I�&��Q�rs�]�t)��\��m��j����s�[
K}�����|�������?>����L>�����������}����t�<������c������)���o~����|��c��������j��
7��C���[���]��~.��B���\���O?�4���I�V������g��_���!C���������)d��_��k���2����������Z����K.�$�v�'�xb0 o�^�;��<��K/���6���/����v��1�^{�x��w���n������h�����A�b�����V�T������o�1�i|���*�6.ms�}��~Bw�q���k���s����"�KM��>CS����n��|q��M�����n���k�&�u�����w�yg��:;��~�4;0M}����;VXa����+s��T;2p)\KC�Q���/����]vY,��2���}��;������s����:+Z�nG}tl������}������pt����n��K�J��l��b��W�Gy$����K"��M��Xb��j���}������t����>T�
V,����_��L�T�����h����N��.�(~iH!�i�����o�1����N�uuz��w��'��m��6�>���ijfxVR��TS3�D]i�����K5NS���K�V���Q�x��Xy���W�^�����.������/�G}T�����_�-��Z�{��g��W���M���rK��3
W\qE��r�u��c�=6�;cM�j��G���K7�h���-�j�~�����K�4\M�.�/�x����k��M?�����K�.�����)pM�_g�&���/T�	L���;G��}��/�O<1�����p���Z���~t�A��k�b����r��>G�����BS���C�<4�m��_5����z)lMRx9�p6m�����#F��o2���������&V\q�8��r3�W]uU���5�\���-m�q��cM����an��AM]�T���]M�4i�Pt�����[o��2;v���E]4���&���q��G��Z�����{���%��}�����>}����^�,�H�dz������7q����)�������?����rH\p���rF�s3�[�m��Q�b����-a���� ����Xa�i_=���#&]��b�z���R�=��bj���m���PLU�q����-�h)���:����������1���
��WLU�v�������D�aWS�#��TNiY���u��J���T>S9mh��[c�%�G���^*���V��������+�h)�|�rZmV�^��>}M��t>�6�=*Zo��b*�un���Fc�����Z�����hr�������h�/�6�|�r�P�g-��K:���)-�s�����o��Q�ynDC-���-�x��X`�b�M7���[���_��W�^|��Xp�c�-���w�9�Xc�oUh:;����>��m�$0M����>-l���6&�g;v��b��p���c����}��V����F���D4��21���SS-7r��0��b�z|����Y�]�)Z�y���>��>�w_kXl���b*��{��"��^LU��/���j�QgF�������������rJ��������6����l�eF�nk
-���q���XuI��t>��������rZm�l�Z�����-��w���/v/��G�n����PLM����|Zm>��o�n�E1�:7]�V��{�����Y�8����Tu���ocSu���������Q����n��
]��.�<����,��*�s#���F���
�H����y��:�����+�j�5d��vZ�x��9<:th�w�y�����M�4�y�j���1i~
(��/l��>O'N��k�6&m[H6�vV��~��~C��*�Bo�w�XT�����G��� �Z����bh�P����3|��9��GjZ�ho�L:��C���V�YF�q���T��	���5vM`h���G���t�������kC��o���UMu~�����o�V3^Zf�V3~<7�<����P�����o<7j��Ej���������������;,�_v�ey|��6��?<\}�����O�W\�k�V����f��o�?��O�}��q����r�-W,�f��1q�G�����4���ny��??��b�����/�<^x�<��H������=�����w�%37�����$/-�GU���w�+.^LL1�����S�#5�����SS��wU6�2~�b�b�S��_^_S�M��{r�Y���b��7c�q�S���-�7��������������g*�������_.&�H*���6�����Df�s�G�W.���xO)���V�����5(�h)�|�rZmR����1�m��c��&y�vt��f�bj���������/��K�#�1Z��O"���:�I�b��h�M���&��TN������T�/W�?��|����xnTY��M<7�<��h���i�����M���&d:��\1�c���/�����/�Aj
G���������q�9�����`v�O?�4<��x�����n��7��X2M���o���	��o�=6�p�<��A��{��	���n��W��`��K/����k,��B��}�V(�����/����S�U���w����v�^{�-1�������f�Uc�K�of��F����W�U�G��?+�h)���6�����n>z�v��:�~�<���cd������?�*�����a1��?S�#��TNiY�5>���	�T�H�3����m�A1V]�y4�O�����i��Y`�h��OS��T>S9�6+�h�����tM��j���_E��\LE��M��������}?�{���q�_���Um�;i�����h�/�6�|�r������Va:���)-�s�����o��Q�ynDC���Q

S����+�;��U��}�Q<��s��g�\��U�V90M}���������~��lY��]�]w�����s�����]?�����+��Z�
k����#�^{��o�jz����4�j������^,����Y�[��j���4�M:b��Xl��r
�z���z��Zk����o8�s:�~<����k[n�e���+��LM�=:/K5<_x��\;5������?��g�.]b�m��������~���5�>�����g����w������_4��z�}�������/T�f����N�:��o���y^
�R��B�5�\3������M}bv����;�S)@���~���~�������� 3��g�yf�y���?����9X��j��&|���&}�����mzM�!?���������������M��_�����O�_�t����]������*1d����k
NS��Gy$�u�l�A�Y���Ma�w�o��f����y��I�q
LS_��g
(S���?}��Wc������?~��x���s�<������o�'�|r�6�6,�
����<�m���_��5;0Ma�[l�k����?��������M7�4���j��>;/���0`@����5(�]�i����p�����%�\2N:��\{�����t�A9�<���r��3��������w��_�:9���mz=�������5<����g4'��j���4�h����C���{/N<������sS��&e
����wM�\�rm����I
������_�o�q1w�RM�w�1�0M�\p����{��oj�6�{��W�s�9y����N;�"�,R�1����^�tc��_�v-���wS`������/�g�qFl����6c���s��)�K5���7]����"�i�j!�~9S����b�m���&cjzw��w����c����K�PI-�~���k�i
0�hR`��"}����k���i������TJ����G��g����O~M�
�5e���R���>I7�d��u�]�k�n8�)C�������K�.q�1���W^�_�t�yM����&�555��s�t��4�p^S���*�I�i]]]�?>����!�'��R������{�������C�O�@�4)03fL\t�Eq��7{H�I���&������7�8v�e�fi?i�����K�.��_�2����fi?i�������&:w�����i?i�������.�����k�����P)M
LS����3����6{H�I���&�c���/�0:��fi?i�����]�v��F��~��fi?i�����K�.q�����W_��!�'��R�����D����k����~��*�I�����c���1t������k�P�=@�4)0������%�\�_�t�yM����&�����;��#.�������k�P�=@�4)0m��}���'~��_��4�p^S���*�I�i�����C��O>9������2�oP)M
L�MZ40�4iR|��g1l��o��'O.���Z$0����!C���7��_~y\r�%�880jkk�=�{-���������>8��8����w��]E���?���;��q��{�����fxo�������b�����w�9��{����_���?����6�D������{�L��O>�dt��1�=���������s�z����_�z�����;w.�0�5;0�0aB�1"V_}��z����F��v���"�,RLT�f��:u���{���#��g���'K�o�L[�j�o�}l��f����-����4hP:4�
6�!5�;y��b/�^���G�������/�GuT�u�Yq�%�D���g:80jkk�=�{-���?��[n�%�z��<xp���Ksh:����o�q��{����N�4)n�����_��z���������,?��Y�l�M�k��������t�����SOE�N���������>�=��8��Sf9v�a��K�b/�^��	&����c�5���F;v�X,��5;0m��m,��"1y��<T�f��;w��7�<F����?~|�`�������&��z�X�����k�y����k�����
��0b�5R��jv`�j�4(z���=�Xu�Qq�i���_��p���Fmmm��y�����1c�����?�)�6M!�<�_~y\t�E3n���7n\��y���i�v�r�����k���I�TJ��.]����SOm���I�TJ�S�j%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
����
M�0!�o��V�����u���y~s�����J`Zejkk��'��O<1��j�Xm����g�O?�t^>'��~`~&0�"���]w�}���[o�5Z�j���J~����b�}���'N�Xl1{��~`~'0�"�������1b��8�����������G���s�91d��b��3���;�i�H�;�?�|x��9����{^�^O8��<?5��j�N�<9/�&sk�P
�Ub��a����/;��St���X2U�N���Gy$�
�sk�P
�U������_~9V_}�Xn�����K�W[m�x�������/�����/T�i�H5;Sm�%�X"�u�V��^��]sM�w�yg�k����@5�V������\0��m��g��}����G������7�[��2�?�k`��b�5uS��������w�}��C�.��k}�&���q��G����k������X2ssk��=zt1FK����b������Xq�bb����#&\r~1U]:������c�e�r�I��[L�R���u�3lr1U=�}�.��YLL1y��1��C���2cm��Q�z�U�T�H�3�SZ�%����/U$��TN�����������F�W.�"��TN�MM�5�v�G�)ZJ*���V�e���?�9���j�Q?�I��ULU�����6��PLM���~>������._n8����$��7T�=��GLM����������iC�zO:n����w�)Z��F��z�����TLM���M�n�+�T���h�����<7�!�i������#�l�`sn��1�^{m�-���{c���Bw��m�5������;O?\LU�[�8��j��+���c��o������Tk���O���S��4����b���XF7^��X�k���|�rJ�zz�1�v�b�z����iC;]Y1V]�f��l�E����3��jt����1ZJ*���V�=����Z�����Y���j�T�"��;�<���.�h�1a��{d�b���XF��h�/�6�|�r�P�������b����)Z��F������Q�ynDC�*���}����������s�1��OS�����o1V]�<qrL���b*b�v5��C1Qe�b���������d�=K��/,XL�R���~���b���~a�l��8�K1Qef,��l�Ql��g�T�H�3�SZV��m������|�r��Tg��3FG�3yZ9M�3��j��s��J��T>S9�F������Z���_F<8~Z]~�/��������2��Z-�\t��o���2c��CMl����"�����o�=��W/o}R��c�U��F���F���
	L����_{��g|��9����S�d��c��GW\qE^�'?�I�d���~����.F��R�j]�V���(K��ZEu~M�G?M���kF#�\W3��:����������e��2Zq��t=�����&��K�-e4��Z�T�����S������N��rz�z.UF��o�=i�����r����-�U��F���F���
	L������n�m���?����G�n��%�><~����?�������~s3	sk�P
D�U�G���J+�;���}�x��T{��O>�UVY%^x�b�����@5�V�%�X"V]u�x�����^�������_z��x����;��N����X2ksk�P
�Ub��m��&&M�W^ye|��1q���,�����q�
7D�b��6�.]����Z]6lX<8�6l��9��j���LQ�3����E]4���?���y,���1n��4hP�������n���u�Q��E���_�	'����o|����V[E��m�����]M]������z��\��s��11a��~v��5�Zk�8���c�
6(�����6�>��0`@r�!q�D����S��~���aZez��}���M���;�M}�v�aq��'��Hg���}��gss�n�al�����M�b�Ts�_�vj����x(�)PZS���@i	L��������I�&���C�c�����s��Z���F��q���y:t�X �����y�I���3fL�?>��i�;w��]�F��m��7q�����/�{O�0!���K�<���L�/����Le8������|6�����mmmmL�<9g��R��UY�T9����y)���>�,���[,Z����+Q+����)��J][*�0s�L�����s�6����z��M����R��-��q��A�����E]T�m\Z���?����:��c�Xc�5���o�������Nc�
�k��g�uV���'�_~��h��������~8F�]��u�!�3�<�|l��y��z�g�s�=��7����D�?��S��w����[���kNY9rd80�����w���M�W\qE�����f�1�(��9^��Rpr����~���?�3S�rX��
��s>���J]+�0s�A�e�]?������*�6�9�pN�����r3/�esG*s�{
-b��`�&O�\�����s�1������O/�4���>�������kW��G��e�]6�/�x]��m��)����L�4�����[o���:w�\��RK�-��ru�,�L�B-������M��,��f��	u��rCZ��[����^:o�^X`�<?-�8qb��4�v��T���?���r����5�\S,���|6?�����N:)o��{�\���K.�d]����~��7�|3��*Q�s�0/�����p�
u�-�X]�>}�9yf*Q+����)��J][*�0s����{���V[m����^����_/�|]%�I��K��y�,�;�r
-E`
�Rzp3t�����?>����"3�P�y��u�[�����w�C=�o�p����m���y������m��?�d:u�Tw����������8j���/�0?4Zq��}���=�y�������]������O�����_�:��h��������x���g��w���g�}�*�������f��H�Mx������r�-9�I��������N����#��3fL��T�(��9^��F�]������g�����*0�T9���T����+qm��������+��T~�)0��=)��t�W�������hh)S`����o�;����&=H����W_}5�P�_�>��#��i���l�
7�4hP1w�����/���v��
��y�������c�����V�Z�u�Q_{��������s������xav�?`}����v�y��.]��r<����|6���m����c��u7�t��������'��i���9��B���~�~���_���*��>�����R�0?K������sNS�e�25|��\&�Xc�|NeoV�is���������gY@����hhI�0�:������'?�I��a����]v��X��)�)��O���?[m�U���:��i�����'��������}��w�}��u��q��{����������>V[m�x��G��>(�D6,����Xh���G?�QL9�K�J�i~Z��~�������b�f�wl�=��)7wq����[o],m\s>�/��r���w��t�M����X2�r�-��D*>�`L���+U��xa^H���W^�~����'�K/�tq�����D9�������\�kK��.��{��'�a��?�Gyd.�R�{R�����,�e��u4�$�)��w�y'���?��	��s���+��R��q�������k�����$�K��'�<�LL�81���W_}5�\r��mc������g����s#�{����g��W���_��;�4?m���/���j;^h��;����G�q���5>+��l>��s�ao*//�p1w���7�d�j�*o;z��<�R�pN���/��2���{,>�����k�O�>����D9�������\�kK�������������;��7�{��Wt���X��9-��9_7��e-kN���%	L�F�o�>v�u�������y�`�Q�%���~��g����':th�&������O>�e�Y&Yd�<oF��[l�<�����d���y_K,�Dt����;��]���@��y��y^�/4E�.]��3���o�9v�i�h��]�d�����n���RK-m����3J�e�~?��������*Q�s�0/�^��k*���{n��~�J��J|o��nN�����T�q�z�����*.������aF��'�n^?�Z��\GCK��Zv�e�����l=���~��n��������$=tI�h����t���s�<4&]��6I�f������m�oRm�M��Zk�����������>�,���!o���E����+Q�s�0/t��!7���F�Z]��R���0���sp����C���}��v�m�����)�sz�n^?�Z��\GCK�-&��0��5�?�I�&cMSm�s[%�R%�as��W�*�����o����*O9���PO`
���c��q3]��95��t�����mN?��I�9-�(��9^�_U�V�{���S�C��J��-C9���h1�jB������o2�&�f�����9�l�f���LT�6�xa~U�rX��
�6jNyP��*qO
���zS�����D����xj�df��+J��m��G[�6m�v3�6���6�[��{�����W����6���T.��Y�USFiY�����_���9���J�����N9�__9��������T��4�6�vf;-C9������k�.[l�<>j�������?����+:v����v�+��bnef�����q_z���k��3=4J��:�oL��|����������9�l�*�.�h���/�kcF����N~��-�(��9^�_U������|U��R9��3���9�`�e(���-&]0�?�<xp���K�P�����K,�/L���&]t��O>�$��Q�W���>������K.Y��X|��c��V�w�}w��0�>e�+��r,���y^�/�ms��L��]v�e��l�~���>$���c��1�Q���J���/��*U+���F���T��T��h�!��@�I]����+_8>��3��(�92�}����l��I\p�X}�������{���NJ�/��Rl��F�f�^�X]e�U��^��_�k�i���_����:���QI�/�m��l�����aoZ����q���c�=������]�t��+U��xa~V�rX��
�6����r-���@�P�'0ZT�p�d�M�������w�tM��&�x��x���:�M��k����:�������7�|3����_���������_���D���$�i�m��&�*��+�������^���o����k�M7�t�=�v�075����mSy8p`�=��E����7�w�}w,��r������*Q�s�0��D9���|�T��R9��Q�{R��(�$����8�,=��C�"�w����[s��n�����w��}��"��>�R�Cw�qG�r�)��z�w\�Gj�^Z7�X��RSF�I���&�������.���}4l�,�#�2��W^������<=d2dH�u�Yq��7��P�sLt��������T�|���s��.��Zk�U,��9����7����'y����755���y��G���N�5c���;���t���D9l��B%�����s�>w�u����S�d�J��J}o@5��spR�kK���������n�����[.o3jN9l��0���9nn>�������3�`��~������uV��Sw�I'�M������C���<t����{��u��zj^�1�
���~P7���]�v��Z�n]7�B�n�UW����[�&O�\�=����������m��������M7����'�(��^�/���c��r�!�sv�5�s7���	&�����O.7�:u�k��U�6��T���6�X{z�(��9^��y�������O���~Z���J��J|o@�h�9����!�����^���k�!��J%�I�Y������)����0f���?�1�~����~���um����6�,��P�_������mw�a�8��3b�����foL�E{�>}�G��9���������o�Unz�)����[j��b�����n�/�R�e��/�����j��V�9�j;^��)�'�|2�X��8����~6[�j���^nf,}��/tS�c�y�)7�y�n3�1]�r����ym�����������o�k�5�R���P-�r����r��j��j���;�����T����y�,�;�r
-�f�	 %����x(�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0JK`
���(-�)PZS���@i	L����%0���4iR|���QWWW�(�)���	��g�����l�Pb�>�ll��V��k�s�E`
%���=zt1P>S�
���c����#c���y:5a��_�y����6&O�\l1MZ7��i�P�a��1��g��!-KM��J�������i����5���mg<��Nz��m����Q�F�������c����,�W��i<������F`
�!��sL,�����c��;��g�uVl��fy�z���{l��������#��?�ql���������O?�rH,�����W����~7�|s$S@9����C��UW]����K��^��{�������m��}���:m�Q~�}��7C��v�m�����+c�%���8x��</���
��/�8v�q��m������8��3r3�)x�fSh���g��}��.���{/Zh����O���.�=��3�{��b���������8 n���<�M�6��O�^{�����r
��R��K/�N;�?���������{�e��sO@�;��\;�1�\sM�����?�0��m���S�N��K����k^�}������,�[����z���g�}���O���>o��w��Aq�y�������o4��Sh���?>]t�\s3�����Osp��&���/��k���3J�R(��*��m�v}�Q�����W^9�����������i���C�^�06m�j�����q��g�Z���SO=Ul5�k��6�>���������/�5�\3n����&���_Tz��Xq�s����}��tP�M��%
i�����?�8.���|,�J`
M���?�����:����Z����_?���vf
FS����,n
9��i�:�n�������w�}�X;����w��_����{�fpWXa��]��?���s���#2dH�?�T;�����J��.���_�"���O��/��-�\���KDMMM�x�����0�:M!,@��@m�����g�bj�e�]6��L���sF)�L�c�M�P
!S��[n�e<��3�	�z�����R_|�</5����?~|~MM�&i�����Wt�����=)PM�M!l�u���Tk6�_z�=z��7�pC���j�V�G`
M��o����2���Z���R���k����i����;��N8!����T55�{��W���K.)�n\���B��H}��7��M��n�����k����k3fLn:X��@��@�IX�t��=:w�\LM/��������@2�Y��7MM��&rS`���}/�:���immm^�%���w�}����u,���������������VZ)~���������/��L`
��v��}�O�������_s�1��SO����?�i�u�Y����=���j��
����O>9��z��W��VSx�������w�=~����|��T#�)�#�	��'S��<yr��4IAe�������K��;��w�1�)4���+��#��>}��RK-���vgG:��c��a�E�a���^o��Vn�7������~L�2�������m����pq�����/D�6mb�����>����Wi�j�6�iZ��7�(��������o�{����:th1wj����[/7�{����y���T#�)�C��_�?��O�����2�,����s��m��&V_}��,���M��3��~M��]
)z��x����s&�O��[/�����tLO>��t5c�{�u�q�m�v�:���T�������/�?����h
$?����������N��������/�x^7��)<Ma�������#F��R��s�=7:����������\�&�Fk�n�r-�!C���Q�r0��*M��7.7�{�m����~_|��W����Xd�Eb�m��5O�����_��W�Y����B-����?<��L������_5�[�n�����/�>KS@����k�g�}v���?�.� �D������6o;�z��������������'���B��}���{�����4�b�-����������c�|����T�)��:�,m��-�L/���Vh�����V[m7�xc����K�!��{��q�G��
����q�����B�Yg������Zr�!q����E][l�E�Wt��A��7�M��,��Rq��g�v�m��M�=r���,��]vY\w�u��.��cM���8��������_��_;f�jRS7'���m������{����G�M6��X@��a
���(������(K'�IEND�B`�
v2-0001-Optimize-WindowAgg-s-use-of-tuplestores.patchapplication/octet-stream; name=v2-0001-Optimize-WindowAgg-s-use-of-tuplestores.patchDownload
From 9342482c0157506411f72c6f0c90a902b7746b01 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Sun, 7 Jul 2024 22:19:18 +1200
Subject: [PATCH v2] Optimize WindowAgg's use of tuplestores

When WindowAgg finished one partition of a PARTITION BY, it previously
would call tuplestore_end() to purge all the stored tuples before again
calling tuplestore_begin_heap() and carefully setting up all of the
tuplestore read pointers exactly as required for the given frameOptions.
Since the frameOptions don't change between partitions, this part does
not make much sense.

It seems much better to create the tuplestore and the read pointers once
and simply call tuplestore_clear() at the end of each partition.
tuplestore_clear() moves all of the read pointers back to the start
position and removes all tuples.

A simple test query with 1 million partitions and 1 tuple per partition
has been shown to run around 44% faster than without this change.
---
 src/backend/executor/nodeWindowAgg.c | 164 +++++++++++++++++----------
 src/include/nodes/execnodes.h        |   1 +
 2 files changed, 108 insertions(+), 57 deletions(-)

diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c
index 3221fa1522..bcb259f7cf 100644
--- a/src/backend/executor/nodeWindowAgg.c
+++ b/src/backend/executor/nodeWindowAgg.c
@@ -1074,57 +1074,24 @@ eval_windowfunction(WindowAggState *winstate, WindowStatePerFunc perfuncstate,
 }
 
 /*
- * begin_partition
- * Start buffering rows of the next partition.
+ * prepare_tuplestore
+ *		Prepare the tuplestore and all of the required read pointers for the
+ *		WindowAggState's frameOptions.
+ *
+ * Note: We use pg_noinline to avoid bloating the calling function with code
+ * which is only called once.
  */
-static void
-begin_partition(WindowAggState *winstate)
+static pg_noinline void
+prepare_tuplestore(WindowAggState *winstate)
 {
 	WindowAgg  *node = (WindowAgg *) winstate->ss.ps.plan;
-	PlanState  *outerPlan = outerPlanState(winstate);
 	int			frameOptions = winstate->frameOptions;
 	int			numfuncs = winstate->numfuncs;
-	int			i;
-
-	winstate->partition_spooled = false;
-	winstate->framehead_valid = false;
-	winstate->frametail_valid = false;
-	winstate->grouptail_valid = false;
-	winstate->spooled_rows = 0;
-	winstate->currentpos = 0;
-	winstate->frameheadpos = 0;
-	winstate->frametailpos = 0;
-	winstate->currentgroup = 0;
-	winstate->frameheadgroup = 0;
-	winstate->frametailgroup = 0;
-	winstate->groupheadpos = 0;
-	winstate->grouptailpos = -1;	/* see update_grouptailpos */
-	ExecClearTuple(winstate->agg_row_slot);
-	if (winstate->framehead_slot)
-		ExecClearTuple(winstate->framehead_slot);
-	if (winstate->frametail_slot)
-		ExecClearTuple(winstate->frametail_slot);
-
-	/*
-	 * If this is the very first partition, we need to fetch the first input
-	 * row to store in first_part_slot.
-	 */
-	if (TupIsNull(winstate->first_part_slot))
-	{
-		TupleTableSlot *outerslot = ExecProcNode(outerPlan);
 
-		if (!TupIsNull(outerslot))
-			ExecCopySlot(winstate->first_part_slot, outerslot);
-		else
-		{
-			/* outer plan is empty, so we have nothing to do */
-			winstate->partition_spooled = true;
-			winstate->more_partitions = false;
-			return;
-		}
-	}
+	/* we shouldn't be called if this was done already */
+	Assert(winstate->buffer == NULL);
 
-	/* Create new tuplestore for this partition */
+	/* Create new tuplestore */
 	winstate->buffer = tuplestore_begin_heap(false, false, work_mem);
 
 	/*
@@ -1158,16 +1125,10 @@ begin_partition(WindowAggState *winstate)
 
 		agg_winobj->readptr = tuplestore_alloc_read_pointer(winstate->buffer,
 															readptr_flags);
-		agg_winobj->markpos = -1;
-		agg_winobj->seekpos = -1;
-
-		/* Also reset the row counters for aggregates */
-		winstate->aggregatedbase = 0;
-		winstate->aggregatedupto = 0;
 	}
 
 	/* create mark and read pointers for each real window function */
-	for (i = 0; i < numfuncs; i++)
+	for (int i = 0; i < numfuncs; i++)
 	{
 		WindowStatePerFunc perfuncstate = &(winstate->perfunc[i]);
 
@@ -1179,8 +1140,6 @@ begin_partition(WindowAggState *winstate)
 															0);
 			winobj->readptr = tuplestore_alloc_read_pointer(winstate->buffer,
 															EXEC_FLAG_BACKWARD);
-			winobj->markpos = -1;
-			winobj->seekpos = -1;
 		}
 	}
 
@@ -1224,6 +1183,88 @@ begin_partition(WindowAggState *winstate)
 		winstate->grouptail_ptr =
 			tuplestore_alloc_read_pointer(winstate->buffer, 0);
 	}
+}
+
+/*
+ * begin_partition
+ * Start buffering rows of the next partition.
+ */
+static void
+begin_partition(WindowAggState *winstate)
+{
+	PlanState  *outerPlan = outerPlanState(winstate);
+	int			numfuncs = winstate->numfuncs;
+
+	winstate->partition_spooled = false;
+	winstate->framehead_valid = false;
+	winstate->frametail_valid = false;
+	winstate->grouptail_valid = false;
+	winstate->spooled_rows = 0;
+	winstate->currentpos = 0;
+	winstate->frameheadpos = 0;
+	winstate->frametailpos = 0;
+	winstate->currentgroup = 0;
+	winstate->frameheadgroup = 0;
+	winstate->frametailgroup = 0;
+	winstate->groupheadpos = 0;
+	winstate->grouptailpos = -1;	/* see update_grouptailpos */
+	ExecClearTuple(winstate->agg_row_slot);
+	if (winstate->framehead_slot)
+		ExecClearTuple(winstate->framehead_slot);
+	if (winstate->frametail_slot)
+		ExecClearTuple(winstate->frametail_slot);
+
+	/*
+	 * If this is the very first partition, we need to fetch the first input
+	 * row to store in first_part_slot.
+	 */
+	if (TupIsNull(winstate->first_part_slot))
+	{
+		TupleTableSlot *outerslot = ExecProcNode(outerPlan);
+
+		if (!TupIsNull(outerslot))
+			ExecCopySlot(winstate->first_part_slot, outerslot);
+		else
+		{
+			/* outer plan is empty, so we have nothing to do */
+			winstate->partition_spooled = true;
+			winstate->more_partitions = false;
+			return;
+		}
+	}
+
+	/* Create new tuplestore if not done already. */
+	if (unlikely(winstate->buffer == NULL))
+		prepare_tuplestore(winstate);
+
+	winstate->next_partition = false;
+
+	if (winstate->numaggs > 0)
+	{
+		WindowObject agg_winobj = winstate->agg_winobj;
+
+		/* reset mark and see positions for aggregate functions */
+		agg_winobj->markpos = -1;
+		agg_winobj->seekpos = -1;
+
+		/* Also reset the row counters for aggregates */
+		winstate->aggregatedbase = 0;
+		winstate->aggregatedupto = 0;
+	}
+
+	/* reset mark and seek positions for each real window function */
+	for (int i = 0; i < numfuncs; i++)
+	{
+		WindowStatePerFunc perfuncstate = &(winstate->perfunc[i]);
+
+		if (!perfuncstate->plain_agg)
+		{
+			WindowObject winobj = perfuncstate->winobj;
+
+			winobj->markpos = -1;
+			winobj->seekpos = -1;
+		}
+	}
 
 	/*
 	 * Store the first tuple into the tuplestore (it's always available now;
@@ -1360,9 +1401,9 @@ release_partition(WindowAggState *winstate)
 	}
 
 	if (winstate->buffer)
-		tuplestore_end(winstate->buffer);
-	winstate->buffer = NULL;
+		tuplestore_clear(winstate->buffer);
 	winstate->partition_spooled = false;
+	winstate->next_partition = true;
 }
 
 /*
@@ -2061,7 +2102,7 @@ ExecWindowAgg(PlanState *pstate)
 	 * rescan).  These are assumed to hold constant throughout the scan; if
 	 * user gives us a volatile expression, we'll only use its initial value.
 	 */
-	if (winstate->all_first)
+	if (unlikely(winstate->all_first))
 	{
 		int			frameOptions = winstate->frameOptions;
 		Datum		value;
@@ -2127,7 +2168,7 @@ ExecWindowAgg(PlanState *pstate)
 	/* We need to loop as the runCondition or qual may filter out tuples */
 	for (;;)
 	{
-		if (winstate->buffer == NULL)
+		if (winstate->next_partition)
 		{
 			/* Initialize for first partition and set current row = 0 */
 			begin_partition(winstate);
@@ -2670,6 +2711,7 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
 	winstate->all_first = true;
 	winstate->partition_spooled = false;
 	winstate->more_partitions = false;
+	winstate->next_partition = true;
 
 	return winstate;
 }
@@ -2684,6 +2726,14 @@ ExecEndWindowAgg(WindowAggState *node)
 	PlanState  *outerPlan;
 	int			i;
 
+	if (node->buffer != NULL)
+	{
+		tuplestore_end(node->buffer);
+
+		/* nullify so that release_partition skips the tuplestore_clear() */
+		node->buffer = NULL;
+	}
+
 	release_partition(node);
 
 	for (i = 0; i < node->numaggs; i++)
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index cac684d9b3..99176b022c 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -2646,6 +2646,7 @@ typedef struct WindowAggState
 	bool		all_first;		/* true if the scan is starting */
 	bool		partition_spooled;	/* true if all tuples in current partition
 									 * have been spooled into tuplestore */
+	bool		next_partition; /* true if begin_partition needs to be called */
 	bool		more_partitions;	/* true if there's more partitions after
 									 * this one */
 	bool		framehead_valid;	/* true if frameheadpos is known up to
-- 
2.34.1

#4Ranier Vilela
ranier.vf@gmail.com
In reply to: David Rowley (#3)
Re: Optimize WindowAgg's use of tuplestores

Em qui., 11 de jul. de 2024 às 09:09, David Rowley <dgrowleyml@gmail.com>
escreveu:

On Wed, 10 Jul 2024 at 02:42, Ashutosh Bapat
<ashutosh.bapat.oss@gmail.com> wrote:

Observations
1. The numbers corresponding to 10 and 100 partitions are higher when
patched. That might be just noise. I don't see any reason why it would
impact negatively when there are a small number of partitions. The
lower partition cases also have a higher number of rows per partition,
so is the difference between MemoryContextDelete() vs
MemoryContextReset() making any difference here. May be worth
verifying those cases carefully. Otherwise upto 1000 partitions, it
doesn't show any differences.

I think this might just be noise as a result of rearranging code. In
terms of C code, I don't see any reason for it to be slower. If you
look at GenerationDelete() (as what is getting called from
MemoryContextDelete()), it just calls GenerationReset(). So resetting
is going to always be less work than deleting the context, especially
given we don't need to create the context again when we reset it.

I wrote the attached script to see if I can also see the slowdown and
I do see the patched code come out slightly slower (within noise
levels) in lower partition counts.

To get my compiler to produce code in a more optimal order for the
common case, I added unlikely() to the "if (winstate->all_first)"
condition. This is only evaluated on the first time after a rescan,
so putting that code at the end of the function makes more sense. The
attached v2 patch has it this way.

Not that it's going to make any difference,
but since you're going to touch this code, why not?

Function *begin_partition*:
1. You can reduce the scope for variable *outerPlan*,
it is not needed anywhere else.
+ /*
+ * If this is the very first partition, we need to fetch the first input
+ * row to store in first_part_slot.
+ */
+ if (TupIsNull(winstate->first_part_slot))
+ {
+ PlanState *outerPlan = outerPlanState(winstate);
+ TupleTableSlot *outerslot = ExecProcNode(outerPlan);

2. There is once reference to variable numFuncs
You can reduce the scope.

+ /* reset mark and seek positions for each real window function */
+ for (int i = 0; i < winstate->numfuncs; i++)
Function *prepare_tuplestore. *
1. There is once reference to variable numFuncs
You can reduce the scope.
  /* create mark and read pointers for each real window function */
- for (i = 0; i < numfuncs; i++)
+ for (int i = 0; i < winstate->numfuncs; i++)

2. You can securely initialize the default value for variable
*winstate->grouptail_ptr*
in *else* part.

if ((frameOptions & (FRAMEOPTION_EXCLUDE_GROUP |
FRAMEOPTION_EXCLUDE_TIES)) &&
node->ordNumCols != 0)
winstate->grouptail_ptr =
tuplestore_alloc_read_pointer(winstate->buffer, 0);
}
+ else
+ winstate->grouptail_ptr = -1;

best regards,
Ranier Vilela

#5Tatsuo Ishii
ishii@postgresql.org
In reply to: David Rowley (#3)
Re: Optimize WindowAgg's use of tuplestores

Hi David,

Thank you for the patch.

I think this might just be noise as a result of rearranging code. In
terms of C code, I don't see any reason for it to be slower. If you
look at GenerationDelete() (as what is getting called from
MemoryContextDelete()), it just calls GenerationReset(). So resetting
is going to always be less work than deleting the context, especially
given we don't need to create the context again when we reset it.

I wrote the attached script to see if I can also see the slowdown and
I do see the patched code come out slightly slower (within noise
levels) in lower partition counts.

To get my compiler to produce code in a more optimal order for the
common case, I added unlikely() to the "if (winstate->all_first)"
condition. This is only evaluated on the first time after a rescan,
so putting that code at the end of the function makes more sense. The
attached v2 patch has it this way. You can see the numbers look
slightly better in the attached graph.

Thanks for having a look at this.

David

@@ -2684,6 +2726,14 @@ ExecEndWindowAgg(WindowAggState *node)
PlanState *outerPlan;
int i;

+	if (node->buffer != NULL)
+	{
+		tuplestore_end(node->buffer);
+
+		/* nullify so that release_partition skips the tuplestore_clear() */
+		node->buffer = NULL;
+	}
+

Is it possible that node->buffer == NULL in ExecEndWindowAgg()? If
not, probably making it an Assert() or just removing the if() should
be fine.

Best reagards,
--
Tatsuo Ishii
SRA OSS LLC
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp

#6Tatsuo Ishii
ishii@postgresql.org
In reply to: Tatsuo Ishii (#5)
Re: Optimize WindowAgg's use of tuplestores

@@ -2684,6 +2726,14 @@ ExecEndWindowAgg(WindowAggState *node)
PlanState *outerPlan;
int i;

+	if (node->buffer != NULL)
+	{
+		tuplestore_end(node->buffer);
+
+		/* nullify so that release_partition skips the tuplestore_clear() */
+		node->buffer = NULL;
+	}
+

Is it possible that node->buffer == NULL in ExecEndWindowAgg()? If
not, probably making it an Assert() or just removing the if() should
be fine.

Of course it it possible, for example there's no row in a partition.
Sorry for noise.

Best reagards,
--
Tatsuo Ishii
SRA OSS LLC
English: http://www.sraoss.co.jp/index_en/
Japanese:http://www.sraoss.co.jp

#7Ashutosh Bapat
ashutosh.bapat.oss@gmail.com
In reply to: David Rowley (#3)
Re: Optimize WindowAgg's use of tuplestores

On Thu, Jul 11, 2024 at 5:39 PM David Rowley <dgrowleyml@gmail.com> wrote:

On Wed, 10 Jul 2024 at 02:42, Ashutosh Bapat
<ashutosh.bapat.oss@gmail.com> wrote:

Observations
1. The numbers corresponding to 10 and 100 partitions are higher when
patched. That might be just noise. I don't see any reason why it would
impact negatively when there are a small number of partitions. The
lower partition cases also have a higher number of rows per partition,
so is the difference between MemoryContextDelete() vs
MemoryContextReset() making any difference here. May be worth
verifying those cases carefully. Otherwise upto 1000 partitions, it
doesn't show any differences.

I think this might just be noise as a result of rearranging code. In
terms of C code, I don't see any reason for it to be slower. If you
look at GenerationDelete() (as what is getting called from
MemoryContextDelete()), it just calls GenerationReset(). So resetting
is going to always be less work than deleting the context, especially
given we don't need to create the context again when we reset it.

I wrote the attached script to see if I can also see the slowdown and
I do see the patched code come out slightly slower (within noise
levels) in lower partition counts.

To get my compiler to produce code in a more optimal order for the
common case, I added unlikely() to the "if (winstate->all_first)"
condition. This is only evaluated on the first time after a rescan,
so putting that code at the end of the function makes more sense. The
attached v2 patch has it this way. You can see the numbers look
slightly better in the attached graph.

The change to all_first seems unrelated to the tuplestore
optimization. But it's bringing the results inline with the master for
lower number of partitions.

Thanks for the script. I have similar results on my laptop.
From master
Testing with 1000000 partitions
latency average = 505.738 ms
latency average = 509.407 ms
latency average = 522.461 ms
Testing with 100000 partitions
latency average = 329.026 ms
latency average = 327.504 ms
latency average = 342.556 ms
Testing with 10000 partitions
latency average = 299.496 ms
latency average = 298.266 ms
latency average = 306.773 ms
Testing with 1000 partitions
latency average = 299.006 ms
latency average = 302.188 ms
latency average = 301.701 ms
Testing with 100 partitions
latency average = 305.411 ms
latency average = 286.935 ms
latency average = 302.432 ms
Testing with 10 partitions
latency average = 288.091 ms
latency average = 294.506 ms
latency average = 305.082 ms
Testing with 1 partitions
latency average = 301.121 ms
latency average = 319.615 ms
latency average = 301.141 ms

Patched
Testing with 1000000 partitions
latency average = 351.683 ms
latency average = 352.516 ms
latency average = 352.086 ms
Testing with 100000 partitions
latency average = 300.626 ms
latency average = 303.584 ms
latency average = 306.959 ms
Testing with 10000 partitions
latency average = 289.560 ms
latency average = 302.248 ms
latency average = 297.423 ms
Testing with 1000 partitions
latency average = 308.600 ms
latency average = 299.215 ms
latency average = 289.681 ms
Testing with 100 partitions
latency average = 301.216 ms
latency average = 286.240 ms
latency average = 291.232 ms
Testing with 10 partitions
latency average = 305.260 ms
latency average = 296.707 ms
latency average = 300.266 ms
Testing with 1 partitions
latency average = 316.199 ms
latency average = 314.043 ms
latency average = 309.425 ms

Now that you are also seeing the slowdown with your earlier patch, I
am wondering whether adding unlikely() by itself is a good
optimization. There might be some other reason behind the perceived
slowdown. How do the numbers look when you just add unlikely() without
any other changes?

--
Best Wishes,
Ashutosh Bapat

#8Ashutosh Bapat
ashutosh.bapat.oss@gmail.com
In reply to: Ashutosh Bapat (#7)
Re: Optimize WindowAgg's use of tuplestores

On Fri, Jul 12, 2024 at 11:59 AM Ashutosh Bapat
<ashutosh.bapat.oss@gmail.com> wrote:

Now that you are also seeing the slowdown with your earlier patch, I
am wondering whether adding unlikely() by itself is a good
optimization. There might be some other reason behind the perceived
slowdown. How do the numbers look when you just add unlikely() without
any other changes?

Out of curiosity, I measured the performance with just the "unlikely"
change and with the full patch. Below are the results
Testing with 1000000 partitions
latency average = 503.321 ms
latency average = 510.365 ms
latency average = 512.117 ms
Testing with 100000 partitions
latency average = 371.764 ms
latency average = 361.202 ms
latency average = 360.529 ms
Testing with 10000 partitions
latency average = 327.495 ms
latency average = 327.334 ms
latency average = 325.925 ms
Testing with 1000 partitions
latency average = 319.290 ms
latency average = 318.709 ms
latency average = 318.013 ms
Testing with 100 partitions
latency average = 317.756 ms
latency average = 318.933 ms
latency average = 316.529 ms
Testing with 10 partitions
latency average = 316.392 ms
latency average = 315.297 ms
latency average = 316.007 ms
Testing with 1 partitions
latency average = 330.978 ms
latency average = 330.529 ms
latency average = 333.538 ms

with just unlikely change
Testing with 1000000 partitions
latency average = 504.786 ms
latency average = 507.557 ms
latency average = 508.522 ms
Testing with 100000 partitions
latency average = 316.345 ms
latency average = 315.496 ms
latency average = 326.503 ms
Testing with 10000 partitions
latency average = 296.878 ms
latency average = 293.927 ms
latency average = 294.654 ms
Testing with 1000 partitions
latency average = 292.680 ms
latency average = 283.245 ms
latency average = 280.857 ms
Testing with 100 partitions
latency average = 292.569 ms
latency average = 296.330 ms
latency average = 295.389 ms
Testing with 10 partitions
latency average = 285.909 ms
latency average = 287.499 ms
latency average = 293.322 ms
Testing with 1 partitions
latency average = 305.080 ms
latency average = 309.100 ms
latency average = 307.794 ms

There's noticeable change across all the number of partitions with
just "unlikely" change. The improvement is lesser with larger number
of partitions but quite visible with lesser number of partitions.

full patch
Testing with 1000000 partitions
latency average = 356.026 ms
latency average = 375.280 ms
latency average = 374.575 ms
Testing with 100000 partitions
latency average = 318.173 ms
latency average = 307.598 ms
latency average = 315.868 ms
Testing with 10000 partitions
latency average = 295.541 ms
latency average = 313.317 ms
latency average = 299.936 ms
Testing with 1000 partitions
latency average = 295.082 ms
latency average = 305.204 ms
latency average = 294.702 ms
Testing with 100 partitions
latency average = 302.552 ms
latency average = 307.596 ms
latency average = 304.202 ms
Testing with 10 partitions
latency average = 295.050 ms
latency average = 291.127 ms
latency average = 299.704 ms
Testing with 1 partitions
latency average = 308.781 ms
latency average = 304.071 ms
latency average = 319.560 ms

There is significant improvement with a large number of partitions as
seen previously. But for a smaller number of partitions the
performance worsens, which needs some investigation.
--
Best Wishes,
Ashutosh Bapat

#9Andy Fan
zhihuifan1213@163.com
In reply to: Ashutosh Bapat (#8)
Re: Optimize WindowAgg's use of tuplestores

Ashutosh Bapat <ashutosh.bapat.oss@gmail.com> writes:

On Fri, Jul 12, 2024 at 11:59 AM Ashutosh Bapat
<ashutosh.bapat.oss@gmail.com> wrote:

Out of curiosity, I measured the performance with just the "unlikely"
change and with the full patch. Below are the results
Testing with 1000000 partitions

...

latency average = 333.538 ms

with just unlikely change
Testing with 1000000 partitions

..

Testing with 1 partitions

There's noticeable change across all the number of partitions with
just "unlikely" change.

I'm curious about why a 'unlikey' change can cause noticeable change,
especially there is just one function call in the 'if-statement' (I am
thinking more instrucments in the if-statement body, more changes it can
cause).

+	if (unlikely(winstate->buffer == NULL))
+		prepare_tuplestore(winstate);

--
Best Regards
Andy Fan

#10David Rowley
dgrowleyml@gmail.com
In reply to: Andy Fan (#9)
Re: Optimize WindowAgg's use of tuplestores

On Thu, 18 Jul 2024 at 19:56, Andy Fan <zhihuifan1213@163.com> wrote:

I'm curious about why a 'unlikey' change can cause noticeable change,
especially there is just one function call in the 'if-statement' (I am
thinking more instrucments in the if-statement body, more changes it can
cause).

+       if (unlikely(winstate->buffer == NULL))
+               prepare_tuplestore(winstate);

This isn't the branch being discussed. We've not talked about whether
the above one is useful or not. The branch we were discussing is the
"if (winstate->all_first)", of which has a large number of
instructions inside it.

However, for this one, my understanding of this particular case is,
it's a very predictable branch as, even if the first prediction gets
it wrong the first time, it's not going to be wrong for long as the
condition is false for all subsequent calls. So, from there, if you
assume that the instruction decoder is always going to fetch the
correct instructions according to the branch predictor's correct
prediction (the ones for branch not taken), then the only benefit
possible is that the next instructions to execute are the next
instructions in the code rather than instructions located far away,
possibly on another cacheline that needs to be loaded from RAM or
higher cache levels. Adding the unlikely() should coax the compiler
into laying out the code so the branch's instructions at the end of
the function and that, in theory, should reduce the likelihood of
frontend stalls waiting for cachelines for further instructions to
arrive from RAM or higher cache levels. That's my theory, at least. I
expected to see perf stat show me a lower "stalled-cycles-frontend"
with the v2 patch than v1, but didn't see that when I looked, so my
theory might be wrong.

For the case you're mentioning above, calling the function isn't very
many instructions, so the benefits are likely very small with a branch
this predictable.

David

#11David Rowley
dgrowleyml@gmail.com
In reply to: Ashutosh Bapat (#8)
5 attachment(s)
Re: Optimize WindowAgg's use of tuplestores

On Mon, 15 Jul 2024 at 18:02, Ashutosh Bapat
<ashutosh.bapat.oss@gmail.com> wrote:

There is significant improvement with a large number of partitions as
seen previously. But for a smaller number of partitions the
performance worsens, which needs some investigation.

We get performance variations all the time from unrelated changes due
to alignment changes in the code layout. There's a write-up in [1]https://emeryberger.com/research/stabilizer/
that you might find interesting. In particular the following
paragraph:

"Unfortunately, modern architectural features make this approach
unsound. Statistically sound evaluation requires multiple samples to
test whether one can or cannot (with high confidence) reject the null
hypothesis that results are the same before and after. However, caches
and branch predictors make performance dependent on machine-specific
parameters and the exact layout of code, stack frames, and heap
objects. A single binary constitutes just one sample from the space of
program layouts, regardless of the number of runs. Since compiler
optimizations and code changes also alter layout, it is currently
impossible to distinguish the impact of an optimization from that of
its layout effects."

Since the code changes here add no additional work, they only remove
work. I think any regressions you see must be related to code
alignment.

To try and move this forward again, I adjusted the patch to use a
static function with pg_noinline rather than unlikely. I don't think
this will make much difference code generation wise, but I did think
it was an improvement in code cleanliness. Patches attached.

I did a round of benchmarking on an AMD Zen4 7945hx and on an Apple
M2. I also graphed the results you sent so they're easier to compare
with mine.

0001 is effectively the unlikely() patch for calculating the frame offsets.
0002 is the tuplestore_reset() patch

The AMD laptop results were a bit noisy. M2 results were much more stable.

David

[1]: https://emeryberger.com/research/stabilizer/

Attachments:

v3-0001-Speedup-WindowAgg-code-by-moving-uncommon-code-ou.patchapplication/octet-stream; name=v3-0001-Speedup-WindowAgg-code-by-moving-uncommon-code-ou.patchDownload
From 705862327fe5a2243d237d80aaafe0416d8b4941 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Mon, 19 Aug 2024 19:54:44 +1200
Subject: [PATCH v3 1/2] Speedup WindowAgg code by moving uncommon code
 out-of-line

The code to calculate the frame offsets is only performed once per scan.
Moving this code out of line gives a nice speedup to the WindowAgg code.
---
 src/backend/executor/nodeWindowAgg.c | 140 +++++++++++++++------------
 1 file changed, 78 insertions(+), 62 deletions(-)

diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c
index 3221fa1522..88a85f556b 100644
--- a/src/backend/executor/nodeWindowAgg.c
+++ b/src/backend/executor/nodeWindowAgg.c
@@ -2032,6 +2032,82 @@ update_grouptailpos(WindowAggState *winstate)
 	MemoryContextSwitchTo(oldcontext);
 }
 
+/*
+ * calculate_frame_offsets
+ *		Determine the startOffsetValue and endOffsetValue values for the
+ *		WindowAgg's frame options.
+ */
+static pg_noinline void
+calculate_frame_offsets(PlanState *pstate)
+{
+	WindowAggState *winstate = castNode(WindowAggState, pstate);
+	ExprContext *econtext;
+	int			frameOptions = winstate->frameOptions;
+	Datum		value;
+	bool		isnull;
+	int16		len;
+	bool		byval;
+
+	/* Ensure we've not been called before for this scan */
+	Assert(winstate->all_first);
+
+	econtext = winstate->ss.ps.ps_ExprContext;
+
+	if (frameOptions & FRAMEOPTION_START_OFFSET)
+	{
+		Assert(winstate->startOffset != NULL);
+		value = ExecEvalExprSwitchContext(winstate->startOffset,
+										  econtext,
+										  &isnull);
+		if (isnull)
+			ereport(ERROR,
+					(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+					 errmsg("frame starting offset must not be null")));
+		/* copy value into query-lifespan context */
+		get_typlenbyval(exprType((Node *) winstate->startOffset->expr),
+						&len,
+						&byval);
+		winstate->startOffsetValue = datumCopy(value, byval, len);
+		if (frameOptions & (FRAMEOPTION_ROWS | FRAMEOPTION_GROUPS))
+		{
+			/* value is known to be int8 */
+			int64		offset = DatumGetInt64(value);
+
+			if (offset < 0)
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+						 errmsg("frame starting offset must not be negative")));
+		}
+	}
+
+	if (frameOptions & FRAMEOPTION_END_OFFSET)
+	{
+		Assert(winstate->endOffset != NULL);
+		value = ExecEvalExprSwitchContext(winstate->endOffset,
+										  econtext,
+										  &isnull);
+		if (isnull)
+			ereport(ERROR,
+					(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+					 errmsg("frame ending offset must not be null")));
+		/* copy value into query-lifespan context */
+		get_typlenbyval(exprType((Node *) winstate->endOffset->expr),
+						&len,
+						&byval);
+		winstate->endOffsetValue = datumCopy(value, byval, len);
+		if (frameOptions & (FRAMEOPTION_ROWS | FRAMEOPTION_GROUPS))
+		{
+			/* value is known to be int8 */
+			int64		offset = DatumGetInt64(value);
+
+			if (offset < 0)
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+						 errmsg("frame ending offset must not be negative")));
+		}
+	}
+	winstate->all_first = false;
+}
 
 /* -----------------
  * ExecWindowAgg
@@ -2061,68 +2137,8 @@ ExecWindowAgg(PlanState *pstate)
 	 * rescan).  These are assumed to hold constant throughout the scan; if
 	 * user gives us a volatile expression, we'll only use its initial value.
 	 */
-	if (winstate->all_first)
-	{
-		int			frameOptions = winstate->frameOptions;
-		Datum		value;
-		bool		isnull;
-		int16		len;
-		bool		byval;
-
-		econtext = winstate->ss.ps.ps_ExprContext;
-
-		if (frameOptions & FRAMEOPTION_START_OFFSET)
-		{
-			Assert(winstate->startOffset != NULL);
-			value = ExecEvalExprSwitchContext(winstate->startOffset,
-											  econtext,
-											  &isnull);
-			if (isnull)
-				ereport(ERROR,
-						(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
-						 errmsg("frame starting offset must not be null")));
-			/* copy value into query-lifespan context */
-			get_typlenbyval(exprType((Node *) winstate->startOffset->expr),
-							&len, &byval);
-			winstate->startOffsetValue = datumCopy(value, byval, len);
-			if (frameOptions & (FRAMEOPTION_ROWS | FRAMEOPTION_GROUPS))
-			{
-				/* value is known to be int8 */
-				int64		offset = DatumGetInt64(value);
-
-				if (offset < 0)
-					ereport(ERROR,
-							(errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
-							 errmsg("frame starting offset must not be negative")));
-			}
-		}
-		if (frameOptions & FRAMEOPTION_END_OFFSET)
-		{
-			Assert(winstate->endOffset != NULL);
-			value = ExecEvalExprSwitchContext(winstate->endOffset,
-											  econtext,
-											  &isnull);
-			if (isnull)
-				ereport(ERROR,
-						(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
-						 errmsg("frame ending offset must not be null")));
-			/* copy value into query-lifespan context */
-			get_typlenbyval(exprType((Node *) winstate->endOffset->expr),
-							&len, &byval);
-			winstate->endOffsetValue = datumCopy(value, byval, len);
-			if (frameOptions & (FRAMEOPTION_ROWS | FRAMEOPTION_GROUPS))
-			{
-				/* value is known to be int8 */
-				int64		offset = DatumGetInt64(value);
-
-				if (offset < 0)
-					ereport(ERROR,
-							(errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
-							 errmsg("frame ending offset must not be negative")));
-			}
-		}
-		winstate->all_first = false;
-	}
+	if (unlikely(winstate->all_first))
+		calculate_frame_offsets(pstate);
 
 	/* We need to loop as the runCondition or qual may filter out tuples */
 	for (;;)
-- 
2.34.1

v3-0002-Optimize-WindowAgg-s-use-of-tuplestores.patchapplication/octet-stream; name=v3-0002-Optimize-WindowAgg-s-use-of-tuplestores.patchDownload
From 251f63e39c01fcff2193b336c19ec8ae7bc7791e Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Sun, 7 Jul 2024 22:19:18 +1200
Subject: [PATCH v3 2/2] Optimize WindowAgg's use of tuplestores

When WindowAgg finished one partition of a PARTITION BY, it previously
would call tuplestore_end() to purge all the stored tuples before again
calling tuplestore_begin_heap() and carefully setting up all of the
tuplestore read pointers exactly as required for the given frameOptions.
Since the frameOptions don't change between partitions, this part does
not make much sense.

It seems much better to create the tuplestore and the read pointers once
and simply call tuplestore_clear() at the end of each partition.
tuplestore_clear() moves all of the read pointers back to the start
position and removes all tuples.

A simple test query with 1 million partitions and 1 tuple per partition
has been shown to run around 44% faster than without this change.
---
 src/backend/executor/nodeWindowAgg.c | 162 ++++++++++++++++++---------
 src/include/nodes/execnodes.h        |   1 +
 2 files changed, 107 insertions(+), 56 deletions(-)

diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c
index 88a85f556b..51a6708a39 100644
--- a/src/backend/executor/nodeWindowAgg.c
+++ b/src/backend/executor/nodeWindowAgg.c
@@ -1074,57 +1074,24 @@ eval_windowfunction(WindowAggState *winstate, WindowStatePerFunc perfuncstate,
 }
 
 /*
- * begin_partition
- * Start buffering rows of the next partition.
+ * prepare_tuplestore
+ *		Prepare the tuplestore and all of the required read pointers for the
+ *		WindowAggState's frameOptions.
+ *
+ * Note: We use pg_noinline to avoid bloating the calling function with code
+ * which is only called once.
  */
-static void
-begin_partition(WindowAggState *winstate)
+static pg_noinline void
+prepare_tuplestore(WindowAggState *winstate)
 {
 	WindowAgg  *node = (WindowAgg *) winstate->ss.ps.plan;
-	PlanState  *outerPlan = outerPlanState(winstate);
 	int			frameOptions = winstate->frameOptions;
 	int			numfuncs = winstate->numfuncs;
-	int			i;
-
-	winstate->partition_spooled = false;
-	winstate->framehead_valid = false;
-	winstate->frametail_valid = false;
-	winstate->grouptail_valid = false;
-	winstate->spooled_rows = 0;
-	winstate->currentpos = 0;
-	winstate->frameheadpos = 0;
-	winstate->frametailpos = 0;
-	winstate->currentgroup = 0;
-	winstate->frameheadgroup = 0;
-	winstate->frametailgroup = 0;
-	winstate->groupheadpos = 0;
-	winstate->grouptailpos = -1;	/* see update_grouptailpos */
-	ExecClearTuple(winstate->agg_row_slot);
-	if (winstate->framehead_slot)
-		ExecClearTuple(winstate->framehead_slot);
-	if (winstate->frametail_slot)
-		ExecClearTuple(winstate->frametail_slot);
-
-	/*
-	 * If this is the very first partition, we need to fetch the first input
-	 * row to store in first_part_slot.
-	 */
-	if (TupIsNull(winstate->first_part_slot))
-	{
-		TupleTableSlot *outerslot = ExecProcNode(outerPlan);
 
-		if (!TupIsNull(outerslot))
-			ExecCopySlot(winstate->first_part_slot, outerslot);
-		else
-		{
-			/* outer plan is empty, so we have nothing to do */
-			winstate->partition_spooled = true;
-			winstate->more_partitions = false;
-			return;
-		}
-	}
+	/* we shouldn't be called if this was done already */
+	Assert(winstate->buffer == NULL);
 
-	/* Create new tuplestore for this partition */
+	/* Create new tuplestore */
 	winstate->buffer = tuplestore_begin_heap(false, false, work_mem);
 
 	/*
@@ -1158,16 +1125,10 @@ begin_partition(WindowAggState *winstate)
 
 		agg_winobj->readptr = tuplestore_alloc_read_pointer(winstate->buffer,
 															readptr_flags);
-		agg_winobj->markpos = -1;
-		agg_winobj->seekpos = -1;
-
-		/* Also reset the row counters for aggregates */
-		winstate->aggregatedbase = 0;
-		winstate->aggregatedupto = 0;
 	}
 
 	/* create mark and read pointers for each real window function */
-	for (i = 0; i < numfuncs; i++)
+	for (int i = 0; i < numfuncs; i++)
 	{
 		WindowStatePerFunc perfuncstate = &(winstate->perfunc[i]);
 
@@ -1179,8 +1140,6 @@ begin_partition(WindowAggState *winstate)
 															0);
 			winobj->readptr = tuplestore_alloc_read_pointer(winstate->buffer,
 															EXEC_FLAG_BACKWARD);
-			winobj->markpos = -1;
-			winobj->seekpos = -1;
 		}
 	}
 
@@ -1224,6 +1183,88 @@ begin_partition(WindowAggState *winstate)
 		winstate->grouptail_ptr =
 			tuplestore_alloc_read_pointer(winstate->buffer, 0);
 	}
+}
+
+/*
+ * begin_partition
+ * Start buffering rows of the next partition.
+ */
+static void
+begin_partition(WindowAggState *winstate)
+{
+	PlanState  *outerPlan = outerPlanState(winstate);
+	int			numfuncs = winstate->numfuncs;
+
+	winstate->partition_spooled = false;
+	winstate->framehead_valid = false;
+	winstate->frametail_valid = false;
+	winstate->grouptail_valid = false;
+	winstate->spooled_rows = 0;
+	winstate->currentpos = 0;
+	winstate->frameheadpos = 0;
+	winstate->frametailpos = 0;
+	winstate->currentgroup = 0;
+	winstate->frameheadgroup = 0;
+	winstate->frametailgroup = 0;
+	winstate->groupheadpos = 0;
+	winstate->grouptailpos = -1;	/* see update_grouptailpos */
+	ExecClearTuple(winstate->agg_row_slot);
+	if (winstate->framehead_slot)
+		ExecClearTuple(winstate->framehead_slot);
+	if (winstate->frametail_slot)
+		ExecClearTuple(winstate->frametail_slot);
+
+	/*
+	 * If this is the very first partition, we need to fetch the first input
+	 * row to store in first_part_slot.
+	 */
+	if (TupIsNull(winstate->first_part_slot))
+	{
+		TupleTableSlot *outerslot = ExecProcNode(outerPlan);
+
+		if (!TupIsNull(outerslot))
+			ExecCopySlot(winstate->first_part_slot, outerslot);
+		else
+		{
+			/* outer plan is empty, so we have nothing to do */
+			winstate->partition_spooled = true;
+			winstate->more_partitions = false;
+			return;
+		}
+	}
+
+	/* Create new tuplestore if not done already. */
+	if (unlikely(winstate->buffer == NULL))
+		prepare_tuplestore(winstate);
+
+	winstate->next_partition = false;
+
+	if (winstate->numaggs > 0)
+	{
+		WindowObject agg_winobj = winstate->agg_winobj;
+
+		/* reset mark and see positions for aggregate functions */
+		agg_winobj->markpos = -1;
+		agg_winobj->seekpos = -1;
+
+		/* Also reset the row counters for aggregates */
+		winstate->aggregatedbase = 0;
+		winstate->aggregatedupto = 0;
+	}
+
+	/* reset mark and seek positions for each real window function */
+	for (int i = 0; i < numfuncs; i++)
+	{
+		WindowStatePerFunc perfuncstate = &(winstate->perfunc[i]);
+
+		if (!perfuncstate->plain_agg)
+		{
+			WindowObject winobj = perfuncstate->winobj;
+
+			winobj->markpos = -1;
+			winobj->seekpos = -1;
+		}
+	}
 
 	/*
 	 * Store the first tuple into the tuplestore (it's always available now;
@@ -1360,9 +1401,9 @@ release_partition(WindowAggState *winstate)
 	}
 
 	if (winstate->buffer)
-		tuplestore_end(winstate->buffer);
-	winstate->buffer = NULL;
+		tuplestore_clear(winstate->buffer);
 	winstate->partition_spooled = false;
+	winstate->next_partition = true;
 }
 
 /*
@@ -2143,7 +2184,7 @@ ExecWindowAgg(PlanState *pstate)
 	/* We need to loop as the runCondition or qual may filter out tuples */
 	for (;;)
 	{
-		if (winstate->buffer == NULL)
+		if (winstate->next_partition)
 		{
 			/* Initialize for first partition and set current row = 0 */
 			begin_partition(winstate);
@@ -2686,6 +2727,7 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
 	winstate->all_first = true;
 	winstate->partition_spooled = false;
 	winstate->more_partitions = false;
+	winstate->next_partition = true;
 
 	return winstate;
 }
@@ -2700,6 +2742,14 @@ ExecEndWindowAgg(WindowAggState *node)
 	PlanState  *outerPlan;
 	int			i;
 
+	if (node->buffer != NULL)
+	{
+		tuplestore_end(node->buffer);
+
+		/* nullify so that release_partition skips the tuplestore_clear() */
+		node->buffer = NULL;
+	}
+
 	release_partition(node);
 
 	for (i = 0; i < node->numaggs; i++)
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index 87f1519ec6..e425b1b391 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -2647,6 +2647,7 @@ typedef struct WindowAggState
 	bool		all_first;		/* true if the scan is starting */
 	bool		partition_spooled;	/* true if all tuples in current partition
 									 * have been spooled into tuplestore */
+	bool		next_partition; /* true if begin_partition needs to be called */
 	bool		more_partitions;	/* true if there's more partitions after
 									 * this one */
 	bool		framehead_valid;	/* true if frameheadpos is known up to
-- 
2.34.1

appleM2_windowagg.pngimage/png; name=appleM2_windowagg.pngDownload
amd7945hx_windowagg.pngimage/png; name=amd7945hx_windowagg.pngDownload
�PNG


IHDR6T
�sRGB���gAMA���a	pHYs�����e��IDATx^���\u�7���� �.�#M��t)�AEE)b�)��� 6��4� ��.�C�!	!=���97w���	���f�<��qn���;��~��_]�P����5K�	�<�&P��@�l5m���M��
>\�	����)�i���b�y�M��	6��'�j�`�y�M��	6��'�j�`�y�M���1B�	�����6���b�y��;o�5NQ��$�@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	����)�i�N��[o����;vl�$b��V����;�w�^.�9O>�d���/�>2`��8��c���/��MK�9������n�E]�?�x9�z��3O���'�Zj�Xe�Ub�V���{�kg��#G�Yg�|�A�����f��j�����544��!C�����W_}5��S,���g,��B��k�z��W<���+��"�?���k�8��b�%�,��X>W���s�3:on��������o��_�������Z\x��M��e�]6���o����q����k���+���u�Y'��c�6���9��M`�������0��w�}���u>���"�i��^z�c���d������#�<R�������n����]��/���vZ�{����SOM5��I����_��?��O<1�����0aB�v�x�������/B��6lX���%���7�8����%S��<��y�<yr\s�5MB�\0���/
5�Vl�M�Aj5��3���2�y�������2h{������W__<�@�����fIH;;��q�������/�N_���}����4_�k��6F�].�y��q>M2��l��b���/�L}�2�|����%����������;���/G�~��%���/�(�:U����{o����#z��U�W)��V_}�6�]}�����'�(���j�UW]�V�"+Io������^�h���l�[]�����me�~z�����a�9�V���b3����o�J����q[zL�t��Y]q9h���q��v��e�����<u���xw�a���o���/^�w�yg�s>j��x��g���-wf�q�E�jy.����E����s8�����+��b�:�������K/K,�D�sY����/�s3>�Z#���zhZ���~��]�qem�J6_�l����|��F��^ziL�8����t�-����Z�IE(�'1�&0[��\|�����2�[y����)e���>�������)���|�+��~mq��w�������ff����;Y��U{����^(�+2�����Ui�[�qg�����w^��b���������]v�e�k[���~6��s�6�2mi�43clf�����X�0���������5���������}u���������'>�9������&��������m~��9�V��l�������\�B-TT�e��2Dy�����6�"C�y�����P���h�Z��
m�X�!��EY�	��~����"C�Z3@�����%�\2-$�������R�k�vu���el�h���c�=b�e�)�L
����rn���u�u�},��Yy�<�+�B��U��&������C���{,���5���i����@�6��"�����g>S��j�"����������_���x��7�v�3+��
g�6�Ya���Mk�{��/|�I����G)�:_X�_}��/+m���$��$�w����Z�f`���;Ok#�?7�|���-3X���{��={�lu[���w�G3���}�d���[�dE����f86j��Y�Y�������N�B��#�:]Q9FbEUY��Uy9�dEF�V���ASu�m8�x��r��^z��i!Ve|���!`�OX��7���fW�f������6�9>����2����\l���j�������"���gFVfK�|����h����Zf�W	V�X��|e��du�p������[�~��8['�s�*�u�?
�V�M�����+�+�R�R���]�"/e������[n�&�h3���.��c<>��S�\l�mng��0�������o7i��YF�7�t��p+�?t�(�[������P���[�w�2����m�������L��3�l���8�����O�%�?W��������*��sL��J����}��h+�&���}���8qb9��j�M�2���{�����_,��.���fEYu+�O��{��;��SL7�,��2�z���y�LN�v�mMZ��cZc�5���5o/�����S��<4�g$����:m��"���w������0aB�j�����V����qP�9�����U@�y����~���d��w���=
t>�&����2�0+2\�j��l��Zk�sUW���rf���/�0��/���� ;ZV.V?o)+a���:Z>���s��-��r�+Y���������H���ck����j�Xb�%������z���:�� ����oq�q��O��8��#���E����-B��	�kM��;��c���<�����#�W���6��Q/@k	6�N��[u����C�l[9`��r.b��!��k������&����
��)C����-@;+���9�5+ao��%_�����'���<8�������_>�_�b��2����%n��^xa��x��������y�~��q��'�W\QT|vE�
x��7n�V��W^����>n���&�����k��f9�>�M��d����O>2Y{���j�j�6�: ����
������ *�OR���y�����ou�?���s<�����l����������>���g�8��0�����nZ{��}��;����nf������������!x��8��s������v��6+���p����&_Z����o�}��=�@�1bD��s�����*2��g?�$$������=����&+H?Iu�Fk��f�n��<GY���f��|��EY�����Z���*�����f$����Y��3�L����q"[�Xg������*�S����#�<2~��-z3P����%�\R����^��m[o'�x�,	S����/}i�c�f����q5�YI�	t��������*��,���������~�
���nG�aZ>����@��
�J+���J�Y%�sl,�6 l������6�p�VW�e��k�2�lm��<r����:����]e�Ub�
6(��#C����4p��������.���8�Y��a���n?���c�-�(���]���5-�kM�_��?V���A.o�K�!�:E�9�`E�!Y�9�0,����~y��"Pj���h������������[o����vz2��H����Z3[�6����������k>�r1C�[o�������M7���
+���j)�k�<v�G�g%f�N���wc�V��9���v�m[m�U�m�x���<���]v�"������*9�C�	t���0e5f�B3����U�����C�����v��>���/[��J��%C������b����3��Y�Y��f�b�e�^+��3�|��G�%�,��V���f�mf��7�\s�tfu�1�?��O�TOO>��7��I5���!;����:����������yo�w����i�qEV�^}���hh/�&�)r���*�?��k��.�yV�L4#�mG��/��R97�1�J������
����l���{.F�Y�E1Veu�eke����o��r1C�SN9%����x�������{���7���������+^����>/Z�a��7�X��)[�f�W2]o�����2����:#K.�d����m�����E���P7��V�V��YA�	t�l��UEV�e5�'���O���Z��mE:=���2$��S�}��w�)���Ah����P����Q��e\-_�|�fV�9�d�wYnf�w����Yg�'�xb��7�)�>��X�U�{��W�p._���9����O��J�w�q����U��3�!nk��Z��o���e���2���`Vl.����~���s�9'�8��O�e@U-����/�sm��mV������
m����t��	���J��s�^��n'��Y	�V4f����Z<����[����q��c:f�jE����"����3�m��vW���:�7��,Y�|���6i�����7�����]u�P��6����c�=�b�����dp����j��6+A�5oC������65������'��m�l�Zf��9�c{d ���>~��_�v�mW�������u�m�������4v�}�"m������S�h9�c�|�1%�\s�b������������[o-���|���v�Xz�����2v���EegW�Fj�`�PY������s������b���h��6c�0�mh3,l�8�-su`��S[���F���Ao�v����k�_�������N:)N;��b�����gE��5��Ve����6���1�����?o��r;��c�v�y�3�<��6O>�d�v�hi|�� [��s�=��T���n���j�t����Ggz��w��/7s.�&��^x��&�@��{��g|��_m�m��vkR���a�WX��OjG���������ZV�VW��%�\rZ����mo�[�f�k�9;�����f�>�C>�����2hk��U������������n����rI�RK-�o���`9����\`�������w�Y��h�&�a2|���j���Nq[k��Z}�V�+��by��r����I8�v��n���_.����L�U�Z�:h�`�:����������jv�Rm^9����/\�u�K.����<���7��MQ�832H�n���tk9����+���x��x���y�p�;������)C�������f�`�0��\S�t]i��������k�]����/��b9�6���f�f�MV��j�
m�L��{o�Ud�fGV.�s���e���������/Z�{���������g��w�m�6v�E)^��������e���}��G�Zu��i�6�+v�?�������<���MZ���j5����;�����-+4��j��b�%�E�-�������7��k�����5@s�M�Cd��#�Lk��2kkK�~r�����3Na�v�ff�Y:e��ZjC�R��A��>�����D5��=!j�Y���[3���k�������{��i������*M~����V�3s�V���?y���E�v��4�}��o��V��}�qg}��rnj�m��*[�f+�|�+r,�
6�����|m6�x�Xf�e�%Se����s6��c2f���:���5�����Y%��0iz���f���K��i{��������z��MB�e�]�x�e��	�X��z�:�YY�X����,n���?��sO97�nl�CV�V���|��EP;#���+�h��w���nWP��r\�K/��I5jV�n��v�����$����D��9s��<.��l"+
�]lEa�/�|9�6Y���a+2L�����of5oG����w)[�N��fg������3�������*��g�aGUk�����"�|n��yk��|���������*��������YU�cS��|o���M��|��W��7������s}nW�����n���_[�yw�M75W3�/~��1�|��Kf,�?�:��*�x������f�`��2�� �:p�q*�BeK�l
[-�B�:��2P�nG��=+#SG���/+�ft�����N�#�<2�;���ek����k�V�Lm�mc�[
g�YJ�EV)V�_�����q���s�=WTqfU��>���u����r\��W_���]r�/|�MB�g�}6N;���*1��=�>C�SN9�X_�!�.����s�V�w�}MZ��7s��V+�Z'[����=��3��f�`���}��2dH97u�C���������MZ`fUh�x�mQ���"�Zk��amh3��j��r��������
�w���N�(�J���L�j�z|����7���s_��g�����O,���/��t+!y��A�����a�Mk�c��/O�����-��������#���pu;�5w�y���J������Z���	9^f��Y���F�N;��SQ]\���������O&�f����n������K.Y��OV���*2 ��:x�Y������d%]��}c�v����M����Au�������[��Vl��F���'��iV�������/}i����8�����KrF[l�������g:$�9��������w��._�����l�[��7����~����M`���"��j9�fkC�O��i>V�������������m�J���<g��2�\|��c��7�C=4�:���l��f�����y��#����������B5	���6�����>q��G�kk-����+_>�|���Ug���g��AT���,�H���d+��2+6+���q5��g��l!\-������T�LO���x�_@MS�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@��k����T8���1�����_����.��a���g{�K��Q�?%��08����\2��
}��������5?�+^8<'�Q.�����Bt_�����K����Wn���2���/��:���c��������r	t�&�����'�_��X�u�S��+�[�{9S���)1n���\�����=�Y���v��w,X�t���������:��o??���r��|w��b�U�(��chE|���D}9���ir9w�5�T�������������{ox�������b�-{��G\x��1b��r���8qb\{�����=V\q�������m��V���a����g��n�m���_���//��b����-�N{��g\u�U1v��r��y��gc��7�+�����=��\Nu����1��������q����#�<R����o��~���t�M�������x��7�-Z����=��j������b�����_~�\�1��>Mm}���<��<����=�|����o���������#�T����������3�<S������*_����1���m}�T��c�9f��%���w�[���3�3��>U�}��x����@���=����*���z����c��W�5�X�\:�x�-�q��r�������{�[���Z�q���?��\��z���|���������?��S����/�4u��O���{���%�0�����z�\����I'�;��s����K�����?��O����.F�].���;�'�pB,���������3 ��i��v+����w/���:��d�M���9{��fx��������\��}���*�����\:s����8��#Z�]v�"���?_.�H{����_���$��t�����#��}�����y��&�\sM����>��\���|>t��=?.{��r��,?p���mS���>������rJ���<?2�/��tn}���>���kif>j��Mf�	&�=��b�O�����)j.����}^t����W{��Wq�5�c��df�����������*�����Zq����V\��u��Os���E��?�]v)�Q�q=��s�������{������r�-����H\���Bk���EP������c�H^���B����w�y�<2��>?�����X��g�}v�p�
�3'��<~/��}���B,���/�����-Gsm=���~i.C�C9���wVj�����q{���~���q}���/��|�C�������������g����=��S�����.��<?��8����������x��������x{��Q|�&���|�{��7<�_����<Y7�kl0K��8�����^Q����c��w/���Rd�%��������6��u�]W3+/��_��\����f�e����[��'�\���o��V��TyQ;/,�v�{l,��R�����_��?(*���n���4iR�����]vYQ���`Ya��S�n�b����_�����������/���|n�0/S{��c�y~f�V����z�v(��<2�����Z'?����a���.��Zh�b]�u�Q�����]����y�T�c������{�\�q��>m�s���)����]I���_��,��������gl��q�q�Q�7/��B�'�-�T��q���<����]�Si������GE�<�o�y�[p���i{������7���2s�����������R�������~�XP���L����k�����6��\�������k�m����������bqs�,��w�}���O�K�>�;�����~��������v�m�/�|<��������k�#�����d�Mb��7..W[f�e�0,��M���#/H��W\qE���C��\���7_�<O���6��W_}5�Z.m�W��;�,B�l	���c���\��nup�����������P%�T2��g>S�m�U�s!��f�=���<�m}���
Y���3o>����v�Y�����K�R:[��
�
6��x�w���\3U���:�|�f��vv�O��~�j��r����[��o�o�������O�	t�M��,/�f���[o=��Y~�?/��E�=��3n���hh�:v�'�o.����lW������-���;o��B�a�G�������>;��S�j/��U���F-[��l����t�;��cl����6���j��6cK�CV��vYI���J"O�.YW]������S<����w�[��U����.���bYV�d+�|�+�R��S����O<QLg��<�H�,��l?Y�Y���~��//��y��EY$VXa��"�+��R.����[T����J1�|��K?��+a��O>Yl[-����Ig�yf��6���������yN�g��>�^�u�yq��w�u_��W��K/->s[����g�'�0#�<��^z�riS�<�W�AV���k���"�#<����1)/����g�}�O�>��Y�=���>��y����*�|<-�6)���|��4Yi�����������>��w�?�@/���U��_~y1�wK���N��}���K>��-�\,������riS�z����{�s]�`��d%@������)/�g`r��W�����[���e8����%�s���"����rL�laV-�v<����h�rq./��8O��,����2H�}�O=�T���>(��|��N��"+	2��q�����cy�T=C����jE�H^��xc�����T������cmf�TV���|M3�J�NO%P�`>�%��Q���%�\r�D^��T�euU����?/�g���/����8��O�Y�������Ye�c��������P���ynguUV$}���z���!����,�s#�����:2C����!���k���"�
��8����yj���OS[���<Ob��|��T��mI�������>��~�s�+�����//��5������/|���%y�����g?������f���=���������s�t�/��r�|��@W!��Y]r��G��2��2/�|�����!s������\��S��>/�V_���~f���E@VSfx�_�>�sy9�S�: �3<���[�cW~V�r:�������]4��2C���Jy��9?��������������;V?�����m���[b��1�f�_V�}�+_�Xk5Z/�����@�%��.����^�+3�������l�������]�x<����-��N�W��|d�����g�bYsy��r<���?3+�S�1��K��r>�X��E�|��hf���p3?WZjw��c��~{qNd@2���)+��<�/VT�J������f$+�R�������>wS{����_*���o��vV���ij�s���iF�\��[� ��>�w=+�g������_��m��`F���?��p������1bf[����i{�/�$?'�g���:��0t�%�M����;�/~��Xb�%��tYy����E�l��aaL�>������>/fU*Rn��7��5�[l1�� �s��C)�����q������-�r��o}�[�~V�r�G?�Q�oV�v<��f��5c�YyY�+��(d(���%�f���euBV�v�����<G���y;�|�2�L9���������6eK����!}�w3AkdP���������y�?���hI���Y���o~��Xc�5����Z#;���.���q�O�_�P�/zM����g������3=���lO��/~1\|�����u,���s����_&�d�e��&@
������l=V�&~����Ze}~�?C���,� */�M���ra/+	*�@��-���������S�BX��kmeJ���B��y����++]�"f^�������1����_~�i�h�[�������2nXK2o^%�c�����l�����}**�43+C��������y���E�/YTB��L��dz��"C��3C��*�g�R�5��s�����9�r�������?,�eh�|]�x��y���9���)?3s��<��K;��zz!:3'��PiG�-�+�YSV�h�5�/8L�";�t���!��>��S�t�h���>���M�5#������@k[���&@
��6`3�&�2.X���q���Z^���y��rJv�a��j�V.&fe�.��R\���3���Z�����^;�S+�/�0�5nE��������lP\��p�:��j���E]e���d�-���pn��?��x�����lf��l���#m1�3�_h���>�y�����M�1{S~vT����U
g���E~F�>Y!�m��������i��S{����_f������w������C�s3�n��
�Y+����"�d��;��K�Vd��4��0�v���5����]�������l���1f&(�]��Y���26i��.��5�;�����D�	PC���SN�9v\V5d����1�T��0�8���U���6����V���qdN���������sf��J�B�C��j�}���r��)+����c���-�3�� ���6�s��<���{�����t��m�����"��'�\3�D}��g�uy���-��Y9����9S~b��6+����R��_����D*_���>��~��YQ��m�-�A�����i������6ol�i��g�����N;�X�AI�u����"��|�s,����%[������m}��7�����e�{<�]3�/|��������z=?/����
�]w�����oO�
j����Z��RW��&���9A�N�����@W#�������sNQ�t�e��bTy���3��o��X����������{�m��n�"��c\��E;��6t��r���,[g��W^y�X��-y�>����p���oV�V_��$y��T�}mI�����.Z\)���&L���ma�\WiA�c��������j���#G����^<>����3��Q]����e�e"3;�a~���8Rgf�@V����m���"���s7���k���=����o�/7dX�|]V�U��}������)������fq~����B�����U���?U���_z����A�����,�Ll�����O<����3����y�T�}�=��"������N(��Y�y����Ry0[��E����/E�C�_���l�UW-.��H^D�m/���"�<xpq!,/��t^�m�J���}������3���W.�u��,�)�nG��,9�1��}m�|�+AG��_�7�t�_���Fd���y��w���X��S�7�-�3�>|x�����mSe���F�����ez�s��s�o��Yd�"��TtU���rn���y�E��<������[~) ���@���[�
>F�U7�����s����2���}������)������������>��#��7�n��%����5��{~�!��0���V��E�;D�������������5����y�T�;6N?��8������">���~����RY�����~��R��X�=�\9��#1�[�����2]k���J���LR��}��K/]\l����<kS�S���e;�o0�*�2�n��������~xq��%�</����i��x\������+��'�|�������1�t��Zi�\>��������+��������4����zZ}���m�������|=��Y)��G.�@�Z��?��O���Osz��O��hl��r,����s3GK�":?��f%$Im=���~�]��>m�s���)������E T	��������xN�����������|�V�
������*!as��W*#��_3�%���>m��%���z ��������T������*������yY��\^��J���� ���_��6=�mK���Z������|qa2��k��`^|��t��v���?�x�t��,�3��-��R�Y����eRg����k�\�ow�qGq��:xf�����]r>����8���m�BsE^���������|y��1�q�^��-y�9��n������=�aI���O>>jG�cy��yq��7�G���C����[��\sM��|~�"��S�L�F����j3��6������c�9��_�b:���k��evi���=�q{��l��af���������/g�{��;�,������M�d7�<7�s �
���}�oV����U����f���=��||W]u���Y����c�te�%�)U����K�\����v���e�V[mU\��y�.[�����+�,Z����l_Zig��*�"�:�������oqa-/��v�iE[�����������E��l#��F�h��*O���QGU�����,������;���r��HV�d0���sh�=������UV����4/��-��<Wr]���P�@++�r�_��WE��<�����b�>���<�}���T[eUL��y^����yV�������/+b*m����+���;�x
3iz����q���Y����v��P�[����*��H��#�����1=����[�D���������\���s�:\h���������n��c������}������S7�������@-�(�6�-�f4�"mS	�j6o���������>����W\Q������W���2rf���i[�//��BQ����8�������JR�ZT7�C�
@�����+�u|��.���n3kZ������EA~�yA[����xv�%���}���-Z�����>-/�f���UKLU*_���zy�����v��^xa�_E^>��c�q����Y%��_���(��l���2��\���������^����]��������3��s��o97�������E@��A^,]r�%��M����Z�����9�c����>m�+/BgH�c��$���@�R����s����I�����N��w��I����y��W�o��;�X<������<����m3��U
�^
O}���X=6}/���gf~�d0�@^B4��C�]w]q������s,��4o������|l�����HV�7����=���^~��"I��{n��;B[�����q[���~���s�,��������G���^����8�\:�o���s�Vt�o����������|�+�W�'�
���-��������_����E�����U����p��>��h}�����Zi����������@������!C����[����>���pXt�E��iy8���������1�J)[��xU9���g��v�m���l+��i��������@����V\q��Z ������
�-���x,y�-�2��p2+�2�H����o�8��cb��Vkr�����*��]���/�$k��K�1qb9�qz�����Z��g�|�s��g3+K���^�Z^x��6���S~�|-+�H��y��'������x����y��9��R���~qn�1�?a��{����6h���������c�s1�G��o�o-]�*�l�������NY��m�3��c�F^��/d���cV����1�D�{-��Z��~2��Bg�{8��l��c���1�v��,?��5����l<��C��s�YYm��v��S��/���g\K�f�=�_{�/����|�%C����������>Mm}���<e����[�}�<�Z
Ug�{�~4��R9�q�50v_n�rn���9��5_��:�c�kV�k����(�����{$�������qf������_&L�P����A�U��*Tl�*]�b�O��^�����P�	L���b*\�<�&P����J��Z�kV���������PNu�����)h�����V��C��f����T���s~s6�&����&?����w�=>����������T����:�g�]�9h��A�F�B_)�:N�eO�����k+����x9�q�_u�r
:N]��4�������g'�s�V��u��:=�w�r43���c���s�V�b��v/�`�j|���8��rn���~���e9t���'��/��'�Kf����0���h9G�	�<�h��'�j�`�y�M��	6��'�j�`�y�M��	6��'�j�`�y�M��	6��'�j�`�y�M��	6��'�j�`�y�M��	6��'�j�`�y�M��	6��'�j�`�y�M��	6��'�j�`�y�M��	6��W�8E9
P�O����kR������|�Wl�F�b��4����O�>9zMY��z=�������"~v��x����v�v������U�M5fBc������
���y���?�;W,:��]ls�S����&��v��/�=�|hR���Iq��������t|h�K�x���8��	��=�K��,���wF6���l�z����^.���q���K������W���DI�1oo�����]�{Q���
�c�^c�7��Q������e��1w��Xs�v,�#|��U���g�c�y�b�����i����1��UW.h�`��l+{��z�s/��=������ECccLnV��U�C?l�Q����`Lc��T}��6+<��`l������b����W�w>W_���`��W�6�y�L�]�����w�Ev�=<)�Nl�W�k�+�L������w���W�x�f��.�X�G������#�)*?������@�l�)�&0]ok����P����S����=��m{��6���G�s|,��.��[��|�R6�7o|��.�emKP?��W��p���3���1�S��7[nk���@���n��5!�[�{��^QW�M.1�[�@��������7wL��Xy��'��49��o�j=hK7<Q����jO�j��.`���q�)���k�uuu���K���w_44dt4}-�{������>��3n�9d��8���b��V*���N8!^��r�����2����Y���R��{[6
5��?�1��&�;#b�5�Vt�lQ{�#�b����y>�9������N=������G'�_������?>)��Zu��[�s���OJ���2������?�x��#����#�8�	���S.����?����s�=����7�|q�Yg��{�Y����y�����|�8Fs+��b����M7��\�zu\f����>~��	��G�z����*�v��x����Ku��o�+���$ny�>�z��8��}b���_9v���>.���Wl�z��O����kR������m�+6]i�U���I�Y��|���g�}���n��~��EU�g>��?~|\{��q��������0p���*��j��q���e�]�d�Q�F��������/�x\r�%��k�{M��_����@4FVx.��"���o�9���c�-��������b��{}��:.�~�9E9M��P��C����E��AdVW���3VYe�X`��`2�m���1�\S+��u�]�{l���Ee�K,Ql��w��h���6����?�����f�E��S[��/�0�?������]��������o�y����+�(���}�s��O�Q�`�`��5i���~�-��w�1\p�b�����k��f������;��K#��7�xc1������/\LW����X���+��w�]TLV6,n���"l�6���3O�f�������;���#G�kf�����A�Y��*3�������
��ddCCC9����{/�|�����g?��riSY���������/��B�4���^+��\}��c���+�6��s}n���FG�9�`���P����*���Z�*+��1��fK�����\�T���T�VWl���9���������Me��y���������3�Q�`� ��b�B��7����?>;��Xj������f����F�*��l���o�riS9g�EmuudV{�A�E�^����r�J����5:����]�=����w�%�\2�=��b��+��"6�t�r�tlv!C�)��������C�����hM[1l��rj�U*+g��:.s����D��6~�����Gt��-^~��8���o�[�����.��6���.+;7�x��v�m�����%����c����;.�>��bYn���=<��8����O�>��j���+���;/�����{�]����:ns9��[o�U���.�l9�1Tlv!9e%�\~�������o�������?c��	�����b������b�m���7����\t�E��'��=��#[l�i������;�G��������[,�o�}����:+���W,�6b��b���^w�qG������67v��r
��4��s�SC���U������q�����+�X�b�6�o��f\~����k�[d���q��o����z�����	E�B�k_�Z:t��o�����A+�����fv�u��[n��\�qC�)�_|�Xp���y���8_|��x��'�e�e�������n+��B�4��1�?��#�����K�z����{�-����5:����5*Ku��A`Vb�3�\��w�}7.���bz��6�����}��)����/�8�y��b����>����"���t��.�D4���5jT����������`�
���O�Q�`����S����=z�^Vk�z��1q��Xu�U��)'O�\�9F�����"�<��cc���+��������^*�lM��Zk����`�7��M�����EY$N<��Xr�%��"����}|��b������z�s�~��8�������+~��GYT�V;�����>�����~����Rn�q���y�!x�>^x�a��^~�1z����s��?
����Y���������C-Z��$+3�<��X~���%y��g�[��V<�����dz�Yg��{�Y����q���o|����mn���?���nZ.�H��sLl����X�Y�Y���e���������1j|�L,�P�8b�����{��$5,��v�-����"0����U��m�]^y��-��i��W.*:O>��i�����rH�}���
5�f�m��~{�f���>��7�����������{
q��:%�L/��G_6>|�h��M�E��vB\�x}9�y~�M��e����T*6�����r�s=�fC9����>���G��s1l��c�g��b]c��}����6���|>F��h6�X��	G�4�������&�o�M��a_���&^�\�66�}8n�sO�o�s�_~1F�������c������c/����q��7�����y��{�������s��3~3e��������N�
��u�c�U��g�-������b���+~��{�����0��r`vl5����D)�/{|f�����S>��E�V���,�c�L]����c���KE]����F�E����8qB��������/=V^�\���	����_-��?��zD���M~��r`vl5eT�J�^��0������3w1�0��h?.�/�D1�}��D���c�����{���,;m�����b�uW�\��u=>>�g�
7�>;�QLg{�	w���=����@My�����Y�����O���l=�Y�X�{����*k��o}�gs�{����80���X_1��;�n�>�s���%-�q9��n�{�_c�o}7����\�N�M�K�P����+����k�i���K����Z1~����=�X;F����z�"�������{���v�3R��y��1����Q'��|�\�N�M��eH9���D�y�����lZ+��qcc����\_�%��7�X�����y;��*&=�hD����������p�1�����t��7�,����W^�����@MY�_��9�����RTh�=��&�c�8�=>�\L��?�8f���1��m�6=�n���6���������Q��_��������9S���1���������4��'+��}������U�8E9
0��'�)�:���u��~�O91���b��.B�j=W]3������}��1����~r�Xa�����}���M|��s�Y1��?D���/�U�:�������O�)�3���c����GF��������\�50;	6���`s�����_��8���G+Z���?�w-��l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	����)�i�i�<iL9��VX�[��_�r����_�	7�'&>�DDC}�t����
1��[G�u�/��@�	�����1�c/����x���>���W�0�iE������P3M������0�	6����gg�����r
���@�+���
��_9�n�M����������f7�&P�F~PNs*�&P��@�l5O�	�<�&P��@����J�0�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5O�	�<�&P��@�l5��q�r��3fL<��������|PL��W_=Zh�Xg�ub�W�>}������Ic������������wG�o���\9�����r
���L�9n���������c�r�-1j��rM����[n�ex����[D����5@k6�l@m��`s��	1x��8��S���*�FQ���RK��k��
*�
6,{��x�����^+����[/~�����;�(��VlN%���P��f>�)�=��"��s��w��v�-�Zk�0`@��������Gy$.���������6��_�����[-lN%�������)���q�����[o���n\t�E���O�����|��gj�-��s�m��?��������_�����3�?�����t
5l�92n���8������n��}�k1�<��kg^������F�w�}����>�����g]CM���j����G��}�%�����c����=z�K�����J+Z�
5Y���cK���I���3�+�-����&���L�<9�?���y������/�s�.l~������������6������s�=wq�]&����l��f����?<K����.lv��=:�����~���u�Qq�=����Cc��a���1"��]Q]c)}��r����n��\�:�n�m\t�E1h��r	�[�4���\+,�-���O97�������+�:�7?XN�S�c��t���l';r���n+��[�0`@q�����Tl@m�2i_���;o�Rvfn��P�6�P��l�9f���������N�]w�5���o��#b������+�Zn	tu].������/�8�Yg��b�-��#�,��7�x�3o�^{ml��&q��w�{]Y�
63���o_����������Z+���o��+�\n1a��9rd����E2�\tU]*����{����}����1x��x����7��M,������;o\p����}/�������[�5@W�e����'���_o��v}����;D�n-?�~�����,�H<��C1n��r
�u�`��?�'�x"6�|�bl�O���|&V]u�����c��@W�e�����b����{�O�����w/�������z��\0�y��x�����������O�t]]&����o���
�����e�]VToNO�����Ul����@��e������y��c��W��N;-�:��x�����7n\\x��q��'�RK-�m�]�/�uu�`3����E��N=��Xt�Ec�M6��z�����E����|�����N�u�Y����.lf��W������z��W,{��gc�������o��^{-V\q�����{���jM��k����Rr���~:~��x����e������_������W�h�-OSNu��������j�A�F���s�k��,�������������c�y��n��Tq*�v����P�L�7l���n���[N��f����/��1b��r)�}j�'L�P����f[�f(���3�z��b~��q�|��W�}�4mU��#�<�]vY���q������5@khE;�V�Pjz�����:��g�5jT�d�����8 ����%@k6�l@m��`s��1q�%�����?����w��6�(�_����S�q:�`s*�&���6�
6,��{�b���.�A��@�lN%����eJ������/�[Ns�.l�;6.�������d�������.��RT{]W�	6��7�(n9�I������_�����K���f���4iR�����1c���7j��8����#�<2���WLO�=����zjl�������=��w�r
������Pj6�L�v��(�����N�#�8"�w�^.ZC�9�`jCM�C����:*�RTp>�����5�\3z��YLOO��a�b�}��y���\
��`s*�&���6�
6,��{�b���.�A��@�lN%�������y�{��]v����40��2�f��}����nq�i���q��1���G���������7���C��
S�?
/��,
�4#�q������b��k��G�*��lf��9A�	6������N�r�-q��������G���'��O?&L(�h�n�-�J��E�3�E�^"zl�Vt��CS�
���.V7������n�8nH�����9U_,O������}4~pOD�y"&�k>nf��9E�63�|��Gc��w�EY$��j�8��C�_��WfN�<9�8���c�=��_,�h��=���'�=��'G�E�>e�����ZD��"�G���+zl<$��yeD���eu�>=6z%��}c��+�K[63����K�j^z�����[�����e+��r�7�|�t;vl2�X����4�Z��9�cF�SSe��}��F�_��`���c���~kN�:L�
6�|��8���b��I��_�:F�w�uW���z��
���;/v�a�������m�8vl9��������p�n�C��@G�2�fVk^s�5��������vX����\��RK-�rH�����s�����Y��!��A4��3��t^���t��(]&����������_�_����\��lQ��:��k�����+��S����*��Ot_��Q7p�r���L�Y__�F���N�R�Z����[����P.h��!'F�[�����,
5?�7���N[�������\�g���/��n8<^�V�6b������F�w�����+�+��?���b���q�x-yk�{��k�S�r��5���#t�`�G�Ek�7G������Mn����3�n����������������,�o�9�v[�h|��r��i|��hx���IC�%3�8��<��>�������v�0�{P����1�~|���kq���wV�J���Kc�Uv/�sy:g����#���)n�}�f���?�u�Mj���=�����7���������o�t�.l���7�_~����{��o,����\w�]w��>�/��j;��*�^4�o�L��rR��F�B{�M�}�;���)������Z������oD���%S��m3i\|0���e��b�����q����1�����>��b�l��7��u��������#^)�g�������}�+n9��Z����Q�89���,��N�e������v�m�,�H�x��q�E��	���P���n���:����r�-�}>M�������������
�'�!���X��5O��v�>�N��������(�r����>C�
/n9�����u�e����_������W��q<3��r-t�.l�
7�0~���k�����O����q�������^�N?���y���03�9��#c��6+���������O����^���
����������.��[�b���e��>+�\�mj�K��Kmo�����b}�S9?���+�������+��?�q�y��1�|����?��_��g�-nY�9x���R������>������5��>{e�t�o���,���������57�aR����1�w��e���t��e-m������u�E�Y����:GL/�|��:^�
6S�������~d^x����o~3��f����^{����O?�tQ���O�r/�O���z8�{��8j����\�l�%b��������I
�1q���Q�=�7"^�z���6EP��m��(��J������<�z[9�G�6+\p�"��p��n(n_|qx����KD]]��>-�}��8��?���~76\d�r�T+��L|0aT\7����89nz����P�Z>����50�{����l��7NY?���b�����4i5�����!�Y,����b�)�f�Z�,u�S���ly��r�s��p�8g����#�7�_x���\��`9U{~x�	q�;�-�>r�z��]���������>�As
����Vl��F�6��z+~���������X%�^��b����{*�}��8n��c�W���'�9O^��tCLl�K�[,~��b���+����e����{/n����������^*�������f��&�l���/�m#�����M��t�`s��Qq�)��g�QL�d������;.8��bLN`�	6�l@m�R���1c��#����>��_��c����~�����
��o�9{��b>��;,z��Q��'��J�	��K�W^ye�������+�o���~���[�n�����������1|������b�-�,��%��J�	��i*X�����rKQ�y����;���P3��/~��q�	'�j�����8qb����L��mh_~��Xg�ub���+�����.���/���o�<��t����.lf%f�����={�K��w���
���L����X{�������W_}�\:}���z���+��*��k����q�r��=�����o}+^x�8���b��+�45|�����~7�xc\~�������k�����1�T�Za�nq�~}���F�o���\9�����r����#���<�\2�������N��\.�9WM�&L��{,��_.��#�<��vZ�;��q���v�m.�`������|�=s��3���6�(P��ZO�9UK�f��D�s���1/�K:V�bF���,�`�T����a�b����n��\�v�n�m\t�E1h��r	����Z
6'��j�����?-��<���9OM�#F��#�8�'���\r�i�@�	6�jlf�����Z�u�[N*�`�����:�`s���f��?���W�u��<us�X������3�q�K��lP?{�f��M��1��r�LZ�-��v����}�{�����\����Q��r�#/~�Z\�������F�Kg������}.�\���������yTltaw��P|�����Wo��P3���~���g����&���~����T��?�]���^�Q;�ep�������]�K�VNu�����3	6��'�j^�6�{��x��g����\��+��7���������q�����q���@W���������_�+��r����������|��8���o�[�5*�|�������~x�3�����T�����7�=��>|x�92&N�X,�������n�5�\3.�������������/���.lN�<9����x�����SN)B��fz��b�}��7��s��k�����N+�]{���P�k�2����cc��!E%�.��=z�(��x��zv�E��6�,��������Z���:��/hG]\�	6��2C��^8���ri��������j,��������{������\�5e0{����o���/��
6���\:th�U�r}n���k�-���q������>����V-� �����VZ��7�O8��x����-������W�c3eK�JP���<PL����Ek����G��Q����n����9���?�n�mp��X��;�;��?�yl��&q��w���}w�u�b��{�X��|O?���x����K/�n����n�������W'���G�l��t�'������e�y��'�]v�x�����W_-�}�������������������**9WXa�b��(�-3����{b�w�|0&M�T��Y����~��8��x�����1bD�����/�\�#G����;�8N�g�������Eq��?<�z���9���:�X��_�2�|��r��������e�����+��r�x������������?��_��c���*B�a����^GuT����w�xv5�����[���������
���_�������TT�<��k��n�-.����a����e�Y�h���l3,�04��^t�EE���|����"����]�9~i���N;�X�����Zu\�]�Gk�d���o�1v�m�"������.������rH����E�����/��j�r��%��������i��b��+��-��B���)���WL�}>G)[�����2��+��r�32,��`���n*��=���c��9��s�w�QT��FG�9C�
63������??v�e��k������.���w��1���������z����b��	E���D�����o�r�#���^�b6+!?����K�Z|��c�UW-��f[�����b����[�\�T.���]n�u\�]*�LTfEf�+�����6���5e���N:)����b\�:���\���_�!���;�K������F��{����{1���9>�g>��"�mI>7.�`1]]�9|��b~�E���K��v���;o1�g�s�u\�].��$9gVo�	�����//�7�x�ic��5�3m��3��TiQ[]���i��A��4������o��������Sl�)����������o�KZ�&��a���v�mWT^�}�W/��[e�O�5�<��8�����D���m\+���V*+g��:.s������d0���{�
7��n�m\t�E�����Q�?[�~d��5�8��Xs�5��s��
6��\;�=��S����������c�9&�;��8����e������8�����O�>}����7.9��8������G��|��:ns9��[o�U��G��R9���?>�`H97��g����z9��^?��rj�%���M�W9��^������������EC�/�:��l�X��cV��96r�o�mw}}}1�tel�j��<����\�c��c���"���Z��z�����Kfl��������s�&+6��w���������/�s�z���*����;����5�R��.�X�	@���/��21�|�Mw,�=z�j����)��?*r�E]t��f�l��M�q�5Y���=���E�cVcn��6q��g���/_�m��'��=��#[l��R2/N7�U8�vX�����k1Ng���������>q�Yg�C��1�X����w��n�i�f�:����;����v����hXn�����4pw�w������5�5��SS�x�G�����s�k��wDc���s�~�����s���5�;-�E9G{u��=z��9��rV�QUgs���I��*Q���{�����!�����������?�x|��_.Z�fh9=�>0������q����k�Q�����#��(��x�����[�[����k���}-�:��7�Q���ly��r�s��p�8g����G�o���\9�����rj����
o�_�u���=u��.�"�z��8��������u�]������7nbc�������I1���8e�������7<Q�ub|0�1�_���Wl�R�b�����97O��>����/�����^�knf���j�-�5���ggj�l����+��/�O>�d�����n�a���
��(����#�����Z.m��^�{����s���*��XG�����'����������M���{
q��c��z��?�'��~�8�������t.�a������nB��~C��Gff[�Z ��aYqy��G�A'�|r�-\����O��5��96g�l+x�5������[��V1h���zs��QE��1c�V���e�]VL������/�?IG����/��|�Ol�j����/������g����^������/������V�=���y�1w��x�����3�-@-l����'�y����v[l���E���b6��[�O������M6�$v�u�b��C=4^y��b��?��HO;���*2�����w�Wc����N�����������/o��v�.��8��b�Fm������j;����e�m�]��*�{\�Zh@]�'��/M��S>��������u+�����S����K�~<���mj�`�F���KEUe���[b��V�������~��E�Y����'�X�Y��m`�u��c�9&z����rJ���:�Y~����SO-�����7E������.���t�I���K�{�NG`N���n��
{�y�N�mN�kR|{������Xi�n���������o�:��o�T����@�Y�����m{����������\k���e*r�!q��w��{�9����6�,n�����3���Y�y��7���nZ,�Yu\�9��C&�_��G���c�';���o�O�or,�`���^���&�v����<^�����,��?�3�-@-�k����lyR�qP;�
w�s��S�M5��}�����������SS5<��hx��r�su_�����v9q��7�I�W�u�_�{`�������W&��o���5W,:�����[&���6�r��������F+���7�YlS��{
��+'��v��,6��rf�������_�8������w�-���%[��:�!mr1F���N��?h�����?�?���q�5b�����S�I����*��-@��2W/?������;��+��>��\
s�MW����3��jBlu�����c��{��[#�+��bB|~����{G����O��o�XTy�mPk�L+�a����{�]L_t�E1h��b�Z�N�m�����u���~����k�O<�D�����R`N�e��^�z���o�q|�;��+������"�@;t�`s��q�QG�;�����J����1���G�n����n������@�����


��o�]w��F�*�s���.��u��	��c������%�3�\s�Zk��{�.����Ic������������sS�8h����r�s-p����T
�}/�<���\��{ ���]�E\��Mq����s����.�u9���@�lN%�l�`���eZ����~R���b�>�������I�>U��j��w���v��[}.�s����G_h64F��������7���?%��-�~$�����P��6�k;G��C���9]�
6����w��[n�%N?��8��sc���1q��x������@����?b�����>sg_�r�T��|#�����g���7�s��_�>��by��mG�����b�����=��������U�����j1�����[����+���[n���\������>;��s,��"��V[��������0s���q�g�{�/��b��s�[1���>;�us5m������=W�Zk�)���V��|.����2�O�o��n�
�^��0&=�L���5�� &�uk��y��=�����K�j^z�����[�����e+��r�7�|�t;vl2�X����4���:B�A�G������hh�z��Gt_h����?����������Y�9�����_(�gd��D]�^�c���%],�|��'�����I�&����9rd�u�]��z��[D4(�;���a�����*��^������}�I�8�c��}��������������{�Xf����M�5-k=*��2���gQ�	P�e�������k��g����?>;����������Z*9�����_1�����5��R��31�Og���~_������b��O���?j_?s�?���!/�����\����W��\���=@E�	6?���x���c���/�����+��,[����:��k���q�����2����g���k�5�_�����F���I�<��>�1����_�mVq����1����q��bYs��������v�-���+�L�e�����5jT8p����z��]�r����r)0��Xa�����1��g��B�?�t�����q5��7�_{UX6���5z,�B��=O4����H��b��E���k���K>�e��=z�e3�=zt�t�r��6��}�Y�������������b�����'�|���������c��O��;m���6�����b���{=F�~RL~}H1����/����b�1:*�s��.`���q��G��'�����(��6,��{�b��.�(
T�������O���?/�����{�
�:[��r������������sS�8h����r�s-p����T
�}/�<���\��{ ���]�E\��Mq����s����.�u9GG:�1�x}r���1��-�����@��2�f���;c����^�z�	'�_�������`s�����n�-��o�>|x\u�U���[���lN%�l�`��}8.���'��O��K:�����/�����=]�m�p�
�G?�Q���kE5��k��~x��������O��w��2s�#�<26�l�ro�:N���N5�n��<�y?`fu�`3�����g�yfQ������_���x��g���'��.�����|��5�r��_C<���r�����	�@��R�f���w|���/��/�0���o�6�lS��M����O?�tQ���O�v��<����������)��ll���������O��������w�5?���X��=>v��c�z���y�A��?�_��q��F���M��?_������=�_��\.�+�r�f��.X��n�p�
����/�<0�Xb����+�����a�/\9���Nt����?=}Y��9O�74�����y����;����x|n�5b�����G/�M]7���%���>se������M���c��{~�.�I���_c�e�*��t�`s���q�e��o����O���{k��s�.��������g.���sp���+�D������{���^���o~����_��w��w��7�+�77q��x�������/
>�86���o7�i�m�Sc��6��u���-�k)���/�F����c�E�)�[s��bP�yc������0).z����w�o��K��c�r
]E�	6'L�\pA,������i��V��mh�2�O����?���x����������^�zD}�Gc�~~�5���/j�-�V�r,7`�Xp�A�����O^���{���Kc�w*���������q�]�#;��0��
���#v����{����o��5O���#1�qr�%�������=f���{q��mh����,�\N��e���}���{�[n�e<������4VYe��v��G�C=��.�/��ly��M��3_��e��^�cy����^�z���D����}�0�s>�7����W|�E���������:�����`�k���vg|��{mf����E�fsl?2���X���_���N���{*.��rj]�	6{���������o��������c�}���C��	'�����b�����>8n���7n\�'����������{���g(WDL~��QK���&?���}��w.�������w/)�����C���q���{�����M�emu���F�n=b���(��g����+�"��nu�b�~��h��G��!��6Kns��S,{m�[q������_8�*3m�|s
�o��k��J�.�,�n<����Zj]�	6��;����;�����x����
���:*��k�8��3b�-���_<��w������6�@����?c���E�����}�GU�mf�$�P�

"�PD�*���XVQ�����(.6T�(bw���
(�4A��&�CB��d2��9s1	$%����������A_�wf�{�g�<������P�m�s�����i,O����=������?D�2'I�9g��_�G�NRX�%��P��+����(���Y���������5t[�k���O�S��,��>UX�\U���e��:�n��H�V(����/�����S��u4}�<g�\�e*�<>!���7��6������5�y�-]�T+V��]w�eGu~��'z��W�����
��s��
o�NaM�	~8��-���������-NO9)
l�L�*W�S������"�,���M��=5���J],emwv:|?o���^X�,�j���H���.�e�"�w~O����v���H]!����3��r�]�����Y����
���	�����~�����+�{����������������}��?I)�i��y���-N\�e�V�r���=l�Y��v���
5���Qv����5��e��V=�������fVV��-[�a����k��y���w�y��
�;9i
l�@�J��)[�������Y;��v���+�����.O��NO�'�~W ��8<������uE�K�}���m��y�����M��JQ4w�g��g����;*�{�VN�g;[tX��L��x�}�<j������������K�sn����/�;�����y�
#�����	1#4�k�O���+�����1��.��\�N��n7�k__�_�f�+��������,]6�vu����{�����(�\l��3����W^yE;vT�����aC�s�=5j�"""t������������\�������X����Y��9�����	=7�#o|;yb
x��������D���7�a��3��>g�����l�i���m�6�lW�����7KI�{����
//Z��s&HeOszQP����DT
-��i��s���/o��0���	U��_�jM4��:)���b��~�/h:S���+�������>�g�������&����*&��]������Y����}Q��&�LJJ��7���e��Q��z���q�2�o��/��Bw�}�N;�4���;g�<;Z�#y��W`pH�@��Py��x��-�jFh�
f���������a�m�f�����3�%��3����3���	Izq����u��7��i�.��;=[�����'f9[�7�R���>��p�����l]�R���)�����~=�i�.}>U�����&g)����PjP+{���7���|?G�7)V��w�t�<#A
O����E+�����k�M��o�������?��m�F�	�����X+o�{��<�|&���L���������`]N��5NO�owpC�#�	=�z�'����;k!e����������z���W�k���������;�~���b�:�i��b�P4O*�'����6G��/C���W�����"5�o�?�w�.�3N�������v�__���!iA�s�!�g):B�pY=C�����K|���	�;w(}�WJ����>���<���J������|-��+�O�����e�v����>y���/�����}����*`y��S�y��Qx�=��%��5J���y<qmH[%���m��_�B�����
��^�Wqqq������>[g�y����^�=Z[�l�(8�|k�P�K�*����} >������y����������T����H�@�y����q�����26H�'H�)�mD�����[)���6�:&���gY��2J�cL����43[j� wU�O�`J���������$&�}�_]��P�H���
�����hC������hw����i�<��RN����T���U����l1=R�i
���[�5��V�G�(g�v��&+�zU����<W�g���\����X+����_���C6���x�<��W q��C.o�n����W�'�/UH�/EU�'���p�\lV�TI�}�����4g���������
3�����J'�x�N>�d�v�mv�u������ipD2g����nV�������=����{��2�y�������
��������	����;�!�	A���������70�M"N93��MQ�v��v8v�Q����t�)a����� [�R���������h�SO�j���|y�M^����
,�U��!�?����������N�S�2k��
�IR��8=
����#O�B���UH���i�Y|�����x�=�u��IV�%���0���R�Y���pM��Ott��=�\=�����������K���]�t��j?��#u��Uu��U�������
�T�O;K��P�v�/
;�Cg-�S���[l����NO��ag�Q��?z�*�-7�[���z�:��O��M;g�}�@������W}�[~����
rz�M)����;������������(���V��%#o��W|w�&n��9�p����G�������p�2�5w&����sc�_����_�"[��,@��^�����9�J�
h���	.'���/�~�!d��.OD��6rz�����6�s����ACK���<��V��u�u�������Z+���R`���7�R�����@��vv������]�Sp?S�������/��������.��_dd�4h`��9r�V�^�W^yEU�Vu�U��E
$';k����/����	/���_��/R��he�d;[B�����=;o���L����U�bM�8S����=����\���Q�/�����p�p s�7~����N�u�����[����t������?v��>0g���a:�����z$������?�^�Ucz�s��������V��^U��i�����s���������_Dp���#�}o@W�������	�=���(*���oHIV��o}�
�D9���g�������Ok�+��b��\�����<n��Z_���_�W���a8H,O�z
;�-��oR�r��&o|GyO��n�oxU�u����?��T��3�}��99�����fVV��������u��6�4�9w��Ha��4�s�#�[���<
�K���>&������b��:�bm��`���o�LT��-W��2|����t^�F
����I�������2���L������fm[�����91�._ �~h�jM4��O�=Lw����
�U�l�=L���z���*^F�~�R+-Vl���3���,����k����l]�|�����-I��_���1��+W�x���3Z?=VN�(k��lp�_�'�f����3s����{�;��J���R����]a�����.���^����#?S�T��� �3:3��J����ef�
�
�(�n;�g���;�����z��[���n�����1sf��3�
����Z�+W�y�����{��_~Q���u���j��1�,��k���	�|�\��:pt��M��5�?`�	~am; ����K���~=�i����~`��������gFe*9���$B�fm_��������v�s�6��a���	=���E�b�0�����{6��������~�ZS8������C����rt��[����S6��u��W�7���{��[������iW(*,��EI
��}=��z��T�JnlrV�0}�������m���V�J
�����,�~������i���%$4��Lm��W�����Y�@f�2~�2���'&6�����Q_(k�,%tik��fN�Q����tW -����	A�G�����)))z���t�����3����5J���j���
�%K���?���~�N�:h����K�^���Qe�������}_bM�����U��s���yS|���<�pY}���������'w����.+���w�������������r�.��L5������_��E_��/V�`C����'��2�[���W;[MO8����i�Ex�uA��v�H�C��ds�Vl������sUcw����,��:����
K���������y��������9=�'��*�*?��g3�e��z�*�:�������*���?����!�����oC�@���S�JwsM������K�j�����l�n���9y�d=���j�������#��sO�H}tO��;?\Q�x���e>�����:a���~��7W�H�������?pfF�T��'��{v�����=p4���T�S����9=�^o��-�������7�j�zgK����bG{v;�*��oW�}��g]_����G;�!��0J�yx������Ia����jT���h����'=����C���8�w_Y�;37�0���rz��2�^��#3Z3��/U������wz-�w��_�����z�9���?������v��h����Y�n��5�fDD�n��;*s��������	�beJ����g�����VN�y[�
3
S�h��N�q���J�<��1Ju�������Q��y0�h	�7r��:�����g�1k'����L�,X��+&����Ze��I�N�%h'�R�o�P�����m��+���������������<Y��\������3xm,p��~�5��������i�M�2G��6H�|�6�l��1&�3�?����u��7�y����8�v&��9'[=>HW�/3�^iK�_���v@	�N/��R��T��]~�wz�n};]oO<�J�>G�/����Bs^X-w��}�a:`��O<����t�B�H�
_S��]����=��q}��[�u3���e�+��qvtg��_��p;�����������L������(�����5?��;9K��u9��a��Ga��p�w�mI�K������`�r-KZ��u[;=!{�R��4o�~��6_���Z!~���T��������^�����5�v�n��I�����q\{k�=��P�
/�l�����������n���CF���j��/QN����+��n�5e�']�����u%e���������������rl����yv$�W��%fZ�+�tb������6G��/C�����rRx�H��0��1k'����(�L�����=�	6�
Z�b����;�}�����g�yF��-��GKrz@���a��l^�����s�9�}E�*�+|S�h�#��:7&�����F�O���C���R�=���Yh�������y�����>n�|�Jy�%t������]��(|d�|����+��+�O��t��	,��c�T:E�+�����P��
;�6P�~��-��<�V5��g���[���K��`�u����5u=�
E��/����U|����	6_j�[_6H�k��?�fwf���������3�9U���8�Lx��=�z��2:��$PS���>�mn�o�>�i���se�*�|��#��b���l%��'��v���L��I�f))s��7��r]�����'�|RM�6U���5v�XM�0�6�l��Q�}��Ur2_~pt��G��@��GX�P���������F�n��?b'����Z�#4\���5%m�������|�v��O9�6�)���1%�L	�}���)�lz�"�on�g�<AY����;���w�V��R��,�
!��t�2F}!��=?8?|��v�X^���\�K�.��]��)=��Y�����&���������V��������������pxL�������u�(2�����^6PgWih�����^��C(���(1%�V�N;Z��?���Z��}+��=L�������[Cs�:W��������g�}���m����A�l�9f�=��s��8p��z�){�w�e���l��v�h�������l=s}�B����������Q�6����l��;-�me��U�*,�a
)�����!y�Vsz�[�X��tE^p�]��m��Z_������,e��N9[7��w����@J��>~WQ�:�]6��`������_��|�O�i��_��
����|��+gN+�3(x����%^�����q���9��������QN����3�Y�}s�����O�#:��7��H��.o,���}{���^7S��������0U�Xt�23��p��_xZIw���
�����TR���p���^�������M�n��V00��K9[�[�L���������������'xO
$�Q��k��VG���s68��m�[��b]�&W������=���|�b�_�S�d^����slL�jK[^���z����-�&�����s��Z���kF�����/�~����&�)�y ��g�o_s�J�L���UJ:D���!�ue���'���'�B�l��/?
vXk��p�%T1�B��},M
z��Tx�������a:���b�:����SM#;��f��8=�CqU�9m�4���;�]��
2M��������.S�N��(�}!����k���_W��R��}d����i�������Rm3sh��4Wo���	YZ��o�~]��b�_W���^KS�`�m���?�|J��KE5o%o��
����+A���:;�Q�f8���i���B��'(��3'�~�6;��?���7E�?�3��N9�w
.d+��t�����%���>�����{I�o�b����R�g�\�u��3KaM�Sx��vo����9i��q*{��[>T��v�M?Y����
��,����7��|#�k`�g����7x�������	B����v�Z�~�*��9=�o����_���P������~[��(����R?~G���
d��z��	Jy���������>d�l�����W���R���*�����3������<����`�P��3T�_�=�^?�V;{��W<��Ha��J��='������`���I�nm����+x3���F������_?8�}?���3k�B8nH��Ho�|�<����_������Zj������:[���W��n���oiD�!Z��6x]��:��f��5��f�3������������v����)����^�V���[J;R������c*�s��#������S���W�a<LH��_��st�:�s]en
= �7�|vUv��1�|�}����"����r6������e��E�zM}^�7���k����,[j���4#6/��ry��<���m�FuN�8Q9y�w�1s�}����,/3������G��F{�������\�f��4�8�v��w_Y5	�u�z��?=VN����Agl��6�<��}����u�'&�?������Y�U���R�s�~�V����-�)��7R�	No�������(��������:vO��l=y��"E��[�ar�����C�@�Fy�O�'���'�C��l�4����������N���o����	f��3�2���T��_��2~�O���f*���4MY^p�e3O��1��88U�>���>����G���E�P`���u�u�?WaK`�T������)�M��'\��?^3�����4������C�}S���m#��<����M�27��O�:�n��9j~��{M�0]�/��N�P����f�����tn��C���w�����/����������0�d����}�1E6k!Ox�A��k���WT�����0�i�A�����Y���+��oG����BA���V��{�8{�x����V���<QNo�	@�������U���1������
dm	^w�����U����Q`������0#���<TO]p�*G�9�!Y�l}��;�|Zg��������Df��������KU%x\��'��S�i���v����%��l����e��c[��oW��?Q���S&��(��L%S�T1B���n0�+��g�2���2�;�{����m�T9K��������fy�<�l	�+W����*�����K�}��w���/��U3�����C-���@ia*�t����^�?{�Z���H���g�'~}Ew���N��pM�i��\�r��7o��-[or��d��}���V�RJ
�3@����[_��s�I8g�����_��������#y����U�������A���'�����R��7�/w[@	�B�'��&_s��V;��������_=Q'�|��#cO��q�C?�f'*�8N�>Y�<x)^���������D�"�C�|^�S6������e5����������Y�zQ�&�)��/����M��L����r��-��pYEGHC��:`@�w�2&����P���No�@f��>}_�����t���>�3~Q����,�iJd&m����3�v�O
k�����P��������W�����o�elh�	+��������ej�[������V�(Od��K��=�bJ\~���>��#aiFyN�4���_�����^/��M�Y��l����9j���Fk.���U���C�
�l����{�e/����x���y�]�r1�V9A9�W9=�<e��S���f�j�������S����a^C_�_��2�f��p6�)�@�\#)k[�?�U+8�=�plM�l;4e��?K�>5�
���?x��?;�S]���������uj�Z3?�L�e�Yfn�������r��W���tmI������y�oy+MW��f+��c�a]�L��t�f�B8�Ws
w7]�������0��^w�g`������S��-���1��'"Ra��wzB�0�
�q��5n��� )"O���]J],O���������|y��SJ���G ������l7����M��~�h�����
u�������������	6��Cg������/l�1��}��Ms�����o���;5x�����"i_�o�Dj�����E�0#T��He:^����3#O|��:=A��2�����P`��s�5w���g��������3��	f���6{W��Wag�*7U���3?@�Q*i����qp=E��/(�����������k������R-x���{1����+����O{�U�+�T9��XZ�S�(������w�!5;5���������m�P��^���U�H�.��=i���c�����>e��M�r1
d���|d)�T���������;��-g�����o��rw��*f����D��/��S0����������z�����;�$)��)��\������3��!9��<x�yb���5e�R^Q���sxV�^����e����G��I�S���q�����v��]5s��'��g�\�N��3N����3������+y��\~��uuq[U7C����>��a������3�/�{3�oA��Z���S��olP���}*{�-
�{����26���w��['�{���o���_���o��o~7�����
ly�9r?�����&�L��cGcN��C}p����c���c��G����S��%�A��`�������yK�.��F���w�fFmv;�Jg+���f����a�k������p�M�R������*"�!��'d��z����z_�Ogdk���������L�=#\�*���:�v�y+VRx�:���}�������`F����<X���?�`�K�h����l�X[Bv����e������	8�T'��e���~��������B�X��J�q��({��d����v����� <<����mSB���a�}���s,8��/�����h�m#��M�;��m������Wv����f�j���q.�skF4j��'9�!�����?*g�z�CS�����w���+�@&���
���y9��8��0����+��)���X��Hxj��>o���xg������V�&�	��A���*
$�����}�,���^sv�|����=G��]��8��p��8kFq����(�;�M������'T��D�3��c^��N�?��n�*^m���#����������v��>��UTi����
?�4�7�o��l���>O)�f��������%�"�n<����u�_��M����A��*��7xO��e��~�)��(P�����J������N�������%2�2�g�	��(W��9�9�k���yUi��tn�3l�Y�5�����)�~z��������|#�
�W��K��5Qy���g���������?�Q���+�~C������"�<K
�P���vbM����R�yM;;^�������
�s�sd.��mJy��?>�8�c�}��a����]W����Y"m�uSv��_WX��u�����R]9�n�a�"��^P�=�g������6���i{z�����y��c������T)���ww��q�QV'D���,/S�v���U!*�����Lih]�\_Fo�mG�@N^&��a�O����eg�+2������s>���$���y
|�';G�rV��=?B7^����\�Q�ug�=���K9[6)�sk�y�W�Z8Q�*U�|�� v�t�9�	~��D�b����5V�=��9�����~��z�n�����1���S�!�@i�0��r���<pwpM�iF`6h�@,��q��_p�pe��}������	����-�&F(g~G���(�������U�����`��?&8K���5�%�|k�P��*���|��uI;;R�=��pEk�w%�\���?@�9��_����������RX��Q��?��-f~��K���q{�3��#f�����l3��z]�$XX����@��`�\g'�R2������^���-!{By�^�e����M�#5��,�����f�{�U�p������^�0��~�-������Y��5wV�����;�hgSnv_���������?;x���^��^�	�����h�@�^�����i�}`@8�,��-���o���or���"�����������UWX��e�4Jol��pF�m1��9���1=��v���d��"�s��.je���:'+�A#e�v`��BE����B>z�7UX��
o�������g�[@�s�{�a�/S���MH/��7z����f��K�|�G��(�cN8 �4���g��9���fZ�Ziy��,��(����}����A��_H��S��C>fN��`�� ��M�}���Z���m����=~�X�c���6��L;���:�ug�2���{�A��w�g��D����z ������WOL����
���N{
�9�me�������+)g����,xm�����LY������S i�����Lg��`s�6g�������5�T���t��W�v��z�����(=�����{��w��_?��9���<��_q��V�[?Q��n�Z~�m?��_q���d�%����l�;��3�Q�__��Mdx�#s���<v������7���b���8�>�Z����y�v+�;��V;lae��r��	cHo0#�=�5���S���
��_�����4mi���IB�/�����oC�f�����0����u���xw�y�*!�%�l~�MLh��}4%��,3sl>�)RC���M�(���,;���������'���Qv��2�,�	;T��g�5uI{%�6���3?����.��<����o�j�Go\�st.O�;jd�����U�a�*<���G}���3�=�!3�fx�D�_�)o�!��ZN������w����uLh~�<�u%-�����z���C����eK�(O`��?����l#g�f�V.���j���d��-���5�\a��^c���F����~��c;BL[8{����%���"���������k�p��Q���:�BM}�|�-�l���[��i�3�=B����>��-suc�N����i��M����Q�U�LE��~�-Uk���a���*�Q�(>;�l3��M��~]����>[n66����#myv� O�o2tu�~�(x/��)�����}������E���9����:��.��g�R��n��Q�.�}���P����nd���7I��5sz�@�y@(x�6�`����������)��U34�s&�\�T���^ag�
��
�
$/�3�I3�D��A�������:K=z���]�t�w�����v�
d�Y6}w�u��[��k��;���v���)/��4��?���)%��"�?o�G���I9��oj����4yOj�5��'�����}F���[��P�Z���G���u��������8M��q���
3O���g8�����\����?�>�W����f�1S����a�X���������u9v���i��]�0�����x���Q�}g��;=����WH���Y�K�:�uU��
=����W���{��pE_qm��sX�"�:W�^����o
sXK��@�X���eGkz�;�����;�����9�n���d�&JS�2��'���	[j�3����z(�Q�<��w�?�ho��������p���(6S��\�f��������y��}�*����\�;_�!E������}�7{���zX����������J9���|��5��������gF��������yw+3'K���]�'���5���S�;{H/��@Gw�����R��jR9��� 3����v���*^FO��S�Rw��7��s�?����>�
���}�9�{�);{JUo���cK��2.S]�G�y^��o�fk����aV,'�ta�} ��-m���>x�u�{�}\�n�V���
�^��Ar�*!9B#�M�i�Q(s��>�s(f$�'�d�7�R�[���~�I�T����aX�3x��"o��������='�����3BM`f��?z�*d�v�rf_P$������P�i�/�V����|���O��C��� qqq2d��v�����_�v@��T��?p���hg-$��-��lK��w,/[�r���Z�
k:+���gM��G
��R]���O��Y����Y3��'J7�|/���>��>v�R^~�Y+^1�St����������~��V��u��{�S�ZH���s����o�E}��a�������p���l=qu����s�B���PF3V����,=~e���f��|��,=�!�����j�������#6��G�C���4g�OC������K��]����#��Iy��R���
N��}{��R���Q���6�,��@z�r�>��"/����y�y�LI�����<��m_�s��
���g�Y������W��<x�_z��k��Xyk���u����?�w�������[o����Yw��V���H����w;�WD2���S�#^��59zu|��XF5*��M[��;��58�W�������/�p���y�^8�kU,�g��:C����*����z�_O�=vE������v`��-����jG���^
3����{���
*R�n�i���LH��e��u����'����,�S����f���y���������s��Np|��kJ<�Cv[��
�(x=FTv:B�o��7����e�� ��*'�d�j��a��[o�Uk����1clY�.]��f�M��f�!���Up���H[�,�[��#t��z��t]�R�����.�TD�t����L��#3�|d/��R��WJ@oL��o�C#Tz^���nx-��[6}��R��P�0���)���`��<~������QX�^���W,S��s���\���a5N����X�������\��f�����d��4�e����f��Y�c~l
o�����<[����*Q���
v����}�/�f[hX�HLo��
��w[
������9�����j@1jR+Le��/fe�x�|��w���v�jU����V���s��Vl��~c�N�-7k���:�6��l%g�j�_������ ��_�������
k:=Tn�M��
��w_3���I
����j��3�r�����4so��~g������=�
���?��E�:����|���k�1g�y��XCM���^?�Y���Fl(�&\�Y8Fl?�r�����l���`~;����M8�4b��b�9}�R^$���v����'4G_p[��o���p��v�[)N���_e.���x�<�?�ta�}�I{�����~�~��DG����(���������Flkw����L���WL�G����si���?-�������PT�Vq�9�W�H[^}��,-���n.�r���>��1���y��g�����t�N+�H������y��|��������E�Px����0b��`@�6C6F�Y�6CJS��=�NyO�Y)�`�A���q���8&�����i��W�U%�������R���[���9����l�XQ�]��S�;����<S����������`�#���R$))I��wW����v3�1��S��$BMc����w���hw�����fPG�������gJ���J� ������)�#6��kW�?����L�����*>>��p8�����1b�h1b3��c�&����[?EV��_Q�W����l��2�n�r�_=>Hw��W�&��w�(g-$���J���V|*
��#7}K�T.#6�W��`3%%E����g�����P�����*&&wBi�F�B�Y0���E�B�Y0�M�������l��w���7���8k��$��&��4��e���]��C9�9k���u7��=:k!�!����
D�B�Y0���E�B�Y0�M�v������r�������Y�&���W�������+��F��tr��N�RI����P����ZHB��
���4n���T��������M�(�sl��F���Y*^����,�x�����d����O}m�R������z���k����;�xQ������Y��w ��2�4�h���'�����c�i�m�(��=~�DoQ4sn�5��-t����m�%�V�^�O�����f�r�:�{� �|O@�����,�U*����L���W�]w�
!�F�\s���6���{yM\�S������t[��(�9�y�^82�S�9K�+���,�X��������--A_�1�YL�6�������j��:��s��kWM�>]��0<;==]?������J�u�Y��a�=�y`�o�fk����)���{��2����#}����[~s�������%��xGc8dIMM�;��c��]�v�v��������U+5j�HU�VUdd�Iw���l jFz�7N�����_o��'�xBw�u���+��
�0mO�������[��v�B�z�"����Z���S����=�����V�����W��L�m�d(	}��[W�r�������4f~��o����s�{J;R)/?����^�)������;O9�/p�����;�=�-g-����9K��A���q��������M��g��UR��1����%��f����,�G�=��N��U!*V�k���_�zk;�(*�4bF��$��+��{�U���s"��fN�^%�����4�����63-���S:��^��;/=�Y*^��OW��;k!����KIo���/�[����$||� 5�;�YCiV*Gl�c�^�zi���z��������c���Y�������x�5�g�]u�Uz����1�{�������5���ks���W��
G����u�������Ej���=�{��D�y~t�}��
�Ej�v4����A�`s�vg	p0�:���N�:z��W�l�2}���j�����`�������F���k��0�V�Z�V ������l!���?O��'�����~�n���=�$�t��t3#����~{�Y*>%����`�O��w�g3Z����a�_��`sSz�[�n���������7j��)�4i�m��M��m������#G��oT�����wdeiw���w���9��d/���p�R?�]7tR��q����%�TrV���6�i�G����j���<�M�u�z�M%�96C�c�`��Y��c3�96��E�\s��+	f�3�J^�����/�����U;5���g�����)e��qt&O�f�V�9�-��?�-���5�Z�b�M��@��~�rR����L]y�\!�k�t��g�c�������%S��`�Kg�:UY�?�M�Zo��j~��j�uz
�=M����N�QQU���������������f��Z4���etn�3���yN�'��~W������IN����XI�M/TD�&N�A�.��wR�Z��(���R������8���M�����c�M� �P �������R�"�!�,_v�Fi6K�Knl��*s���Z.��A��~�Y+b�(�5|Gp��`��������w)�Z<�='����,��g�c�/�)-�d~*(��^��R^zN������U��k�@ogm?���Y�M�]����'�2�5�D��wz�4w���c��V�j���'���Y�Owzp,���2g��S�"��@��>+O�
NO~��'�����x��~�~��x��|�;6l�l�`�=\U�8��V�\�������\��	�j�L�,�U���t�x�t��>lP��>�K8� 'g�e�m�)�V�5���5���a
lx�Y����B��g�id|������Y�/g�#�j���{���[�i���E�����(�Lh�_������<�����+�j���{��{�+�4����c���Mb�f#6�S�E��!��,O�
s������g�}%!��Ta���ZH����9�Y+>����[�qg-�����+}zaL��3��+�)'x�h�(�|-���J~��by����G�TT�VNO.S~6gA���8���<�=�=%������)?�����Z���;�27�7��ej�Bx��R�I�ZHI}���ei��������25aQ��s{�H]un�� ��%�Tx9��?b��U�:k!����CX����������!��,#6�����j5��\�]?9K�+�k������~=�Uf������~��2C���.��')�����d�5����'��S���V8K@��sj��������@�Tg�������nv����K�%m���(�P�xm|����E������{��=�$�����`@�rR���H/���(��.�J;�4z��������������Q�;K�i����Wr��P<L���"g�Fg���3���@N�������}��l�iC2%����M~�9��G���2��\��4g����%x�)�{-�/!�P�d��(��+��G^c���7�����9m����U�Y�maq��%���+9K8�f�.���y����{���^�C�	(Q{������$�#��&g�x���q���
�%.�)��U�������9[-(���)�������|>%%%)%�d�ptx���,��.�������_5r�H����C	�<y��9�����F������m�6����*�LOOW�~���ys�?^YYY����z���h�"���������g����s�� ����J^�tg	P��*��1c�^�u;*3>>������,X����k��%Z�t�:u�dGuN�:����\l���c����1_}�U=�������������\��j���4h�'�|R��W������a�p'������m��-[�����-[�h����W���6mj���u���3����������p#��>��������#5�Y�b�-C[�~}��Y��
��y�
s���k�MT���+33�6���9s�L���qc�/_�.			��m�
B�q��5�f�r�����s�j���������6m��9B���5j��iJ���	�}\lFFF�S�Nv����W�>}t�wh��I���K��Q#h���W�^z���T�zuu��������&�4Z�j�����9h� �?^�k��O<aC���,���{z��7��}��U����2�rU�i��|��G4g�
2Do����L�bO#**J5j��}����S���{�e~M���`��z�:��sm���={�V�Z����O=��^{�55i�D�����\l8���`333S3g������v3�1��^�2�LIIQ�����M����y���W�6�<�5k�T�v�h&����������e��n3�>�l{s>�U*�J�*i���?~|�6v�Xu��Q���z���i�&M�2���?�������OT�vm��UK�>��=�r�PFl>��3����~�a�/_���+::Z]�v�����~�O?�T�@��
��\l�����~P��
u��W���8[d�����7������{�:[��k����4�[�N+V,p���bbb�������|N/7rM�i��4A��
�m�6��pf�5k��j�����tz��k�M3�A�Z�l�����Tg���(����k��U:�������5�fXX�n��&5i�����w��i��g������<��_��z�-]t�E���k:'���5��q�������W���5b��l������zm������_�������^P�:u������M3��c���<y�z��e������{N?���.��B����*�����2d�������KK�.��5k��y�����T���
��\l��J�*�A��[��]6%i[H�z�6�~��-[��C�j��A�lo���RRR���������T���O
6�����>}���5J����������~�I����]>�����#�h���m]�tQTT�=�;�&������	������_������w���{��G111�Y��k�MS�v������t��72
8����Q�bE�/_�Yp<pM���
j��mJHHpz\lFFF�C�Z�f����@ �lp�sU)�K.�D�����4x�`m��E~���
�X��`3))I=z��?� ���>}���OTXX�<O����LLLt���\l���7n��I��k�.����5�f�J�4b�%$$Q3��c��k�M��k����#j�s,�"�P��6�LMM�������/j��A���	&h����^��6}>��7��s�U�6m��#��O�>�������q����������U�fNN�^{�5�}��Z�b������sg=���z���m�i���_��n�M/���=���*��?�
6�^xA6l�w�}�~����g���q�l���7�|���\l����G���1���|P���s��2}f����k��@ �l�F�	6SRR�l�25i�D]�tQxx���@f�����r�J{,�rM��������j���r��No��>f�;v(++���F�	6�^��i����i�1��c����5���;�~���1c��M�����c�5�4'�pM��N�:)66V/����O��@ �l�e�&O��g�y��k�1�p/W�hm���n��V-X�@-Z���W^�a��� �4�l���i�+V�}�1��U�ftt��>}���1c���{��A�if��f��9���*�4Ly���{N�-�O<a���8����3��>f_���`��z�j����G���Vbb�mf���mf�W��@@7n��y�����������0a�����^n��`s��m���;U�V-���;����L��5K���W�.]�j�*g7sU��}�v�s�=z�������G>���*���qc�y��v��#�<b��n�
6���o��V�:u�������z���DGG����������G��9���&�LKK���3U�zu=���:����-2ag���U�^={�9�{�&�4sin�����=��S����98M�i��;'�qU)Z#33��C������q���k�MS^�a���;w�/^��n����5k��Y�\9���&����T�-���l��<X��|�r
<����m[�)S����\U���K/�-��bGb�j�J��s�F����'�f�M�E]�	&�}�1��U�f���5h� u��M�v���a�t�5��M�6��e�g��}^|�E{wsU�iT�VM~��f������_��5s�Hg�}���6m���}U�R����\l^�W^x�^}�U����
���7���R����������&���k����TM�<Y��W_����+))I5j�v����	��\l�|>�1B��{���i����7n����m���j����L����\l�P���^��7��+V�����m���
8{H�����g����o_�[�����\l��1C����N;�4�3Fs����/��Z�j9{H�*U�{���=zh����8q���[�&������q��u�V���O�:u��[�?66����^��f�����tg7rM��w�^-\�P�[��skJ��uu�g�R�iiiN/7rM������QQQ�����p3������Z���m������pf��9���\l����~��Z�`����K;z�0f��Q����s,�rM���xt��W�A�<x��x�	m�����+==]|���{�9��][:t��p/����g�iMc��A�Q��Z�l���g�v�u���������0@��{�]�^�
6����n����m����[�l�v��e�����~�z�v�iz���u��72Z8�*�4LPy�%�h����������j���������3g�.\hGoz����P�&���j������������={�������^����F�����$���8=��6�~�~��W�9R999�/��5�9�����F������m�6����*�LOOW�~���ys�?^YYY����z���h�"�����������;w��}��U���3�����Q�����������`��o�^K�,���K��S';�s���v���`���;v��������g�ULL�]�?������W��
��A=����^��&N������;�&�4eh7n�h���l�R���o��E.T�z���iS�g��[Wg�q�V�^���T���&���|vtfll�����+l�����f��No���UXX����\l��2<<\����f���3g�����|��v�HHH��m�lj��^�	6��+gGe��;W�/�}&��l�i����ft��Q��HNS�6�O���`322R�:u���������;��C�&M���^�F��@���z��s�=�����C���\�5����U+=���v^�A�i����]���x�	bfee�����o�a������7on�����M3W�#�<�9s�h��!z��75e�xQQQ�Q�����>M�:U��{/�k�W��������k�����S�j�r����}�����k��I�&�x<�n��`���T�~�_IIIJLL��f=o���}�p�Rl�0���nR�����Y��w$m����R�J�Rl���k��q
�����;���x���M��&�R�T�����9s�&O����9�9�*��fJJ�����6m���f�c���(E��+��f||����@ ���9�9�b�&�R�`@�W*����$u��]����������{��`���k����0a��n�<�|��T�QQQ�������9�9�*��fLL��������o7ss>�U*�M��`@�W*����$u��]�����f=o���}�p�Rl��~m��Q&L��f=o���}�p�Rl�������4i�}5�y����;�{��`3**J��5S�����Y��w$m����T���&�R�u�fjj����K�~��j���![�������
��\ln��]]�v�?��}����0a�!�������3p#��999z��7����*..N=���b��I�&��������,��5�fJJ��-[���X�1B/���z����.�L�[�.�5k�LQQQ�Y��k�M�����d]p�:����^�������Z��
8����^����m���5w�\-^���p<pM�it��E��u���>��Q~����X��`�\�rz���T�~}�k�N'�|�.��2;�����{w%%%9g�F�
6�o��;��S_~��]_�~�~��'M�0���q�FFv.��`3''Go������[����������~�I�&����_111�Y��k����-[�L��W�#6�~�m�|��j���A[�f�����&���|JNN�g��3�<��p<pM���U���3;;��p<pM��V�Zi����={���x��`������[7���[c����7�\l�����O>Q��������;+..N_|���o_h���������p#�����5j���������dM�:U&L(�m��Q~�����\l�������4i�5s�9�{�&����R�f���u�#j�s,�rM�	��E�	��#�P�l(�6�z�J=�M��&�R�`@���`355U�g������f�����L�Hn��`������>R�Z�t����M�6�l���WJJ�sn��`s��z����k�.���Y3�k����f���z����k���,�5J[�nU����c�����?~�A����U�R%�,��5���Ws���j���x�U�R���X��`����96�����Usz\l�-[Vu��Qrr�RRR�^������j���f���i��9���	6�.]��g��z��g4v�X[����5��)?��'�(..�����sg�p�	���K��}�B[����������&������Q�����j��U�o��]�4i�&L�Ph��q�
B��k���������G��1�X���`3**J��5S������c������a�����O������S�9��#���:u������e���
�n�:=���:�����������a���_ST����5�&BRSS��o�`�PV�X����Z�=�����o���_��_~Y-Z����^h�9e�u��AC���1�k�~���];���(����F��"&�|��G5|�p��pIII6,�>}�n��&�^���5�g�=���������-r��eFT����������e�����={�~S�w���������c_�6��>S������}G���v��mS�=4t�P������_~��:u�dGG�|����G����N��Q���mVV�s�l���7��@�{��6h�^���f^l���G�i�GQ��Fl�r��������|��|���u����;;[����	&�eS��Z�jvy���p���AM�6M[�nu��B��Q������T�\9gK�Y7�f�/��bG���:/��2��T��F�����j���I�w�[��3G]�v��ft�k���O<��f�����	y�Yg9���t�I:��34c��\���
���`��y��:��S���L��n�3���:/��2��z�6������f=o���}��Udd��{�9M�:U7�|�����-�3�w����u��r��No~�<U�V��yGl�������QC+Vtz�3�l���U�Vi���N���yp|�m)��iS���WU�Tqz-99�����kLL���_�2e�,Q�wt��i�P���1����������yp| �P�l���#�od��VT����r����������
����������%������E�o�^�~��-�Z�g�yFO>���~�i����������������/����h������WT�����s��-���G���,���g���9k!�^^��68k�k���������9�Y+^+c>Tzx��_����Ow�s��W�*�������o�V������u�u:�B��&��5U��|����knV�-�5)��\�Sns�����.���Y�������U;���y�����\s��+	�4��f5�8k��<s�+	��3�^^Mv7s������{_^�o�@�3�9k���Ss�P���g�����h��km�[�Y+^��/w�B��M���$l��1e�T�Y�����W��M��s��[�������b�9s�����^��
�w���iO�6���V���=��/�Z�{8K������//s����$,�8�Y
1�7������I��v���]�XR�bE�r�)�Z�`�&�R��.s8�.\����N'�x�)Y�F
gK���=���:t�>��#�r�-���T�v���[7���������y%%%��c���/����/���R��:������%�]W�R2�i8�����g-$�����c��V�����,���y@��%��l���(s��&}�~�^\���V����v]Q����������E%s
�|�G����e��NYo�����{VD�+�����������V��'�&���:k!���;��i�����v�p��k�\{%���R�3s�}��g�}%�\s���+���U`�y����]S���=�G��_���YBQ��g�=�g�������(�Yc�{0�ug>o���%!z�;��Z�Y�����W��M��s�������q�����������z!|�+��������%s���{�{_^�W�v������{_^��3�aI��0�z�a>o���%���O���u�5�e��u�����N�iJ�����7����R����-�����;���n�0a�.��2�8�����u��7k�����Eu^��R���U��Wo�+��������d�!T��7g)�������u��WX�Y��?�Y�F��Q�s��W��������������4f~��V���=Z���tH;R)/�L��^�)������;O9�/p�����;�==y���_�,��N���;k8Z�5g�����c�:���������$�k�\{y�&��������{_^�LxT���8k�k�
_9K(
|���g���Y4z�������Z������b>o���%����^?�������W��M��s�e�V��{;k��\s�����w�����zEk�V�z|���/�}�|��k���;K������//s����$�����D�y�|�,	_6H
����*�J��*U���N;M�V���E����L��`�5o�\���>�hGS�x���Z�v������+5c�5i�D�k�vz��������M������k����9s�233���cG#�Q���m�Wc����m�]���{=z�
>�;�<U�V��"����������Dmjj�'����_~i�/��B�/_�.JQ��W��T�O<�SO=��r-Z�P���������,���G�=��v���q�i������j;_�C=�5k���w���z���5x�`;*��i�%y<]q����4|�p��u���v�y}��Gm�E]�k������3�<c�:t����D�����7���������s��r��������5h� ���������*U��G&H4�6MX���
*��'�TDD��s�=�9"W�z���?|�������	����Cm���N�:������c����u����G�sC�r�-�������w��
�z��m�i���Ol���U�
��w���g�}��3�b�^�4m�4�p�
���l���&O�lG{���0�fD��	t����#UT����U����#�|����;�������$�2�MV3*���hJ�����
�����o���]�vuzgFn���������px��!6�<T�W3r���^����������U������(Y���q�����+����5��	)���o9���� ��j��������t���&�4�.w��aG�U�V��-\LL�bccm ����^n��`���
Wff�m��o?s�9�{�&�+W�������s�j���No�/^l�5��c��k����H�j��.?���6�v}��-��O>i���h����\U���K/U�n�4k�,�m�V]�v��_~���w�6u�T=��3������g��j���s4�rU�iJ�����f4��#��Gb�v��W�������h���)C\lqqqz���5c��y��:����-R���u���j��	>|��T��l�f�6
���/������/�sm��n�:}���������
��\l8�l(�\l�r�?��N?�ty<�C�:(11�9��*�\�l�n��F
2D+V�pz�\lfeei����5k��6m�����6m��m�����B��#T�R%�,��5�fjj�V�\������7��
7���.�H'�p����m&��z�Jp3�$~~�_>�O�7�)����8�&�,[��������d���8���	6���u�5�h��E�:u�������U�O^r�%����}�Q���+JLL$���
6���u�����s��C=���+�������:t�`P���`s��e����5f�����5�fVV���Y�f�i������t�R%$$��1B�*Ur���\l���j����W���
�[o�U
4P||�A�	5M�Z�������������OV�Z��^���e��U�:u����������5�ftt�:v��E�i��	
��:WM>��S'=���z���5x�`m�����plsM�����=zh������P�>}T�fM���x
m:tPbb�sn��`���k����4i�v����8�&��T��F�����#j�s,�rM���zm@D�c��^$~J=�M�^�6��Cy<�j���I�w<�b�&�R�T��*U��#���`_�z��#i���^�2��z�6������f=o���}�p/�$~)))z���m3��b�y��7���+))���F�	63335j�(�����}���;-Y�D~����F�6�4a�i���h�Y��|���/�M�2E.t���Jm���x���r�����WO'N��,��/�]s�5��u��4i���X����T�&�������#c���o�]������H����96����i��)(!!A�����,�����{�����W��5��p�Rl���zmHi�Yp�pMBX�R%
>�6�����G��&�R�`@�G�	��#�P�l(�6�z�	6�������k���JOOwz\l��~��;Wm��Q�
��Oh�������5�fLL����u��Y����s�=�3�<S�[��;���;v8{8��&�������_���Gk���6l�Z�l��S�������������Z?���j�c�k��}<��U�����K������]�A��N�:5j�.��r[�����T-p�p]���	9M�����������Km�i���_~���=�����oP�p1W�yy�^��WOm��Q�N�l�i,Z�H��w�-Uk^7n�h�����M��g��'�x�������|�I���sg}���������i��\�l�s47pe�i��4����>�F��q��z����~�z�l�R��
������w���+�T�n����?������Y�4|�peee9gP��&�4a��5k4x�`;��a������V�X���k�����9y�d�u�]�Z��sdHTT����*[�������lP��&�LJJR��=��wo[f6..N��~��M��?�����
4�sm&22Re�����Y��+E�o���k������E]���pg��U�\Y����^�u���:�J;��*T��lCM3of����-���M�6����	6=��x�
;O��W���5����{5o�<������	����96��-k���k�M3�f�V�4k�,��3G�@���X��`3,,L={��<�;��CO<���O���;w*11�����$������&�4!���^�g�}V[�n����EU�ZU�+W.��t�M6��^��c���5�f�J�4b�%$$Q3��c��k�M��k����#j�s,�r}���������@ `_;\lfffj�������U�bE������n��fFF�������>��p?������!�5�\�Q�F)99�������7�k��z��W����-��U����;��W/;Z�i�����5m�4�m���C*S����kgGq�����7o���[�*�=z�
5o��6�7N��z�N?�t���;{HQQQ���;5p�@m��Uc��QNN����&�LOO����U�zu������,�����_�&M�h��uJKKs�p#��&�4!e���u�)�8���\���U��;v�y7���J������w�
g��-plpM�Y�\9;Rs��%Z�l��[��k��}�1�X���`�L�2:��s�u�V
2D�7ov�h���0`���c��^�*E{��W�������~��m����_�������lKHH�?��[o���s�UW�s������U�f�*U4h� �k�N+V��C=�-Zh�����~������5~�x]t�Ev�N8�9�[�*�4����o��FC���g����:�������k���v���.�4��+�=zh���JNN�%hM��{��-[�>}�����
�6����Q||�m*T���q�8V�>�p�sM�������~[�
:�f�1�p/�����5j��?�H�9���\lFEE�K�.8p`��������>�l����_�1c����vN���`�����s�z��]`����F���s����~Sbb����{�y��6�^�	6���Q��M����j����-w;���}�5k���[k���JKKsz��1l����m��Q���N/7:f��
6h��5
��{��c��c.����Z�b�����U�V��s�Q�������5�fbb�:t� ��s���O?]c��U���u��W�>�u��hm�����}�{��N�rM�����k��Im����4s�L]r�%v'wsM��f���u��mf�f||���cv0*p�!�P�l(�\l&%%�{��j����n�<�|��5�������5a�����y����k��J�*i���3g�Z�l���8�{��3f���Y�m��i��)8p�N;�4U�ZU/���&M�t@����bbb�3(�\lz�^%$$�03++K�����x�
u��Iu���	'�`���{k���������_����[�k��5STT�sf��k����}��'Z�t��~�i5j���r�O<Q}����
�(Os,�rM��w�^��7O\p��>�l��p��r�7nl�1�p/��~�_>��Y;���L��1�X���`�l���S��f������;���={������
*66���F�	6�����eK%''��'���e p��2}�'OV����z�i���k�M���/���_oGm�m�V�\s���c��6`�]v�ej���V�X��\�\r�s4�rU�Y�R%���������9j�(;2�s���� s��������!Ct���+<<�9�[�*�4Lh��oh���z�����K�k���o�Q�����-[�^�z�����u����xt�i������#5~�x�F����-�IDAT��;��CU�Vu�p,pe�	��B�	��#�P�l(�6�z�J=�M��&�R�`@�G�	��#�P�l(�6�z�J=�M��&�R�`@�G�	��#�P�l(�6�z�J=�M��&�R�`@�G�	��#�P�l(�6�z�J=�M��&�R�`@�G�	��#�P�l(�6�z�J=�M��&�R�`@�G���o�N���
����JX�HX�� �������`XT�a�A�G�(� �8:s�%�����K��2���,a	��,���R:Mu��N�_��;�S��{���{��U���}�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l���~�r�!e��W/#F����sLy��GZK���z\���t�_��_e������N*����kYn�����������������	6y���<���k�x������'����z{����#�<�<����5�fn=.�~�Mf�����.*7�tS�o��j�8z��:/�'�pB-������_\��bn=.�>�=�fk
�m�Mf��3������,���e��v+�,�Hk�[r?��?a�����������z\�
�����0�l2�I�&�;�������e�UVi��(�����|_���`� �d�>�ly��'���.[_|�V��F�Y�Xb�r������{�U:ss�q`^s�lML����5��`�<��S�v��Qe�����=-���e������>�h�������;u�p-�gN�t}w�A`^���0t��e0x����`h<�&3h��������`{���[S0�\z�k�)������y����jMA���`���nM�Ys�q�s^����)�	���y��O��by�n4�s-��3�k��4������|�3e���/�����B-����W^y�|����?�a9��s��{��������=�z�����������N:�uo��c��{V�������_��=M�:�<��cuz�V���2��y�������*;��sYn��j/�e�]�5�m�&M*{��Gy����\P�Yg����������{�mM0��Xc����!�dS�L){��W�����e�]V6�d����]u�Ue����A����^[l�������`�`(Zf0j����V[�^x��y�����^j�yK����uz��6*#G����2��y�`��1�|�S�*c��)��vZ9��#�O<Q��������q��N;���;���k���c�3�<�*��0o3-M�0����>���=���j��SO-�n�i��m	6�8����6��ki��fw�}\�mzl��f�mV����2n��8Fn\^y����������&�xzl�'�O�	4�`h<�&�x�M���@�	6�!������~��e�����g�i�v���o���������e��Qe��e�-�,?����K/��Z��W_}�\x��e�m�-#G��;��c�������y����q�W6�`���+��R7n\���{KWWWk�wn����������k�����Jz7�6����C9�����u��s�1��Gi-��P#��/�	�����cd ����n>g�p5X�L��`��9���9gB�L;!�k���k���]�l�M��)SZ����k�u�p�	]�.�h����o�]v�z��'[K���_�:���:�����2���w���d�M:����Kv�{��]�>��~�p�/t����~��vs�9��J;H��0aB�j���q��g~'Cu����0�4����cd ����n>g�p6�L��`��9�=}=gB	6�Aw���w��������N�?������,��gw����]o��F������=�������F���O���]w��+���.��K/�t�D��z�;�?�����l�����]<�@]�����:���j}�Xc��;�������[}�-6<�����7��is=���c��C��<yr-�m��7�|���{���
�1�������s�@���������	��`�3}���3X�L`���9�H�	�|P��O:��9��g������u�|�����=��S�����q����<���]c����<�/�zj�*i��6��4iR��-^xa}�������'�h��%l�>��:����z��W[s�_}�-�f�������7���ms9&���o�y��n��"��{�)��J�2��@�5��9FR_J��s&G�y����n���@���9��56�A�k������%.�`�N��L�@Y����z��-���^[��UW]�|���.�&M��F����o.��rK�vr.c��i��-e�7a���?��?��R^y��r��W��iv�2�,S��������5�X��x��e������W_��a�^C����d9������e���o��l m.�l�������.Zv�m���"����%�S��i��?�|k��#�/�p9g�H}a(��L�������`�3����9�J�	�uy����u�Ye���.�_~y}C:+��zky����k�]F��*}�|��W6�p�:}�w�e���s������:����/�"e�'N,o��F�~�����w�]F�]�[o�Z����/_�Zk����}���*~�����7e�=������/���w�r�-W��f m._�y���Ye�UZ�3Jy�g�,Cu����0���9�c�����2/�3a��s��^�7�}�f���Lh*�&0(V\q�r����3�8����J�������~�N���
e�����=-�����������SkY~8e��:���+��N�]v�z���:�_����>����RK���X`�������p�/D��7���r�
7�=�����YH�{��g�����_�U:��#G�%�X���������eCu����0P�����cd ���2/�3a8�s��^�7�}��fv���d�M`�[h���W�����������o������B'�o\;��9�������Y7���N��m�����G��\��7_�C�����Z�S�kh��������������^>���Jfm m�{;��K������P#��/�p:g���o}a���Ln������`�3�Y��9�L+O�	4R~I��3�����_|����?�������_is�$�k������P���{���0��s&�rr�������l��!�f6|��d��_��}��V_������
�53Cu����0�����cd ���d��3a^0�s�s�=�/f�`h<�&�H�%��K.Y�3�Vo���?�|�^���|�m�����_���<��c�v�V������#�Hy��W�_'S�N-O>�d�^q���p�/��@�\�v��������n��Cu����0���4�c�����d��3a^0�s��^0�8���M����o��oT'M�T�x��:�S�?���=�,����l��.�/�|�����L�<�����,P��Zj���r����L�2����7����yc���k m���`�������z��?��O���,�������:F�[_lCu��12���p2���0/�9�g/�{_��&�X��G���������MO�:q��:�����e#V�Zk�:�u_y��:�]>�f^|�����K,QV[m�r������������w�yg�x�������*~���H�[v�e��+�\n�����C�Jgt�}���o��������t�c�����0���#��/'���	�����|�������l����k�-���\~�������5�-�2�W��U���&�l�*}K���3����?/����[�o������W_]�Y{��[������[��s�=w�0'm
,��7�n�aYf�eZs�_}�?��F�U��j�����g�Y^z����������_�7�h�2r��:Cq���0���4�cd ���b��3a^��s��^0�8��-����o�1����f��)S��J�i���E]�k�W�:����^~���7�x�k���]�>d��8��C��N��Z�-���v�p�	u�����u�Wt���k���K/�Zm�����O>���7�l�����z�k�w��w�}��x�.����wu�Q��s�m���x�p�/t��������t�9��J�i m�����3fL]��C��<yr-���X�s�<��C��m�������&�3r�������s&ws�������8g����Lh"�&0$�z��0�w\]���.������O�����/�8�K�NtP]��{��g�I=��\r��A��A����]_?p�@����__?�vZ7_�N�0�������o}aNi�9����@�C��|���l0��>{���s&0{�g�M`H���3�����k������z[l�E����g��L~a{�t�;���/;��C�e�]6� ��������������J|p}�=�7�����6;8c m.�K��7��Hn�>���I�&���l��������p���12���Pz��3a��s��^�w�y��N��p6"�Lk�����-@c	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&0�?~|1bDYi����	Z�����_�[o����&{��g���c������Z��~�>�l9�������>}��w�y��s�Pl�W^y�p����J��������}1��0'	6�y��I��w������O�J��}��_/_��W�����F���0�F��?(��Z%���K/�3�8��~���`NlLs�����G��7�h�0�<��#��n(�G�.�\rI��o��f�b�-ZK@����,���O������N�Z;�����~�Ns�`���������[���Zk���F����=u���������KWWW�d�MZ�G	�_����e�fg_w����BPmN�	��v�e�����N�6=����o�A
3>���%�\�|��e�5�(��~9���j���1~���;����z�)e��e�l[��7v����z���B>���e��qe��V��n������E�=�������/|��9rd�q�k��W_}���;e^�I����|��������Z�N������.�����N;�4}�/�p��l�u
��?��l�����y�O~������n��W_}�r��w�+���,��R��13?����r{��wy��Z�oI���?��O=�L����������?��cj�i����^m�:�
��]w�u��k^_?�gf�#���C��3��}?�u����������u��y�Nm`No���~\d=���3����3�<�n���M����.�����m�^�[��V�k�v�>�`=6�������r��G�6���6�~����^?���3o���C��_��_�e�m�������!��o�_��f����[�O{h3�}����q�nS����>�����x����``���^�����o��~��uz0]}��5�����h\s�5e�=�,��w^�0aB
Fz��[���*�{�i��g�}��U?���j��/�c��0(AQ�I�����[n)��O�T��n��n�;���|����AMd�'}�I�����e�m������p-�?��7�7u�9a��V+���n���{������J���?���u�]u��(�'O��m	�rM�E]�}��7+	�N8�����5�/�s��w.�|��2�=����N�xd�g�O<��:��T��_�E
��_"�����M����1�������m�}��gh�y���_��w�w�%�vS��7���~����Md�C=�u��{o�tF�=�X
5sld?d�\s�{�������������[o�um#���=�\=����L{���q��X���B�T�vq�����S��i��PlL� c��v���2�r�)5�,���/~�z=�P�a������q	)�$�HH�0&�*%|��O>�d��f�@+��m��V���_~��}��e�W�C�&�z��QGU�I��|Y'���N]Tt�A��W'	4_|�~e���l��V���������X{��Wi��^{��;�(e��e�l��w���o�az�,���,���e�u��!m�{w�=x�}���<W�p,Cg�&4Lo�����~T��#�8��H�c������:�?��?���.���*�2�����^B����q;���j�m��|��'�������3=�������M��{��_��$S��e:�4]�q����vi�i�Y���.�o�s��)O[=��sk�����e}�[o��n�y	R�������i[y��}���l������������#���"�L����^[���d�'xM���s��7���Q�A~��c6�'������������fM<��S���m�����%�\R{���B�	���%��p�?��O�K�\������>g���5�J���	I�[n�:���u��O��i��H��n�a
pZh��|����=��t=���_;�L��u��y���/�����(uK8������,�53	��$�J/�v����}o�w���e^��������:����u:����d�$�������\����!LS�����[���aC���Xb�z?�9�V�I�s��\�>j8uKH����������/�6�I+��&���W�Z��2�,S���L����������b�D���wb�y�2��c�������t�A~z��.��<����y�����H�:vr�a���}�cu�,���uh���$�3fL=N7�|�Z��'�$����c<An����v���g�"�,R����'>������?���c�l�v(�w7}�l���;m �%���lt��f������m[l�����-��K��0�����M	�:IO��c�%4�0��Nc���LH�!N�X{��G�N`O	A2/aJ����z�k��V���>���7��~�@�S0��v��y:'��������!]��n��w�����x�6��$�Mx� j���k���G>���|�w�-�X�=O=�T��1�|���@��q\gH��2f�&0��Z���y�������)s��e�wjo	�f�q��miw,�@}
��G[�3j��l�?���u����5�\�uo��j��g�Z�=e�gX��������)�o%��)��l�����}�{_y���_�No���#���������M�n%`I��a63\�`
I���3���+���.aH��N2TlzA��������T	�"�do����/_��u#uMp2;2�g���U���� '�s&��l��	��C-���M�<�����}~��M��7��������/��0=��*aT��M������_�tF�a�i{e�$������d��
6��Nw)s���1;����y��>oG�03=63�lzG�����Gf��}�s��7Y��@���K}�Ae^���-=7�M�����n[e�U���W��	����������y�\��J�	�CzM���	��:��:Td��8���^�55��1u��$�����{~fX�,��/AKB�-���]�����	����7�?���Ps������������=4�0���^�	s�����%J�7;Ae�w�����bM�����z�-��������1C�f���$����v;�m�6�}�n�N�{���PN�0�^3m2�h�V����=���6Y�q�!�>g��&���~�)�'�e_�=}��(�o�}}�\�3��L/������+���o���&lt�����?�c�>��;���CB����8qb�5�XB��x	��.2<gB��P/����u|7i�6IH�9p����[�7�M@��6�����?�^��=�/�����\rI���{���_�H@�a���6=���0��$<I/���0'_�w����J8��f�-��������(aU{X�����M��cz�%���_�q8'��^z���������!k�{0�����_����0,��r��<v�5����P3k�;!^��p�sSz�e��l���D��#�����8�������{\��`�@r��I�������~��i��u���^�i7���c�����9�:g���������S����iN��L���;�����7Cq'(��{���B�	���!i�;��������C3&$x��G[�O��B{JP������"�,2������ojp9X2�l�MM��^d�I���%�f�9!�Z��F��������!k{�����Xf{f��1={�����!f��l�d?�z�=��	"�nB�Nz�z��u:���p���Mzko�����^�S��
9��N;�T{j���R�&�
��������p&XN[��z����s�)�n�i
��?g������^o3?��p�z��$�M��Ho����J��Lx�I�U����
dH�����U2�b����:����,_|q�r�-������[�@��?�i��F^O������l�		Ur]���M;�q)����'>1GB���]��k��;!RB����������SN��Z�f���F�Y�v�N�$���+�,7�tS��m����Eo����/;
)�^z�4�/��=�k�6�������jo�����S ��c��_���{�7�^�3����V�6�������P������D��
7�P����2y��Vig����M��H/�}����b��UVY��H	�:��BDz��q��lN!9;�?��z��|�@�Szd�7jB��}�se�����K�f�^{�U���g�4�$(=��k���W_�I:'$T��f;&����?_�7M ���	�2g^��}��g�*�Q�����Z���x�{0��)��_���l�tn1bD�y�����o^_��\��l���\K�����{Oy-�����������uX���M{�E�����^S1��}M��s���}�K_�=����2�l�i�����q��C���J����Mh�������������h������v���}����O����y�����z��q����~�9�����z������]w]�����m*��6��o~���!�.�
@S6f!��&\�����J+����!�i��V��L���b��p)_��ZK�\��{��^�M��^	kR�����Z
0�u����#����K��a>X`��z2tfB�=	79���C��W��L��@-����������(�%aKz��|��5H����1�������!V�����ah�2���'�X�����[�
��h��
�[��}������|]6m �dz�f?~���-Gyd��l0�I�����������m����	7���/�����8uO��c+���F��~��L����.k����L�G;<�u�]�v;��c���d��v�����\_G~T0u��Z�Iz��Z�	7�oy��h �r�,��c����"�n�{��s����e^�E�4�`�($��M�� ��������[�\r�r���u�����0�C!Pz������N�[����	]:������.�]vY
8�N��Xz����w�����s�lP{&��l��jY�=v��r��������c����P�z5�K�gO��5'#!c�4X�M�&Xk�1�S��<�]'����	��{<v�����^����&y��6�RS����I'����5��~�����N��5�-�64����;;r�z��������~�����{�c+�`^C<��S��6����6�oo�����y-	>��������@�P����s�� ��]}K`���	2�f��=���5����O�	4�`h<�&�x#��iM4��@�	6��l�'�O�	4�`h<�&�x�M���@�	6��l�'�O�	4�`h<�&�x�M���@�������	��IEND�B`�
Ashutosh_windowagg.pngimage/png; name=Ashutosh_windowagg.pngDownload
#12David Rowley
dgrowleyml@gmail.com
In reply to: David Rowley (#11)
4 attachment(s)
Re: Optimize WindowAgg's use of tuplestores

On Mon, 19 Aug 2024 at 22:01, David Rowley <dgrowleyml@gmail.com> wrote:

To try and move this forward again, I adjusted the patch to use a
static function with pg_noinline rather than unlikely. I don't think
this will make much difference code generation wise, but I did think
it was an improvement in code cleanliness. Patches attached.

I did a round of benchmarking on an AMD Zen4 7945hx and on an Apple
M2. I also graphed the results you sent so they're easier to compare
with mine.

0001 is effectively the unlikely() patch for calculating the frame offsets.
0002 is the tuplestore_reset() patch

I was experimenting with this again. The 0002 patch added a
next_partition field to the WindowAggState struct and caused the
struct to become slightly bigger. I've now included a 0003 patch
which shifts some fields around in that struct so as to keep it the
same size as it is on master. Benchmarking with that removes that very
tiny performance regression. Please see the attached CSV file for the
results. The percentage row compares master to all patches. I also
tested this on an AMD 3990x machine along with fresh results from the
AMD 7945hx laptop. Both of those machines come out faster on all tests
when comparing master to all 3 patches. With the Apple M2, there does
not seem to be much change in performance with the tests containing
fewer rows per partition, some are faster, some are slower, all within
typical noise fluctuations.

Given the performance now seems improved in all cases, I plan on
pushing this change as a single commit.

David

Attachments:

v4-0001-Speedup-WindowAgg-code-by-moving-uncommon-code-ou.patchapplication/octet-stream; name=v4-0001-Speedup-WindowAgg-code-by-moving-uncommon-code-ou.patchDownload
From 493675d093196d2df1a8e9fee781c2fcd8b80a87 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Mon, 19 Aug 2024 19:54:44 +1200
Subject: [PATCH v4 1/3] Speedup WindowAgg code by moving uncommon code
 out-of-line

The code to calculate the frame offsets is only performed once per scan.
Moving this code out of line gives a nice speedup to the WindowAgg code.
---
 src/backend/executor/nodeWindowAgg.c | 140 +++++++++++++++------------
 1 file changed, 78 insertions(+), 62 deletions(-)

diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c
index 3221fa1522..88a85f556b 100644
--- a/src/backend/executor/nodeWindowAgg.c
+++ b/src/backend/executor/nodeWindowAgg.c
@@ -2032,6 +2032,82 @@ update_grouptailpos(WindowAggState *winstate)
 	MemoryContextSwitchTo(oldcontext);
 }
 
+/*
+ * calculate_frame_offsets
+ *		Determine the startOffsetValue and endOffsetValue values for the
+ *		WindowAgg's frame options.
+ */
+static pg_noinline void
+calculate_frame_offsets(PlanState *pstate)
+{
+	WindowAggState *winstate = castNode(WindowAggState, pstate);
+	ExprContext *econtext;
+	int			frameOptions = winstate->frameOptions;
+	Datum		value;
+	bool		isnull;
+	int16		len;
+	bool		byval;
+
+	/* Ensure we've not been called before for this scan */
+	Assert(winstate->all_first);
+
+	econtext = winstate->ss.ps.ps_ExprContext;
+
+	if (frameOptions & FRAMEOPTION_START_OFFSET)
+	{
+		Assert(winstate->startOffset != NULL);
+		value = ExecEvalExprSwitchContext(winstate->startOffset,
+										  econtext,
+										  &isnull);
+		if (isnull)
+			ereport(ERROR,
+					(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+					 errmsg("frame starting offset must not be null")));
+		/* copy value into query-lifespan context */
+		get_typlenbyval(exprType((Node *) winstate->startOffset->expr),
+						&len,
+						&byval);
+		winstate->startOffsetValue = datumCopy(value, byval, len);
+		if (frameOptions & (FRAMEOPTION_ROWS | FRAMEOPTION_GROUPS))
+		{
+			/* value is known to be int8 */
+			int64		offset = DatumGetInt64(value);
+
+			if (offset < 0)
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+						 errmsg("frame starting offset must not be negative")));
+		}
+	}
+
+	if (frameOptions & FRAMEOPTION_END_OFFSET)
+	{
+		Assert(winstate->endOffset != NULL);
+		value = ExecEvalExprSwitchContext(winstate->endOffset,
+										  econtext,
+										  &isnull);
+		if (isnull)
+			ereport(ERROR,
+					(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
+					 errmsg("frame ending offset must not be null")));
+		/* copy value into query-lifespan context */
+		get_typlenbyval(exprType((Node *) winstate->endOffset->expr),
+						&len,
+						&byval);
+		winstate->endOffsetValue = datumCopy(value, byval, len);
+		if (frameOptions & (FRAMEOPTION_ROWS | FRAMEOPTION_GROUPS))
+		{
+			/* value is known to be int8 */
+			int64		offset = DatumGetInt64(value);
+
+			if (offset < 0)
+				ereport(ERROR,
+						(errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
+						 errmsg("frame ending offset must not be negative")));
+		}
+	}
+	winstate->all_first = false;
+}
 
 /* -----------------
  * ExecWindowAgg
@@ -2061,68 +2137,8 @@ ExecWindowAgg(PlanState *pstate)
 	 * rescan).  These are assumed to hold constant throughout the scan; if
 	 * user gives us a volatile expression, we'll only use its initial value.
 	 */
-	if (winstate->all_first)
-	{
-		int			frameOptions = winstate->frameOptions;
-		Datum		value;
-		bool		isnull;
-		int16		len;
-		bool		byval;
-
-		econtext = winstate->ss.ps.ps_ExprContext;
-
-		if (frameOptions & FRAMEOPTION_START_OFFSET)
-		{
-			Assert(winstate->startOffset != NULL);
-			value = ExecEvalExprSwitchContext(winstate->startOffset,
-											  econtext,
-											  &isnull);
-			if (isnull)
-				ereport(ERROR,
-						(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
-						 errmsg("frame starting offset must not be null")));
-			/* copy value into query-lifespan context */
-			get_typlenbyval(exprType((Node *) winstate->startOffset->expr),
-							&len, &byval);
-			winstate->startOffsetValue = datumCopy(value, byval, len);
-			if (frameOptions & (FRAMEOPTION_ROWS | FRAMEOPTION_GROUPS))
-			{
-				/* value is known to be int8 */
-				int64		offset = DatumGetInt64(value);
-
-				if (offset < 0)
-					ereport(ERROR,
-							(errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
-							 errmsg("frame starting offset must not be negative")));
-			}
-		}
-		if (frameOptions & FRAMEOPTION_END_OFFSET)
-		{
-			Assert(winstate->endOffset != NULL);
-			value = ExecEvalExprSwitchContext(winstate->endOffset,
-											  econtext,
-											  &isnull);
-			if (isnull)
-				ereport(ERROR,
-						(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
-						 errmsg("frame ending offset must not be null")));
-			/* copy value into query-lifespan context */
-			get_typlenbyval(exprType((Node *) winstate->endOffset->expr),
-							&len, &byval);
-			winstate->endOffsetValue = datumCopy(value, byval, len);
-			if (frameOptions & (FRAMEOPTION_ROWS | FRAMEOPTION_GROUPS))
-			{
-				/* value is known to be int8 */
-				int64		offset = DatumGetInt64(value);
-
-				if (offset < 0)
-					ereport(ERROR,
-							(errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE),
-							 errmsg("frame ending offset must not be negative")));
-			}
-		}
-		winstate->all_first = false;
-	}
+	if (unlikely(winstate->all_first))
+		calculate_frame_offsets(pstate);
 
 	/* We need to loop as the runCondition or qual may filter out tuples */
 	for (;;)
-- 
2.34.1

v4-0002-Optimize-WindowAgg-s-use-of-tuplestores.patchapplication/octet-stream; name=v4-0002-Optimize-WindowAgg-s-use-of-tuplestores.patchDownload
From 9c035e6e1621216e4f5db50954e9a093ee70e019 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Sun, 7 Jul 2024 22:19:18 +1200
Subject: [PATCH v4 2/3] Optimize WindowAgg's use of tuplestores

When WindowAgg finished one partition of a PARTITION BY, it previously
would call tuplestore_end() to purge all the stored tuples before again
calling tuplestore_begin_heap() and carefully setting up all of the
tuplestore read pointers exactly as required for the given frameOptions.
Since the frameOptions don't change between partitions, this part does
not make much sense.

It seems much better to create the tuplestore and the read pointers once
and simply call tuplestore_clear() at the end of each partition.
tuplestore_clear() moves all of the read pointers back to the start
position and removes all tuples.

A simple test query with 1 million partitions and 1 tuple per partition
has been shown to run around 44% faster than without this change.
---
 src/backend/executor/nodeWindowAgg.c | 162 ++++++++++++++++++---------
 src/include/nodes/execnodes.h        |   1 +
 2 files changed, 107 insertions(+), 56 deletions(-)

diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c
index 88a85f556b..51a6708a39 100644
--- a/src/backend/executor/nodeWindowAgg.c
+++ b/src/backend/executor/nodeWindowAgg.c
@@ -1074,57 +1074,24 @@ eval_windowfunction(WindowAggState *winstate, WindowStatePerFunc perfuncstate,
 }
 
 /*
- * begin_partition
- * Start buffering rows of the next partition.
+ * prepare_tuplestore
+ *		Prepare the tuplestore and all of the required read pointers for the
+ *		WindowAggState's frameOptions.
+ *
+ * Note: We use pg_noinline to avoid bloating the calling function with code
+ * which is only called once.
  */
-static void
-begin_partition(WindowAggState *winstate)
+static pg_noinline void
+prepare_tuplestore(WindowAggState *winstate)
 {
 	WindowAgg  *node = (WindowAgg *) winstate->ss.ps.plan;
-	PlanState  *outerPlan = outerPlanState(winstate);
 	int			frameOptions = winstate->frameOptions;
 	int			numfuncs = winstate->numfuncs;
-	int			i;
-
-	winstate->partition_spooled = false;
-	winstate->framehead_valid = false;
-	winstate->frametail_valid = false;
-	winstate->grouptail_valid = false;
-	winstate->spooled_rows = 0;
-	winstate->currentpos = 0;
-	winstate->frameheadpos = 0;
-	winstate->frametailpos = 0;
-	winstate->currentgroup = 0;
-	winstate->frameheadgroup = 0;
-	winstate->frametailgroup = 0;
-	winstate->groupheadpos = 0;
-	winstate->grouptailpos = -1;	/* see update_grouptailpos */
-	ExecClearTuple(winstate->agg_row_slot);
-	if (winstate->framehead_slot)
-		ExecClearTuple(winstate->framehead_slot);
-	if (winstate->frametail_slot)
-		ExecClearTuple(winstate->frametail_slot);
-
-	/*
-	 * If this is the very first partition, we need to fetch the first input
-	 * row to store in first_part_slot.
-	 */
-	if (TupIsNull(winstate->first_part_slot))
-	{
-		TupleTableSlot *outerslot = ExecProcNode(outerPlan);
 
-		if (!TupIsNull(outerslot))
-			ExecCopySlot(winstate->first_part_slot, outerslot);
-		else
-		{
-			/* outer plan is empty, so we have nothing to do */
-			winstate->partition_spooled = true;
-			winstate->more_partitions = false;
-			return;
-		}
-	}
+	/* we shouldn't be called if this was done already */
+	Assert(winstate->buffer == NULL);
 
-	/* Create new tuplestore for this partition */
+	/* Create new tuplestore */
 	winstate->buffer = tuplestore_begin_heap(false, false, work_mem);
 
 	/*
@@ -1158,16 +1125,10 @@ begin_partition(WindowAggState *winstate)
 
 		agg_winobj->readptr = tuplestore_alloc_read_pointer(winstate->buffer,
 															readptr_flags);
-		agg_winobj->markpos = -1;
-		agg_winobj->seekpos = -1;
-
-		/* Also reset the row counters for aggregates */
-		winstate->aggregatedbase = 0;
-		winstate->aggregatedupto = 0;
 	}
 
 	/* create mark and read pointers for each real window function */
-	for (i = 0; i < numfuncs; i++)
+	for (int i = 0; i < numfuncs; i++)
 	{
 		WindowStatePerFunc perfuncstate = &(winstate->perfunc[i]);
 
@@ -1179,8 +1140,6 @@ begin_partition(WindowAggState *winstate)
 															0);
 			winobj->readptr = tuplestore_alloc_read_pointer(winstate->buffer,
 															EXEC_FLAG_BACKWARD);
-			winobj->markpos = -1;
-			winobj->seekpos = -1;
 		}
 	}
 
@@ -1224,6 +1183,88 @@ begin_partition(WindowAggState *winstate)
 		winstate->grouptail_ptr =
 			tuplestore_alloc_read_pointer(winstate->buffer, 0);
 	}
+}
+
+/*
+ * begin_partition
+ * Start buffering rows of the next partition.
+ */
+static void
+begin_partition(WindowAggState *winstate)
+{
+	PlanState  *outerPlan = outerPlanState(winstate);
+	int			numfuncs = winstate->numfuncs;
+
+	winstate->partition_spooled = false;
+	winstate->framehead_valid = false;
+	winstate->frametail_valid = false;
+	winstate->grouptail_valid = false;
+	winstate->spooled_rows = 0;
+	winstate->currentpos = 0;
+	winstate->frameheadpos = 0;
+	winstate->frametailpos = 0;
+	winstate->currentgroup = 0;
+	winstate->frameheadgroup = 0;
+	winstate->frametailgroup = 0;
+	winstate->groupheadpos = 0;
+	winstate->grouptailpos = -1;	/* see update_grouptailpos */
+	ExecClearTuple(winstate->agg_row_slot);
+	if (winstate->framehead_slot)
+		ExecClearTuple(winstate->framehead_slot);
+	if (winstate->frametail_slot)
+		ExecClearTuple(winstate->frametail_slot);
+
+	/*
+	 * If this is the very first partition, we need to fetch the first input
+	 * row to store in first_part_slot.
+	 */
+	if (TupIsNull(winstate->first_part_slot))
+	{
+		TupleTableSlot *outerslot = ExecProcNode(outerPlan);
+
+		if (!TupIsNull(outerslot))
+			ExecCopySlot(winstate->first_part_slot, outerslot);
+		else
+		{
+			/* outer plan is empty, so we have nothing to do */
+			winstate->partition_spooled = true;
+			winstate->more_partitions = false;
+			return;
+		}
+	}
+
+	/* Create new tuplestore if not done already. */
+	if (unlikely(winstate->buffer == NULL))
+		prepare_tuplestore(winstate);
+
+	winstate->next_partition = false;
+
+	if (winstate->numaggs > 0)
+	{
+		WindowObject agg_winobj = winstate->agg_winobj;
+
+		/* reset mark and see positions for aggregate functions */
+		agg_winobj->markpos = -1;
+		agg_winobj->seekpos = -1;
+
+		/* Also reset the row counters for aggregates */
+		winstate->aggregatedbase = 0;
+		winstate->aggregatedupto = 0;
+	}
+
+	/* reset mark and seek positions for each real window function */
+	for (int i = 0; i < numfuncs; i++)
+	{
+		WindowStatePerFunc perfuncstate = &(winstate->perfunc[i]);
+
+		if (!perfuncstate->plain_agg)
+		{
+			WindowObject winobj = perfuncstate->winobj;
+
+			winobj->markpos = -1;
+			winobj->seekpos = -1;
+		}
+	}
 
 	/*
 	 * Store the first tuple into the tuplestore (it's always available now;
@@ -1360,9 +1401,9 @@ release_partition(WindowAggState *winstate)
 	}
 
 	if (winstate->buffer)
-		tuplestore_end(winstate->buffer);
-	winstate->buffer = NULL;
+		tuplestore_clear(winstate->buffer);
 	winstate->partition_spooled = false;
+	winstate->next_partition = true;
 }
 
 /*
@@ -2143,7 +2184,7 @@ ExecWindowAgg(PlanState *pstate)
 	/* We need to loop as the runCondition or qual may filter out tuples */
 	for (;;)
 	{
-		if (winstate->buffer == NULL)
+		if (winstate->next_partition)
 		{
 			/* Initialize for first partition and set current row = 0 */
 			begin_partition(winstate);
@@ -2686,6 +2727,7 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags)
 	winstate->all_first = true;
 	winstate->partition_spooled = false;
 	winstate->more_partitions = false;
+	winstate->next_partition = true;
 
 	return winstate;
 }
@@ -2700,6 +2742,14 @@ ExecEndWindowAgg(WindowAggState *node)
 	PlanState  *outerPlan;
 	int			i;
 
+	if (node->buffer != NULL)
+	{
+		tuplestore_end(node->buffer);
+
+		/* nullify so that release_partition skips the tuplestore_clear() */
+		node->buffer = NULL;
+	}
+
 	release_partition(node);
 
 	for (i = 0; i < node->numaggs; i++)
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index af7d8fd1e7..add76b7eb5 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -2644,6 +2644,7 @@ typedef struct WindowAggState
 	bool		all_first;		/* true if the scan is starting */
 	bool		partition_spooled;	/* true if all tuples in current partition
 									 * have been spooled into tuplestore */
+	bool		next_partition; /* true if begin_partition needs to be called */
 	bool		more_partitions;	/* true if there's more partitions after
 									 * this one */
 	bool		framehead_valid;	/* true if frameheadpos is known up to
-- 
2.34.1

v4-0003-Experiment-with-WindowAggState-fields.patchapplication/octet-stream; name=v4-0003-Experiment-with-WindowAggState-fields.patchDownload
From 2e44b2be201ae44cb8a19a78d0af94250f683f52 Mon Sep 17 00:00:00 2001
From: David Rowley <dgrowley@gmail.com>
Date: Thu, 5 Sep 2024 00:47:51 +1200
Subject: [PATCH v4 3/3] Experiment with WindowAggState fields

---
 src/include/nodes/execnodes.h | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index add76b7eb5..627f99c13d 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -2619,6 +2619,17 @@ typedef struct WindowAggState
 	bool		inRangeAsc;		/* use ASC sort order for in_range tests? */
 	bool		inRangeNullsFirst;	/* nulls sort first for in_range tests? */
 
+	/* fields relating to runconditions */
+	bool		use_pass_through;	/* When false, stop execution when
+									 * runcondition is no longer true.  Else
+									 * just stop evaluating window funcs. */
+	bool		top_window;		/* true if this is the top-most WindowAgg or
+								 * the only WindowAgg in this query level */
+	ExprState  *runcondition;	/* Condition which must remain true otherwise
+								 * execution of the WindowAgg will finish or
+								 * go into pass-through mode.  NULL when there
+								 * is no such condition. */
+
 	/* these fields are used in GROUPS mode: */
 	int64		currentgroup;	/* peer group # of current row in partition */
 	int64		frameheadgroup; /* peer group # of frame head row */
@@ -2631,16 +2642,6 @@ typedef struct WindowAggState
 	MemoryContext curaggcontext;	/* current aggregate's working data */
 	ExprContext *tmpcontext;	/* short-term evaluation context */
 
-	ExprState  *runcondition;	/* Condition which must remain true otherwise
-								 * execution of the WindowAgg will finish or
-								 * go into pass-through mode.  NULL when there
-								 * is no such condition. */
-
-	bool		use_pass_through;	/* When false, stop execution when
-									 * runcondition is no longer true.  Else
-									 * just stop evaluating window funcs. */
-	bool		top_window;		/* true if this is the top-most WindowAgg or
-								 * the only WindowAgg in this query level */
 	bool		all_first;		/* true if the scan is starting */
 	bool		partition_spooled;	/* true if all tuples in current partition
 									 * have been spooled into tuplestore */
-- 
2.34.1

performance_results.csvtext/csv; charset=US-ASCII; name=performance_results.csvDownload
#13Ashutosh Bapat
ashutosh.bapat.oss@gmail.com
In reply to: David Rowley (#12)
Re: Optimize WindowAgg's use of tuplestores

On Wed, Sep 4, 2024 at 8:20 PM David Rowley <dgrowleyml@gmail.com> wrote:

On Mon, 19 Aug 2024 at 22:01, David Rowley <dgrowleyml@gmail.com> wrote:

To try and move this forward again, I adjusted the patch to use a
static function with pg_noinline rather than unlikely. I don't think
this will make much difference code generation wise, but I did think
it was an improvement in code cleanliness. Patches attached.

I did a round of benchmarking on an AMD Zen4 7945hx and on an Apple
M2. I also graphed the results you sent so they're easier to compare
with mine.

0001 is effectively the unlikely() patch for calculating the frame offsets.
0002 is the tuplestore_reset() patch

I was experimenting with this again. The 0002 patch added a
next_partition field to the WindowAggState struct and caused the
struct to become slightly bigger. I've now included a 0003 patch
which shifts some fields around in that struct so as to keep it the
same size as it is on master. Benchmarking with that removes that very
tiny performance regression.

If patches are applied in the same sequence as yours, the size of
WindowAggState struct goes from 632 to 640 and then back to 632 on my
laptop. That looks a tiny but nice improvement by itself.

If the patches are applied in the order 0001, 0003 and 0002, the size
of the structure remains 632 throughout. Patch 0003 does not affect
the size of the structure by itself.

I also
tested this on an AMD 3990x machine along with fresh results from the
AMD 7945hx laptop. Both of those machines come out faster on all tests
when comparing master to all 3 patches. With the Apple M2, there does
not seem to be much change in performance with the tests containing
fewer rows per partition, some are faster, some are slower, all within
typical noise fluctuations.

I have similar observations as yours on my amd64 laptop. I also
verified that 0003 by itself is not effective. This indicates that the
(atleast some of the) regression caused by 0002 comes from larger
structure. Why would that happen?

Given the performance now seems improved in all cases, I plan on
pushing this change as a single commit.

Agreed. I will review the code in detail by next week.

--
Best Wishes,
Ashutosh Bapat

#14David Rowley
dgrowleyml@gmail.com
In reply to: Ashutosh Bapat (#13)
Re: Optimize WindowAgg's use of tuplestores

On Fri, 6 Sept 2024 at 18:30, Ashutosh Bapat
<ashutosh.bapat.oss@gmail.com> wrote:

If the patches are applied in the order 0001, 0003 and 0002, the size
of the structure remains 632 throughout. Patch 0003 does not affect
the size of the structure by itself.

Yeah. I kept 0003 separate so it could be easily tested independently.

I have similar observations as yours on my amd64 laptop. I also
verified that 0003 by itself is not effective. This indicates that the
(atleast some of the) regression caused by 0002 comes from larger
structure. Why would that happen?

I don't know the exact reason, but it could be something as simple as
having to load an additional cacheline that we previously didn't need
to load. Or, perhaps more cachelines are being modified and that slows
down some cache eviction code. The PostgreSQL executor isn't very
friendly to CPU caches as we do tuple-at-a-time execution and
continually switch to other nodes. That requires accessing executor
states only briefly before switching to another node to bubble tuples
to the top of the plan.

Given the performance now seems improved in all cases, I plan on
pushing this change as a single commit.

Agreed. I will review the code in detail by next week.

Thanks, but I've already pushed these patches. I ended up pushing
v4-0001 as a separate commit. v4-0002 and v4-0003 went in as one. Feel
free to still have a look though.

David