WIP: bloom filter in Hash Joins with batches

Started by Tomas Vondraabout 10 years ago26 messages
#1Tomas Vondra
tomas.vondra@2ndquadrant.com
4 attachment(s)

Hi,

while working on the Hash Join improvements, I've been repeatedly
running into the idea of bloom filter - various papers on hash joins
mention bloom filters as a way to optimize access to the hash table by
doing fewer lookups, etc.

Sadly, I've been unable to actually see any real benefit of using a
bloom filter, which I believe is mostly due to NTUP_PER_BUCKET=1, which
makes the lookups much more efficient (so the room for bloom filter
improvements is narrow).

The one case where bloom filter might still help, and that's when the
bloom filter fits into L3 cache (a few MBs) while the hash table (or
more accurately the buckets) do not. Then there's a chance that the
bloom filter (which needs to do multiple lookups) might help.

But I think there's another case where bloom filter might be way more
useful in Hash Join - when we do batching. What we do currently is that
we simply

1) build the batches for the hash table (inner relation)

2) read the outer relation (usually the larger one), and split it
into batches just like the hash table

3) while doing (2) we join the first batch, and write the remaining
batches to disk (temporary files)

4) we read the batches one by one (for both tables) and do the join

Now, imagine that only some of the rows in the outer table actually
match a row in the hash table. Currently, we do write those rows into
the temporary file, but with a bloom filter on the whole hash table (all
the batches at once) we can skip that for some types of joins.

For inner join we can immediately discard the outer row, for left join
we can immediately output the row. In both cases we can completely
eliminate the overhead with writing the tuple to the temporary file and
then reading it again.

The attached patch is a PoC of this approach - I'm pretty sure it's not
perfectly correct (e.g. I only tried it with inner join), but it's good
enough for demonstrating the benefits. It's rather incomplete (see the
end of this e-mail), and I'm mostly soliciting some early feedback at
this point.

The numbers presented here are for a test case like this:

CREATE TABLE dim (id INT, dval TEXT);
CREATE TABLE fact (id INT, fval TEXT);

INSERT INTO dim SELECT i, md5(i::text)
FROM generate_series(1,10000000) s(i);

-- repeat 10x
INSERT INTO fact SELECT * FROM dim;

and a query like this

SELECT COUNT(fval) FROM fact JOIN dim USING (id) WHERE dval < 'a';

with different values in the WHERE condition to select a fraction of the
inner 'dim' table - this directly affects what portion of the 'fact'
table has a matching row, and also the size of the hash table (and
number of batches).

Now, some numbers from a machine with 8GB of RAM (the 'fact' table has
~6.5GB of data, so there's actually quite a bit of memory pressure,
forcing the temp files to disk etc.).

With work_mem=16MB, it looks like this:

batches filter select. bloom master bloom/master
-----------------------------------------------------------
4 1 6.25% 23871 48631 49.09%
8 2 12.50% 25752 56692 45.42%
8 3 18.75% 31273 57455 54.43%
16 4 25.01% 37430 62325 60.06%
16 5 31.25% 39005 61143 63.79%
16 6 37.50% 46157 63533 72.65%
16 7 43.75% 53500 65483 81.70%
32 8 49.99% 53952 65730 82.08%
32 9 56.23% 55187 67521 81.73%
32 a 62.49% 64454 69448 92.81%
32 b 68.73% 66937 71692 93.37%
32 c 74.97% 73323 72060 101.75%
32 d 81.23% 76703 73513 104.34%
32 e 87.48% 81970 74890 109.45%
32 f 93.74% 86102 76257 112.91%

The 'batches' means how many batches were used for the join, 'filter' is
the value used in the WHERE condition, selectivity is the fraction of
the 'dim' table that matches the condition (and also the 'fact'). Bloom
and master are timings of the query in miliseconds, and bloom/master is
comparison of the runtimes - so for example 49% means the hash join with
bloom filter was running ~2x as fast.

Admittedly, work_mem=16MB is quite low, but that's just a way to force
batching. What really matters is the number of batches and selectivity
(how many tuples we can eliminate using the bloom filter).

For work_mem=64MB it looks like this:

batches filter select. bloom master bloom/master
-----------------------------------------------------------
1 1 6.25% 24846 23854 104.16%
2 2 12.50% 24369 45672 53.36%
2 3 18.75% 30432 47454 64.13%
4 4 25.01% 36175 59741 60.55%
4 5 31.25% 43103 62631 68.82%
4 6 37.50% 48179 64079 75.19%

So initially it's a bit slower (it's not doing any batching in this
case, but the code is a bit silly and while not building the bloom
filter it still does some checks). But once we start batching, it gets
2x as fast again, and then slowly degrades as the selectivity increases.

Attached is a spreadsheet with results for various work_mem values, and
also with a smaller data set (just 30M rows in the fact table), which
easily fits into memory. Yet it shows similar gains, shaving off ~40% in
the best case, suggesting that this is not just thanks to reduction of
I/O when forcing the temp files to disk.

As I mentioned, the patch is incomplete in several ways:

1) It does not count the bloom filter (which may be quite big) into
work_mem properly.

2) It probably does not work for outer joins at this point.

3) Currently the bloom filter is used whenever we do batching, but it
should really be driven by selectivity too - it'd be good to (a)
estimate the fraction of 'fact' tuples having a match in the hash
table, and not to do bloom if it's over ~60% or so. Also, maybe
the could should count the matches at runtime, and disable the
bloom filter if we reach some threshold.

But overall, this seems like a nice optimization opportunity for hash
joins on large data sets, where batching is necessary.

Ideas?

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

hashjoin-bloom.sqlapplication/sql; name=hashjoin-bloom.sqlDownload
bloom-hashjoin-v1.patchtext/x-diff; name=bloom-hashjoin-v1.patchDownload
diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c
index 5e05ec3..aad5e98 100644
--- a/src/backend/executor/nodeHash.c
+++ b/src/backend/executor/nodeHash.c
@@ -36,6 +36,7 @@
 #include "utils/memutils.h"
 #include "utils/lsyscache.h"
 #include "utils/syscache.h"
+#include "utils/murmur3.h"
 
 
 static void ExecHashIncreaseNumBatches(HashJoinTable hashtable);
@@ -47,9 +48,16 @@ static void ExecHashSkewTableInsert(HashJoinTable hashtable,
 						uint32 hashvalue,
 						int bucketNumber);
 static void ExecHashRemoveNextSkewBucket(HashJoinTable hashtable);
+static void ExecHashBloomAddValue(HashJoinTable hashtable, uint32 hashvalue);
 
 static void *dense_alloc(HashJoinTable hashtable, Size size);
 
+static BloomFilter BloomFilterInit(double nrows, double error);
+
+/* let's shoot for 5% false positives error rate (arbitrary value) */
+#define BLOOM_ERROR_RATE 0.05
+
+
 /* ----------------------------------------------------------------
  *		ExecHash
  *
@@ -112,6 +120,8 @@ MultiExecHash(HashState *node)
 		{
 			int			bucketNumber;
 
+			ExecHashBloomAddValue(hashtable, hashvalue);
+
 			bucketNumber = ExecHashGetSkewBucket(hashtable, hashvalue);
 			if (bucketNumber != INVALID_SKEW_BUCKET_NO)
 			{
@@ -310,6 +320,11 @@ ExecHashTableCreate(Hash *node, List *hashOperators, bool keepNulls)
 	hashtable->spaceAllowedSkew =
 		hashtable->spaceAllowed * SKEW_WORK_MEM_PERCENT / 100;
 	hashtable->chunks = NULL;
+	hashtable->bloomFilter = NULL;
+
+	/* do bloom filter only when batching */
+	if (nbatch > 1)
+		hashtable->bloomFilter = BloomFilterInit(outerNode->plan_rows, BLOOM_ERROR_RATE);
 
 	/*
 	 * Get info about the hash functions to be used for each hash key. Also
@@ -602,6 +617,7 @@ ExecHashIncreaseNumBatches(HashJoinTable hashtable)
 	long		ninmemory;
 	long		nfreed;
 	HashMemoryChunk oldchunks;
+	bool		build_bloom_filter = false;
 
 	/* do nothing if we've decided to shut off growth */
 	if (!hashtable->growEnabled)
@@ -667,6 +683,36 @@ ExecHashIncreaseNumBatches(HashJoinTable hashtable)
 								sizeof(HashJoinTuple) * hashtable->nbuckets);
 	}
 
+	/* if we're switching to batched mode, we need to build the bloom filter */
+	if (oldnbatch == 1)
+	{
+		/*
+		 * We can't use outerNode->plan_rows here, firstly because we don't
+		 * have access to it, but most importantly because it's inaccurate
+		 * anyway (we've expected to do no batching based on the value). So
+		 * we'll just use double the number of entries in the hash table.
+		 *
+		 * We also need to make sure we added the hash values into the bloom
+		 * filter in this case (that's what build_bloom_filter is for).
+		 *
+		 * XXX Maybe we should be more pessimistic and use a higher values,
+		 *     in case we need to further increment the number of batches.
+		 *
+		 * XXX We also need to set some maximum number of tuples when the
+		 *     false positive rate gets too bad, and stop using the bloom
+		 *     filter if we reach it (we can't resize the filter).
+		 *
+		 * XXX There was a paper about adding a larger bloom filter once
+		 *     we fill the existing one, and using them at the same time.
+		 *     Might be worth implementing if the whole bloom filter idea
+		 *     works in general.
+		 */
+		hashtable->bloomFilter
+			= BloomFilterInit(2 * hashtable->totalTuples, BLOOM_ERROR_RATE);
+
+		build_bloom_filter = true;
+	}
+
 	/*
 	 * We will scan through the chunks directly, so that we can reset the
 	 * buckets now and not have to keep track which tuples in the buckets have
@@ -697,6 +743,9 @@ ExecHashIncreaseNumBatches(HashJoinTable hashtable)
 			ExecHashGetBucketAndBatch(hashtable, hashTuple->hashvalue,
 									  &bucketno, &batchno);
 
+			if (build_bloom_filter)
+				ExecHashBloomAddValue(hashtable, hashTuple->hashvalue);
+
 			if (batchno == curbatch)
 			{
 				/* keep tuple in memory - copy it into the new chunk */
@@ -1705,3 +1754,78 @@ dense_alloc(HashJoinTable hashtable, Size size)
 	/* return pointer to the start of the tuple memory */
 	return ptr;
 }
+
+static void
+ExecHashBloomAddValue(HashJoinTable hashtable, uint32 hashvalue)
+{
+	int			i, byteIdx, bitIdx;
+	BloomFilter	filter = hashtable->bloomFilter;
+
+	if (! filter)
+		return;
+
+	if (hashtable->curbatch > 0)
+		return;
+
+	Assert(hashtable->nbatch > 1);	/* nbatch=1 implies bloomData=NULL */
+
+	for (i = 0; i < filter->nhashes; i++)
+	{
+		uint32_t seed = i;
+		uint32_t hash = 0;
+
+		MurmurHash3_x86_32(&hashvalue, sizeof(uint32), seed, &hash);
+
+		hash = hash % filter->nbits;
+
+		byteIdx = (hash / 8);
+		bitIdx = (hash % 8);
+
+		filter->data[byteIdx] |= (0x01 << bitIdx);
+	}
+}
+
+bool
+ExecHashBloomCheckValue(HashJoinTable hashtable, uint32 hashvalue)
+{
+	int			i, byteIdx, bitIdx;
+	BloomFilter	filter = hashtable->bloomFilter;
+
+	if (! filter)
+		return true;
+
+	for (i = 0; i < filter->nhashes; i++)
+	{
+		uint32_t seed = i;
+		uint32_t hash = 0;
+
+		MurmurHash3_x86_32(&hashvalue, sizeof(uint32), seed, &hash);
+
+		hash = hash % filter->nbits;
+
+		byteIdx = (hash / 8);
+		bitIdx = (hash % 8);
+
+		if (! (filter->data[byteIdx] & (0x01 << bitIdx)))
+			return false;
+	}
+
+	return true;
+}
+
+static BloomFilter
+BloomFilterInit(double nrows, double error)
+{
+	/* perhaps we should round nbits to multiples of 8 ? */
+	int nbits = ceil((nrows * log(error)) / log(1.0 / (pow(2.0, log(2.0)))));
+	int nhashes = round(log(2.0) * nbits / nrows);
+
+	BloomFilter filter = palloc0(offsetof(BloomFilterData, data) + ((nbits + 7) / 8));
+
+	filter->nbits = nbits;
+	filter->nhashes = nhashes;
+
+	elog(WARNING, "bloom filter: %d bits (%d bytes), %d hashes", nbits, (nbits + 7) / 8, nhashes);
+
+	return filter;
+}
diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c
index 1d78cdf..708877e 100644
--- a/src/backend/executor/nodeHashjoin.c
+++ b/src/backend/executor/nodeHashjoin.c
@@ -48,7 +48,6 @@ static TupleTableSlot *ExecHashJoinGetSavedTuple(HashJoinState *hjstate,
 						  TupleTableSlot *tupleSlot);
 static bool ExecHashJoinNewBatch(HashJoinState *hjstate);
 
-
 /* ----------------------------------------------------------------
  *		ExecHashJoin
  *
@@ -210,6 +209,7 @@ ExecHashJoin(HashJoinState *node)
 				outerTupleSlot = ExecHashJoinOuterGetTuple(outerNode,
 														   node,
 														   &hashvalue);
+
 				if (TupIsNull(outerTupleSlot))
 				{
 					/* end of batch, or maybe whole join */
@@ -224,6 +224,19 @@ ExecHashJoin(HashJoinState *node)
 					continue;
 				}
 
+				/* If still in the first batch, we check the bloom filter. */
+				if (hashtable->curbatch == 0)
+				{
+					node->hj_BloomLookups += 1;
+
+					if (! ExecHashBloomCheckValue(hashtable, hashvalue))
+					{
+						/* Loop around, staying in HJ_NEED_NEW_OUTER state */
+						node->hj_BloomEliminated += 1;
+						continue;
+					}
+				}
+
 				econtext->ecxt_outertuple = outerTupleSlot;
 				node->hj_MatchedOuter = false;
 
@@ -423,6 +436,9 @@ ExecHashJoin(HashJoinState *node)
 					 (int) node->hj_JoinState);
 		}
 	}
+
+	elog(WARNING, "bloom filter lookups=%lu eliminated=%lu",
+				  node->hj_BloomLookups, node->hj_BloomEliminated);
 }
 
 /* ----------------------------------------------------------------
@@ -591,6 +607,9 @@ ExecInitHashJoin(HashJoin *node, EState *estate, int eflags)
 	hjstate->hj_MatchedOuter = false;
 	hjstate->hj_OuterNotEmpty = false;
 
+	hjstate->hj_BloomLookups = 0;
+	hjstate->hj_BloomEliminated = 0;
+
 	return hjstate;
 }
 
@@ -629,6 +648,9 @@ ExecEndHashJoin(HashJoinState *node)
 	 */
 	ExecEndNode(outerPlanState(node));
 	ExecEndNode(innerPlanState(node));
+	
+	elog(WARNING, "bloom filter lookups=%lu eliminated=%lu",
+				  node->hj_BloomLookups, node->hj_BloomEliminated);
 }
 
 /*
diff --git a/src/backend/utils/adt/Makefile b/src/backend/utils/adt/Makefile
index 2cb7bab..365123b 100644
--- a/src/backend/utils/adt/Makefile
+++ b/src/backend/utils/adt/Makefile
@@ -16,7 +16,7 @@ OBJS = acl.o arrayfuncs.o array_expanded.o array_selfuncs.o \
 	float.o format_type.o formatting.o genfile.o \
 	geo_ops.o geo_selfuncs.o inet_cidr_ntop.o inet_net_pton.o int.o \
 	int8.o json.o jsonb.o jsonb_gin.o jsonb_op.o jsonb_util.o \
-	jsonfuncs.o like.o lockfuncs.o mac.o misc.o nabstime.o name.o \
+	jsonfuncs.o like.o lockfuncs.o mac.o misc.o murmur3.o nabstime.o name.o \
 	network.o network_gist.o network_selfuncs.o \
 	numeric.o numutils.o oid.o oracle_compat.o \
 	orderedsetaggs.o pg_locale.o pg_lsn.o pg_upgrade_support.o \
diff --git a/src/backend/utils/adt/murmur3.c b/src/backend/utils/adt/murmur3.c
new file mode 100644
index 0000000..764aeab
--- /dev/null
+++ b/src/backend/utils/adt/murmur3.c
@@ -0,0 +1,315 @@
+//-----------------------------------------------------------------------------
+// MurmurHash3 was written by Austin Appleby, and is placed in the public
+// domain. The author hereby disclaims copyright to this source code.
+
+// Note - The x86 and x64 versions do _not_ produce the same results, as the
+// algorithms are optimized for their respective platforms. You can still
+// compile and run any of them on any platform, but your performance with the
+// non-native version will be less than optimal.
+
+#include "utils/murmur3.h"
+
+//-----------------------------------------------------------------------------
+// Platform-specific functions and macros
+
+#ifdef __GNUC__
+#define FORCE_INLINE __attribute__((always_inline)) inline
+#else
+#define FORCE_INLINE inline
+#endif
+
+static FORCE_INLINE uint32_t rotl32 ( uint32_t x, int8_t r )
+{
+  return (x << r) | (x >> (32 - r));
+}
+
+static FORCE_INLINE uint64_t rotl64 ( uint64_t x, int8_t r )
+{
+  return (x << r) | (x >> (64 - r));
+}
+
+#define	ROTL32(x,y)	rotl32(x,y)
+#define ROTL64(x,y)	rotl64(x,y)
+
+#define BIG_CONSTANT(x) (x##LLU)
+
+//-----------------------------------------------------------------------------
+// Block read - if your platform needs to do endian-swapping or can only
+// handle aligned reads, do the conversion here
+
+#define getblock(p, i) (p[i])
+
+//-----------------------------------------------------------------------------
+// Finalization mix - force all bits of a hash block to avalanche
+
+static FORCE_INLINE uint32_t fmix32 ( uint32_t h )
+{
+  h ^= h >> 16;
+  h *= 0x85ebca6b;
+  h ^= h >> 13;
+  h *= 0xc2b2ae35;
+  h ^= h >> 16;
+
+  return h;
+}
+
+//----------
+
+static FORCE_INLINE uint64_t fmix64 ( uint64_t k )
+{
+  k ^= k >> 33;
+  k *= BIG_CONSTANT(0xff51afd7ed558ccd);
+  k ^= k >> 33;
+  k *= BIG_CONSTANT(0xc4ceb9fe1a85ec53);
+  k ^= k >> 33;
+
+  return k;
+}
+
+//-----------------------------------------------------------------------------
+
+void MurmurHash3_x86_32 ( const void * key, int len,
+                          uint32_t seed, void * out )
+{
+  const uint8_t * data = (const uint8_t*)key;
+  const int nblocks = len / 4;
+  int i;
+
+  uint32_t h1 = seed;
+
+  uint32_t c1 = 0xcc9e2d51;
+  uint32_t c2 = 0x1b873593;
+
+  //----------
+  // body
+
+  const uint32_t * blocks = (const uint32_t *)(data + nblocks*4);
+
+  for(i = -nblocks; i; i++)
+  {
+    uint32_t k1 = getblock(blocks,i);
+
+    k1 *= c1;
+    k1 = ROTL32(k1,15);
+    k1 *= c2;
+    
+    h1 ^= k1;
+    h1 = ROTL32(h1,13); 
+    h1 = h1*5+0xe6546b64;
+  }
+
+  //----------
+  // tail
+
+  const uint8_t * tail = (const uint8_t*)(data + nblocks*4);
+
+  uint32_t k1 = 0;
+
+  switch(len & 3)
+  {
+  case 3: k1 ^= tail[2] << 16;
+  case 2: k1 ^= tail[1] << 8;
+  case 1: k1 ^= tail[0];
+          k1 *= c1; k1 = ROTL32(k1,15); k1 *= c2; h1 ^= k1;
+  };
+
+  //----------
+  // finalization
+
+  h1 ^= len;
+
+  h1 = fmix32(h1);
+
+  *(uint32_t*)out = h1;
+} 
+
+//-----------------------------------------------------------------------------
+
+void MurmurHash3_x86_128 ( const void * key, const int len,
+                           uint32_t seed, void * out )
+{
+  const uint8_t * data = (const uint8_t*)key;
+  const int nblocks = len / 16;
+  int i;
+
+  uint32_t h1 = seed;
+  uint32_t h2 = seed;
+  uint32_t h3 = seed;
+  uint32_t h4 = seed;
+
+  uint32_t c1 = 0x239b961b; 
+  uint32_t c2 = 0xab0e9789;
+  uint32_t c3 = 0x38b34ae5; 
+  uint32_t c4 = 0xa1e38b93;
+
+  //----------
+  // body
+
+  const uint32_t * blocks = (const uint32_t *)(data + nblocks*16);
+
+  for(i = -nblocks; i; i++)
+  {
+    uint32_t k1 = getblock(blocks,i*4+0);
+    uint32_t k2 = getblock(blocks,i*4+1);
+    uint32_t k3 = getblock(blocks,i*4+2);
+    uint32_t k4 = getblock(blocks,i*4+3);
+
+    k1 *= c1; k1  = ROTL32(k1,15); k1 *= c2; h1 ^= k1;
+
+    h1 = ROTL32(h1,19); h1 += h2; h1 = h1*5+0x561ccd1b;
+
+    k2 *= c2; k2  = ROTL32(k2,16); k2 *= c3; h2 ^= k2;
+
+    h2 = ROTL32(h2,17); h2 += h3; h2 = h2*5+0x0bcaa747;
+
+    k3 *= c3; k3  = ROTL32(k3,17); k3 *= c4; h3 ^= k3;
+
+    h3 = ROTL32(h3,15); h3 += h4; h3 = h3*5+0x96cd1c35;
+
+    k4 *= c4; k4  = ROTL32(k4,18); k4 *= c1; h4 ^= k4;
+
+    h4 = ROTL32(h4,13); h4 += h1; h4 = h4*5+0x32ac3b17;
+  }
+
+  //----------
+  // tail
+
+  const uint8_t * tail = (const uint8_t*)(data + nblocks*16);
+
+  uint32_t k1 = 0;
+  uint32_t k2 = 0;
+  uint32_t k3 = 0;
+  uint32_t k4 = 0;
+
+  switch(len & 15)
+  {
+  case 15: k4 ^= tail[14] << 16;
+  case 14: k4 ^= tail[13] << 8;
+  case 13: k4 ^= tail[12] << 0;
+           k4 *= c4; k4  = ROTL32(k4,18); k4 *= c1; h4 ^= k4;
+
+  case 12: k3 ^= tail[11] << 24;
+  case 11: k3 ^= tail[10] << 16;
+  case 10: k3 ^= tail[ 9] << 8;
+  case  9: k3 ^= tail[ 8] << 0;
+           k3 *= c3; k3  = ROTL32(k3,17); k3 *= c4; h3 ^= k3;
+
+  case  8: k2 ^= tail[ 7] << 24;
+  case  7: k2 ^= tail[ 6] << 16;
+  case  6: k2 ^= tail[ 5] << 8;
+  case  5: k2 ^= tail[ 4] << 0;
+           k2 *= c2; k2  = ROTL32(k2,16); k2 *= c3; h2 ^= k2;
+
+  case  4: k1 ^= tail[ 3] << 24;
+  case  3: k1 ^= tail[ 2] << 16;
+  case  2: k1 ^= tail[ 1] << 8;
+  case  1: k1 ^= tail[ 0] << 0;
+           k1 *= c1; k1  = ROTL32(k1,15); k1 *= c2; h1 ^= k1;
+  };
+
+  //----------
+  // finalization
+
+  h1 ^= len; h2 ^= len; h3 ^= len; h4 ^= len;
+
+  h1 += h2; h1 += h3; h1 += h4;
+  h2 += h1; h3 += h1; h4 += h1;
+
+  h1 = fmix32(h1);
+  h2 = fmix32(h2);
+  h3 = fmix32(h3);
+  h4 = fmix32(h4);
+
+  h1 += h2; h1 += h3; h1 += h4;
+  h2 += h1; h3 += h1; h4 += h1;
+
+  ((uint32_t*)out)[0] = h1;
+  ((uint32_t*)out)[1] = h2;
+  ((uint32_t*)out)[2] = h3;
+  ((uint32_t*)out)[3] = h4;
+}
+
+//-----------------------------------------------------------------------------
+
+void MurmurHash3_x64_128 ( const void * key, const int len,
+                           const uint32_t seed, void * out )
+{
+  const uint8_t * data = (const uint8_t*)key;
+  const int nblocks = len / 16;
+  int i;
+
+  uint64_t h1 = seed;
+  uint64_t h2 = seed;
+
+  uint64_t c1 = BIG_CONSTANT(0x87c37b91114253d5);
+  uint64_t c2 = BIG_CONSTANT(0x4cf5ad432745937f);
+
+  //----------
+  // body
+
+  const uint64_t * blocks = (const uint64_t *)(data);
+
+  for(i = 0; i < nblocks; i++)
+  {
+    uint64_t k1 = getblock(blocks,i*2+0);
+    uint64_t k2 = getblock(blocks,i*2+1);
+
+    k1 *= c1; k1  = ROTL64(k1,31); k1 *= c2; h1 ^= k1;
+
+    h1 = ROTL64(h1,27); h1 += h2; h1 = h1*5+0x52dce729;
+
+    k2 *= c2; k2  = ROTL64(k2,33); k2 *= c1; h2 ^= k2;
+
+    h2 = ROTL64(h2,31); h2 += h1; h2 = h2*5+0x38495ab5;
+  }
+
+  //----------
+  // tail
+
+  const uint8_t * tail = (const uint8_t*)(data + nblocks*16);
+
+  uint64_t k1 = 0;
+  uint64_t k2 = 0;
+
+  switch(len & 15)
+  {
+  case 15: k2 ^= (uint64_t)(tail[14]) << 48;
+  case 14: k2 ^= (uint64_t)(tail[13]) << 40;
+  case 13: k2 ^= (uint64_t)(tail[12]) << 32;
+  case 12: k2 ^= (uint64_t)(tail[11]) << 24;
+  case 11: k2 ^= (uint64_t)(tail[10]) << 16;
+  case 10: k2 ^= (uint64_t)(tail[ 9]) << 8;
+  case  9: k2 ^= (uint64_t)(tail[ 8]) << 0;
+           k2 *= c2; k2  = ROTL64(k2,33); k2 *= c1; h2 ^= k2;
+
+  case  8: k1 ^= (uint64_t)(tail[ 7]) << 56;
+  case  7: k1 ^= (uint64_t)(tail[ 6]) << 48;
+  case  6: k1 ^= (uint64_t)(tail[ 5]) << 40;
+  case  5: k1 ^= (uint64_t)(tail[ 4]) << 32;
+  case  4: k1 ^= (uint64_t)(tail[ 3]) << 24;
+  case  3: k1 ^= (uint64_t)(tail[ 2]) << 16;
+  case  2: k1 ^= (uint64_t)(tail[ 1]) << 8;
+  case  1: k1 ^= (uint64_t)(tail[ 0]) << 0;
+           k1 *= c1; k1  = ROTL64(k1,31); k1 *= c2; h1 ^= k1;
+  };
+
+  //----------
+  // finalization
+
+  h1 ^= len; h2 ^= len;
+
+  h1 += h2;
+  h2 += h1;
+
+  h1 = fmix64(h1);
+  h2 = fmix64(h2);
+
+  h1 += h2;
+  h2 += h1;
+
+  ((uint64_t*)out)[0] = h1;
+  ((uint64_t*)out)[1] = h2;
+}
+
+//-----------------------------------------------------------------------------
+
diff --git a/src/include/executor/hashjoin.h b/src/include/executor/hashjoin.h
index 7a51ea6..f2bee7f 100644
--- a/src/include/executor/hashjoin.h
+++ b/src/include/executor/hashjoin.h
@@ -72,6 +72,15 @@ typedef struct HashJoinTupleData
 #define HJTUPLE_MINTUPLE(hjtup)  \
 	((MinimalTuple) ((char *) (hjtup) + HJTUPLE_OVERHEAD))
 
+typedef struct BloomFilterData
+{
+	int		nbits;			/* m */
+	int		nhashes;		/* k */
+	char	data[1];		/* bits */
+}	BloomFilterData;
+
+typedef BloomFilterData *BloomFilter;
+
 /*
  * If the outer relation's distribution is sufficiently nonuniform, we attempt
  * to optimize the join by treating the hash values corresponding to the outer
@@ -186,6 +195,11 @@ typedef struct HashJoinTableData
 
 	/* used for dense allocation of tuples (into linked chunks) */
 	HashMemoryChunk chunks;		/* one list for the whole batch */
+
+	/* used only when the hash join has multiple batches */
+	BloomFilter	bloomFilter;	/* bloom filter on the hash values */
 }	HashJoinTableData;
 
+bool ExecHashBloomCheckValue(HashJoinTable hashtable, uint32 hashvalue);
+
 #endif   /* HASHJOIN_H */
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index 5ccf470..e4660bd 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -1764,6 +1764,10 @@ typedef struct HashJoinState
 	int			hj_JoinState;
 	bool		hj_MatchedOuter;
 	bool		hj_OuterNotEmpty;
+
+	/* debugging and profiling of bloom filters */
+	uint64		hj_BloomLookups;
+	uint64		hj_BloomEliminated;
 } HashJoinState;
 
 
diff --git a/src/include/utils/murmur3.h b/src/include/utils/murmur3.h
new file mode 100644
index 0000000..e12bf08
--- /dev/null
+++ b/src/include/utils/murmur3.h
@@ -0,0 +1,29 @@
+//-----------------------------------------------------------------------------
+// MurmurHash3 was written by Austin Appleby, and is placed in the
+// public domain. The author hereby disclaims copyright to this source
+// code.
+
+#ifndef _MURMURHASH3_H_
+#define _MURMURHASH3_H_
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//-----------------------------------------------------------------------------
+
+void MurmurHash3_x86_32 (const void *key, int len, uint32_t seed, void *out);
+
+void MurmurHash3_x86_128(const void *key, int len, uint32_t seed, void *out);
+
+void MurmurHash3_x64_128(const void *key, int len, uint32_t seed, void *out);
+
+//-----------------------------------------------------------------------------
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _MURMURHASH3_H_
hashjoin-bloom.pngimage/png; name=hashjoin-bloom.pngDownload
�PNG


IHDR]T�)	pHYs��-z8w�IDATx���\���g�pG���(b�����X"�+�D������11�11*D��b�15���54*T, 6���t��;����-�����K���Y��ggfgv�����3�S�TAA5��.� �4"PAD�"� �hA]DA-��� �uAA��."� ��EA���� � ZPAD�"� �hA]DA-��� �uAA��."� ��EA���� � ZPAD�"� �hA]D���T*U��V���]6�R��c����g���S� H�������F��[�._���]��K�T���G�m�R ��Ey6�?��w��.��CbbbCA�u�Cx<���7?���.�r�v�ZWWW������g���9;;2d����������;�g��x��R������U���iSsnz���\�f���+���<<<����Q�F��)//�]'N�`r����������?www�����7o6��<�<>..���a������n�h���]L	w��=c�89^^^�W��cA������U��72�H��G�\\\��� !cy��$�uaa���[�/�3]Vooo333���������pn���{��,����z�eee�����_�6m��S�JKK�Rs���A]D�.����o/Z��W�^po�;�{����~�5n���c����/p���>�=g�������!�?���P(���B��s���;w���O��o�d��	���7���cdd$���9GFF�d�O?�
�w���J����l�bL��wP�����K�.���PZ;;����Z��]L	/^�m�6�����I�&��������	�t��I���*�s��}��"�������j���@����Mtb�j�e����{��q��e8nnn}����BV`���Zs��E@]D���}��7`6����-Z0a�{���/h����[���obb��<5�����N�:A����%K���"��W_}5h� �G	

2���3g�u�V���~���������[��|@#�t��"��J���_B��9��A�@>�MP���3f���.��Tzk��x����j���ax�Y�|9��E�������>�6�E�u�[���5a{{���"���-���c��|������k�~����i�~�����g0&��5aGGGMa�xj��n>����T�"�\Z��X[[��}���M��$�vYXXH$�s��1/*k8�5�� ���bccCBB4�����k65�DR��."u�0�S�&����K������wm�\���i��+V��0e���_�������9������-����
�455�M�'N��3gN
G����������E�����3�������%x��7���# �`!5����M���j������Z�&lggW�r"����4�G�n�������f��a5w@��RMrrraa��q�.\��|G����FWx�p}d2���S
q�b1#?L\����������������Y<�Uy��
�mJJ��A^�E�af���"����w�8����C����}�����={v������s�^��!8���I��3b�&|����]���H��2d��������k���}��[����:u���8p �EB�guiZ�h�������������gRR���Opp��Q��z�->��n����;?�Qf��1o�<p����>���%K�<wn�����_
8�������;t�p���9s������/��%jm���.��hU
����y�����r�����(��~'a���������_~�~�:��"EB�gui~��w�~��Gp�~��7�m��~��6m��������g����O������2|�������G?x����c���g�9������o��[QQu�������vvv�oSkY$vK��|����,���<�e��}��K�.�9s��;w@&CBB~��g�� �u�C�:K�����;��k����1::��r���jj���9�<2��%	.]�T���+R-K��M]�_��[���9�Z�9.k���>|��S�LeCvA]D^6
��m�R �TA]D^****�;��A�YA]D^*D"���u��]Aj	�"�RQ^^��E@�i��� � ZPAD�"� �hA]DA-��� �uAA��."� ��EA���� � ZPAD�"� �hA]DA-��� �uAA��."� ��EA���� � ZPAD�"� �hA]DA-��Hsa��-o���R��5�������X�p����k�S�g��7�|S7�S�N���[�R�u�����Tui��8p@O?��m����O�����G���<�;ln��QO�~��W�@P�b���ui\�pa����v��5�[��W_yyyA���?�����.��9N|||����RRRJKK+**t��J��z�z����~�m��i�&����s&&&�]�Z�����;�N����VVVV^^>�|8�D"6l��u��$<8p`\\$���vrr��������������$�����;�`�����U���i���A���H�`���U�7n��{=~��W�]�V�;p�@�Kc,��������<<�l�B��}����[�l��K��>�����z�������cc�������:t���,+W�����\�"5�}���JJJ����������aaa���E1{�����_:���i���?��F���E��RPP`ee��������k�����q^^���Mqq���{�-[6n�8�����o��[��9�,U��n%��7o���c��m���;mmm!<}�t�9�E0db�.������`;����<Hc5��e-����� ������Q�����O��w�������~����]�~����������@ZZ�F#}}}a�	8|G��'N�'���u'��L��q��a^^^}��1bD���Y��4fP�������A�0����������������>p�@
���wo��Iw��a�T�zt]�,++��EQ�����7.]�$�J<u����/������0z�h��)�H���G\�t�3UA���H��}�� �3�'0�V������>>>��-suu�8aU9u�8a{��;v��
�L����z���������
i!����|�C��k����7����6����,Ya�k����:%%%NNN���K�"�|��������-[�T*��W0��5��6m���~���������[o�4��1�:u���[``�����G�JXX��;>���B�&ljv
0`��Y����Ag��
4{A)G�u����������A�����44o��e$���;v�p8�}�]HH�:��#F|�������%�JaH������\�����Kz��>S�jyt�|���3g��3f������)�%x�D���m
���@)?�����s��[�����DA]D���3EM-��L�y�y�fu��B����P5/X�Z������jLOOOMd�h�v��!::�`!�euAA��."� ��EA���� � ZPAD�"� �hA]DA-��� �uAA��."� ��EA���� � ZPAD�"� �hA]DA-��� ��Q���;���T*��[�n�0a�f����1c��;w�{������B/������3f��#�[�n��a`���		�p����Y]�Aip�.FGG��q��\�`��q��e��e���;w�\�zuxx���K���`�8w�\�H�3q�DF��x�bEA�fB������*P/=����;u�t��I����{��177

5jTU]4���CpAz322`�����V�9�n�� �4�.��3��|��[�FDDh,������pssKNN���`�F///�S�r���wYY��y�"##Y�� ��i��h�S�NYYY�z�e2���1`]ZZZ5��� �aaaEm��<���X� ��z������fe�p� �<�>��tq���~���Q(���Z*��D���F0h�III.��������k�����}���;�����!����}�����t�_5L|�^�z����������������[5��5��9s���+AVV�n�#� �r��.����o���������������[�9r�;�����Q4���(j������{��Y�2dH�T#��
,VVV!!!���dZ
*.� ����.^�pa��	}��Y�`A�6m������o����_m���K�.��'(�n�j�

��������}�nL*��K%�H-Z�l���C4���9Ay)aG���s����QM������7~���/>k�5��^ss�����`��R���%$$h6C����� H��]�J(��5�����k� � �vtD����[�l����4oAV�� � u
����]�V,/^�X�X��PAiT���YYY|>��A��aSQA����XXX�p��C�eff�d��}�~���=z�`�� R���������u���������c�N�6->>��C � H���.^�x�����F�����AA'l�b��=�,Y2o�<�������W�^,�� � u
���y��>��E�|>?00p�����;��#� H]��.��������A��aS���t{�gff�l������C � ���"r�O���7�6tQX�]������w��$�����5k^$�;v�;V�Tj,)))�'O�t���������i:@z��s������C�|F0h����1cq��u��
#ju		�p�������A�%��5��7���I����5t�^vt�������dDGG��qCo�w�y�_�~��m��i��]��e�����s������K�.���`���s��Fr8��'2�����("�h<I+��+Zc�#rf?�=����l�GeQ����*P/]������'F���r���={��������5��.�`��!�� �L���9r$��Bi�<L&�7�#[���	�gK2t
������&l�"x�}���+W���?0P�
60��r3��q���L�k��L855���nnn���US�`����~�\.���.++�7o^dd���A��A� �������'�J��Ex|�s�i���
�2l���3���+��=;""���}������5p��mP��{�2�2�����.--��`�F(vXXEQ������)����	���W>\7������7���"��G^q��������\*�A��g��p:=aPr���R������6$l�bRRRhh(�aYYY�G����0��� qqqC�Y�fM���@(���Z*�jF���`���j��,\�0&&���o��]L���.���G�@ ��f��� /Hn���3�w�J8��T����y]�	G>h� ��/Y���
6u��������H����H///�222@x�u8p�����������������[5��5��9s���+h�n�#� HSA\Z�'���S��_M��+uw�>*d�p*��}��e+�s�g���e��
0���q�������?���c1���?�
It� ��w��5k������`�R����*$$����L��A�E�C�����IQ�w#�����8�G����HZ&?���d���$Y�\w��z�v�Z��nik!�O�O� �I�O��9��L��!E��O�41|\#J 1a����aS�O�f���/���gL�����C`��%��{���\��??,,,"""88"����2��T�d��EQQQ�fxx8D�p87n|�� ���2)9���]OU�����'�������IG�I7Z)��
K��W��w���]��\/�N-�@G�j�j[��YE9���t��M�BI.���������*�Tj�9��.��=Z:v��	�r���������C����|���s�A���ss���������233KHH�l���}�i>(�������]ys=�|���^$Ck���K�+�2c����(�
��J/L����
��j�O����X���&�O������e�W��Mup3���	�1�h�??~���<q7��[:w
t�Z�n��C���6E����G�N�>=%%���������X�A��������~>6-�J���%����V��m��"~���]e�������Tb���<�Wei���R��L�b(��T�]$ �2�����V��������#�jZ ��0�WX9��]('O��t��c���(��P��.�r��	��'��17�t�����]]��)���5�
6uq��Y_}������B�X,^�lY��/O�A�'*�*�v����a
a�o���"��f"�aG�2�u��2�������CqV��,���x��������L$�T�A����	RD)��B����J���x:�(rN��O��!�1Z���Z�����Y��taS��������MLL(����:w��qA�
��/!�����#V������+�=:���Ck�����&��=�+G��b���������8���2q���(!1���{�2���z9�E{i�+y)���&D�m�8-2�*��JkJ)2��I6����k"���,����=��K+�n������./l�������������~///�Y�A��(HNK;��|,����(�
��8\�}kBW����Xy�?�a��� ���#7/>a������Q�>�������w��u�n�^N&����H��%�N��������Ry�������m���XeW����
�U���p���Q�9�����S������Y�8>[u^F���U�V��=t1""b��)����c1A���g^�gZ
a���R���[����vm��������!O'7��Dn������-�!a��� ����;�����}�w�A��y���Bsyr'������p��d=���2y`�}���������uy��o�r��Bh�<�yyaS�����}���SA!%9������J����"H��hE���Z��#�!�B��\?K��J������N
��N���������{:���3���&�r�)�W��Q:8���'����x��M���@�,�vVB{s����d����������[?E�/C_A�(HN��8�ig/3_�8�	��q[/�����S���|�=����#���������]x����6�1��W(	I��)�e��)w�{v��n�IF��s��Y�������v�Bk�h��=l���-[������t�^��}�� RG(���;���|��eI�#��w��F|Ey���s�v����%���]�J�*�>��w����w��������rO��pZ�R�D3�Bs�BX��:��^-^u�y���<?p�|��H4����s��]�v��!FFM~�fA�R��^-������
��@����������k�v��v/rP���VZn\J�������\��jb�c_��E
fe���,��MD9�
��q8�fZ
�:y��5��c����|��M]�p��(�����BF��/g\�����f$2q����g'��]�����;\���vz^|j������sR�Ss�������Rh�
��.6������F����,�I�H/������@���)�S5�~`S�.]���_~��g666,f� ��0�-�t{������ZjD�6�zwr�����������B������t3������G�T���(u0��9
������M:w�����������~�B��OW����:�gg���kP�7|���;����(6n�������}�T
��5J������R*����?��|��%����bZ�z����{��-�k�;��&����w�=Hx��Pr�@Wl�,*�S�6.Qz�� UNK��V~~�){����IY����n�~(>��\Y����������ox����u
�g��DYB�e�@)Q�����������J�R��%U�?H�������h�M��7l��b���;����Oaa��1c��;��{w�kaaQ�Q�������1cq��u��
KfffHH�����B_(I�a��1H�5D��Q*ywS�����z336>�n�8]�K;��ul���g'B�W;=��P� �IJI�%���]�����Y�KPY�S�����VAp��W���<IQkUN�*7����IZ��6������&�.����]'&�S��"!��B��j�������.�o�[�|��P���&�x�����i�z,� K c�T��6�g��_E!�����H���ENFK T��1x^�gw6u�������-Q����q�����l������;w�^�:<<|�����/H;h$Td����.�e���
$����%�3���G���z����	�L�������c+#��P��$����#���u-�Q���R�Pg��tu�o"t���S��v{��.�9iT!��������=�����i��h����T�2��U����v2m�ac�DOh�����	�
Y��LVQ"W������w�E�z��%e���n����e-fr���I"�"%g�qKR��$��I"�c9O�eT��9��6u��������?��[[:�����V�z�8�g�ss����Q�F1bf��|��;��8#�u�����V�9�����������#G��{m[ZM�\%�Hi,$&�*��k*�������ZX���,�-�@A�m]�F��9`����P���`�����I�
���Dv�n�i���gG�WZs��n\��|���&)7I�-��@��?l��j�1�w�t����/�6�zY����;9���d��R��B!���]�(�++�yE��4�����|h�����-hag�7�=�vVTDO$���8�t���zZ����g�������2@		��q@@8��&��tM�B�/6yQ$������%��+t����8g������TWWW���%''�`|�T^^^����roo����y��EFF>_�����)���l�;pd)��)�(8r)�XJt>O�P/`�{"&GJL����bJNq���-y<t��R��
�y�b��x.N9E1eP�L�!E�*3����fR3�kliNq(��#�0��x��\#����+0�G~�P�3�a��"��	�M�����V�r�`��4��2���f]�ZX��^s|B�v���:�Kkk_��f������:9��<��Z�)�Y�~�H�X�i�\d$�1�Y�,,,�,,��|��~��)R/���M��Y)B��wP��@;S���Q������?�;��$���p-iYb��hc%\�������\��O���7y_�|u���pD�D
���������:2����~[�������*""",,�7l��bll,x�`Y�z����u�����z8pCY�/�w����8z������O�z1U)�ku,�����ry����R]�������
�>��-����(5d����V���=���*�>�r)��@ ��S|>]}�)3\wJD;�����DF��#�Mx��S�1�Tp���DQ*�R&%�;(�KU����\U^��X�<.��r����!�
���T�J?���(KKJh�����ji�����TJ�cRJ9�nj���p*xP��[����=��h;ET\us��T���
TJ��a�4%�4�AIR�4�aE����6&��&>��������e��
��x��u��,���y�fy�r�L
����J�|A��k������G6��3
��������w��^�$�(���)!�p�8B�p9b������L��*�\L�F�5�iE�\�8{�MkA"����U�SX���40GXT�4e�-�����Z����E@(���Z*��D����j�$%%-\�0&&���o��]L���.���G�@ ��f���e$=���d:���5*��g~��R�T���rEq�����@���V(�de�
NIyyAO�P�+x2�T�/��
��\!T(���	������*�������(���yFF�{���x��H�PI������~<-jSw�������T\O%.�~�����S�mI��z��z��oWS��)R���1%������WUwT����'T-�D��C���V�+��y1�}�/�H���}�-��}�y���A�\~���C@�c�l����-r��u�<U^�g������lt�D����x|{��q8"�2�8����r�)��rM)���9 x�|)���Z��Qp����zlZ�D$������E����U%�C������
GU�������)�f��E!��BA�R�`9��G[�4J�)he�'�2��*T�B�t�`W�p���U���
��LN���^��/W�������E>�|�
�y�:p6�J���;==���?--�������9s���+AVV�n�c�c) �^�IRk"��R��#������LA��U��B)/.+,)���KK+�{M�B.�(�?�
���������2��BQF�RY.�(�Q29D1���B!U�>�J&��j��b��T�3�p��������KhJ"V��5.���TRBO��RY)���d�����"���A G-����sZgPF���,}��J��������R=�5���Z��������/26��Q�$�R�T�w�uJ"X�\��Y���B��%��@�E ��O�9W��R�;������XZ�\��D��
�<r�s�9��u��H�JUQ\|V\t����\n+.�������+W�=_17����w�����B�c�O�~�3�r\9'}���9������s������)�>PvP�f?S>)�������s5��t����w��5�C����"��beeaOOO��������K�O�����tb�l��?�[��g[7��$�\��pX�\Z�HW�}��n�_by�����I�ee��2������TP.���L���� �(/���TV���-/.�P?���b%���P������������3�T�#�\��?E�\���
)##��*�,+{q���&B>�,�CL.}��2YiFV^���+��n�TH�j��� K�I�P$���U�q��FAmaM�<7B��;����E8��P-���x��J'�
�|m;6ee
:�����EK��Eqj�Y/*���u�E�A��S<�LwS�S�l�V� �j�0��E�@�rH��K��E�$��EE��k�<xM����Ge�WBE��9���[7�Z��jC�'����9����*Cr� U�=Q�Z��O���7�uTT��.j������������"""����o��D0hd>G*�D�h����(f3<<�q8��7�y�k��71y���U��q�h��T��]����1�=pM�f_Y{f��^���<>��N��k�����R����� ��C����X�$�FY^^z�*,������s[��m]:�������PA��i�7���N�I��s+�3A�p��6�^���v�G;�	pl�����V��H!����$!��_����6�����eg���!^O�/��^M���z����	7;���N����:�c�[�M����I!����H�8%�(yn��r����O������L%�'�Z��B�^�J�-���kRx��		O]!W������|Ck������a#u�r�vO�N��)�yr*3D��.�����O�������k������9���Y���>\�n�����,!A��G��g*y].c�x:PIl�#��%h�x������C�l�?f��
G�$����������+q �.^�u��������G������tu���QJ�W�&ByYy��$X@_Aa����(�;;#��m��]K_�V~9��v������uZ��}*���O��Az!�C�����c��������r�\���w��TV���x���2bJ7�j���\J��)���rm�D=��D�)�7�D��W��s��D��~�5��3�"��������8~����{�Z����&//o��&L8v���h��� �.��"=,E���mUC�0o���Y�|��.G^[�d����q<X�t��x���)��f�H����q��'>�(L}K�N��0������fu�,l[����cH�!��L��������;D��L0����1��D��f ��_J�7&����jyyWc{�Zc�������][�.	h��8)OR��YQ����3��t/��R�xZG�%1
V��kti:�����];r��m����_|��R��y>����Qt����A�
] �L��<�����hQ�=3���5��SC�����>��~�uO��;�/�`�2�Z��\J�B`*2(���vv�|�|���u+������7�89w�\8B$��{yF�}0�9�tH�#c���G����z�V��qd�;�{s��DG��%'k�%������cP�A��6��_�q)9�B�2��P*�������j����;v\�t����mmm�_���:u��!��:�O�����H�~$���@��q�������AY�x���������xkP����o��t�"yYy�������{�"[�����x��G���CvJP�K����^9I���Z41#]��r���AZQ�Q����.�aI/��_���,�������!'�S��*�����5��Wz�


E�QDE�Yz��U��q�Q����=��q^L��H=��nXD�������<l���-[,X��}{E�},,���8�U�"!�#Dv�6t�cbd���_&��������C�����L�	�\�����,���H�7����M��"�2�Qn:�������������J{�������7&=,����{����e���M��N��<)o�6]<��{���-q)Y��8ov�[�n__gC-w�"n"�*��K��~�IK�m���"�0���5[�������[���!ba[b��HN��<��x����p�k��p��Y���'�~�����s�9��w6�����*�&��	�B_h�	9�"%��gl�5�L  (W�tP�=Ju�R���2��2��r�������(It����OOb�Iy�BO"�p�vy�5N�A�.��@��d^8�N{����O�[n&�
p���s`g�����;u��fo+��������R��D��'Va�(hb6u1((H�#�����-[�X�x�\FI����^#�v
]�ji��i��+��Q����5���^����������=�I{,�����e�y�����x`�������)����:�p���Q�b��K.W^A����[�FUN�Jxx�H$��amR &&�������������/�],��	�,�H�����]�+*�[�5����xU���""/;���w��w��N������5kX�y�V�b ):D��e����T=}B����UZ��������63�P��Bi���}���9�Zf��\/k�]�nSXR���I���\#�W)�bQ�x��j��*�TI�,zv��2��Z7S_'����m�|�������{�������OW����7�-�lkQe�e����"� V�P����.�<y�!!!��g%C�)�H���_����fun�����f�S�&�������e`X"�-J�%��9�����sJ��E�b�
YP���O���{wS���
x����TZ!��J���8���"��bQZ��T���T-�A6ym�����9Z�8Z+�&����|sX���g��o�_j�[�JIIE��^q
�Jz�Bh��r�5�t��2^Kzt��v�����?-����~^�"���������Q�g����(�����X%�{�p�J�����S#����2����G���v���v��\/��k����jz���b���6�:��sy���Q���������7���Rr@{�3�5�
��T���6��m�s�8��q��7�\/R]-T].T��*O�V�	f���6��<(S�s))������SK��J�Ss���A�r�wT(Ui�bX l.��gw{�����J�$TD�U�8p�S���������X|���l���s������eri��IK��}��tH-P��	Y�AcR��WN����u����"R2�b�G����]M<~;=�p���V�q�k����)�0�9����P�C�^W��ZHy9H��J�[JsJ�o���ug_gogK_"H
����3AE�c>,�\���D���0b1���8�QQJV!h$(e��B�L�zB/_
r��z���nsGt
��e���;����"���P��u��b�I,G�zX��}#�E���fA�?>�7��\"���4~5({n���7����K���1z�)F�����IE�=<��{��(�����BZr���_��(��m��8��
zY�|,JQ7���Yob�A���[�"�~��q���L����E�"���`��Zd�'�zd����z�^TZV�Hk���
�b�\l���T���#�*"�"��.���z����b7����*H�U��T3�� ��^�5.�w�\Y�Vp���i��������uc-�����$]�g�r�M*(��h^�R���������+_=1"�DZn!���
r��sLkc��.QdTepT��z$����U�o���!�����5�K��[r�0��(e�X�����G�7�0�Ic"������@~���Qj���{�#ZK���q��_��������7o�\�n]�v������1c��;��{�;vXX��a0�Acdd��3�J%d>l�0��mr������1r�_�o�����o^�u�

�N=��X��=�x\�����N��
]��Aai���} ��9��v��&�z�J�(�����:l��������_��loi2�5����;���b���S�s��5�M~Q`�G��a�"D
��)�S�K�G�~���2�����Y
�,~��X�5��8�X�DED��]d�-���tk������YYYk�������$'M�4k�����?����w��r��tm��e���;w�\�zuxx�����Y������p&N���"X/^�E��n&)�����n�#��l�=���Fe%��������`�9���
](6(."���1es���r���G���0������wz#6���E�"��l7�����-#AF�v2m>��Fg�I�Z���_�=�JS���#qLi���yu2Cg%�y����4��v�h����Y�����w��#�y�J'��"�s���������s��)�����������,���f��-n��=v�X�@�5{�l�x���dss����Q�FU�E��;�d>#���?~���#G�X��;�q$O=7d����uu�Ocgt�O���SB��KK���:��k�B=/�|z���{��S�����	b�J���'�^�Rr���V��eK���f��?�-~�S���\�,I�nL.���9��I��'.p�$*��{����d��|��<��{b�����������C2�����UD�mD�P������-0�����)=�a���(N�$M ��g�D���/`Q���M]trrZ�j����keeUPP�n�:{{{�����i����w����wo�b��J�������\5���^^^���r����l��y����V�}��#;���]z�
��
]��C����J2s�����_
���&����,d��h9�~��A�!_=�g�z��o����x���Fz�y��pJ���@�r���H`���4����������������]k��/@U�:C�o��vq�J)�&�6������m:�9���$s�z���(���g����
��tR">H7��\���~��PB���h7�v%Q�:�M]��|,�N�:��������~��G���O���={�,c��d��t����3
F0h����(j��
����)����	���W>\7������7��
���V�},���%)��zw�&�2�Tc28����2����X~l�m�3�K�/9%^�~x�R)���r�\��?a-�����E�����������V�K�Cs��Sm^��������K��>�������@6���fN�f*(�X���rz���oK�.��|ny��s���z���P��"W
�L���Tq	�W/�SB&����.�����r��'��1�W*�N,�����.���f� �
���g�3����������7w��i�N��P(���T*ef��`���j ����p����??�]�v1-�z������� ��f���@���	&�b/{P�r��R�sA��/-��*
.+��f�>���^���4rv�o�u�T��.���j��^��*NaI�i���t����{��B�/�VR%,���r���J����[�����Z�����������\lM]�\#�0�l� 'vK��T�M��(��7*[��
x�BZ;���
*��kfD��R�X�9�o��o��)b�����^%El*���;&���P�6
],���g��u�����sH��Y����wzz���ZZ���o�T#��j���+W�YYY�-��p�l'������������qe����^����J�Vp��S3������x���o��t$/����������W~������]h"0���~\|~���L ���D\�-�:�K]�e^���^QjMI���Z%�%O������$�{�UbiG|ZW�z5�K��=����a������9�X�a�Z�"vk���Pv�d.V��|�0�8-&&Mh�!����_X�g
|�C�eff�+��o�����G�,dl��� ���o��1���{�n�IXb`�M�jH++���{zz2-��a3���AE�<���o=��T[�\^������}�+i�������_�s���BiN^IFaiN~i�*����x�[�N���'?dRR��=/��^�M�=v���gg���h'e�UT�a����w<����mU��D
	k���"�ul�u�!�����Q9o�&��>1�-�����9�����(
����w������	�����`G���M]

���[LL�����c�M��f�����N�:{�l�_��1��??,,,"""88�R��(������H$�-����B!<<�q884�a���B���9�#V#�����&d�S���H��.�~`��c��yt9K���s���Q~If�4�BQN�����/��.w���TP$��w����'6�|{)�����-9�_��}�Xll" �U;VO����%13i�	�Qr����Sg�����no�D^*)��E�0�y[O �s����l����8�i�9�3g��:t����3���>|�jd�d�#T����,!!A����
]o�L������,�������z�uZ�%N���������+k��dK�ne]������K��e��JE|����]�*������C�;q�{[��p7�q�����-������N��t�^������Q��-a��-9^�q����S=�������%�|��yb:�^W���O-�������RQ�B���Lz������Qr�d~C�>� �F��C�#�,���={�\�d��y�P&b����������#O�#"��I���f�jz�UN�����;��_���T)�wj�W�"���/7�!���������Q��-g���T�;�_����[��a�m��su<o��N���Rb���d_��?��k�X@��RA���Md�Y�>t<�`���\���42�T�hnQe��\���4�E�F�����e�'6�qE�����&1��4B�����7��-Z�����������Y�y:��Y��D�C���C�4<�����x3�$��\�����C��V���
Yr�
F�f_�F��qF<0���'��%16!]��7�]�[��Z����Jb��N�����DgMC���8b���������������AQH�v�X=�Lb����E1�q�E������*H�:����x��>=��{tA����~��v�b1C�������$�+:���
�������Z�����/�Y&��:�8��w��s����N6x��ng����`�	�"�����\l���=��Z��t�.�Z��p(�����>==��E��L����:m��U��|�i),����Y�9F����1�D7��V����g��P�2">F/\:&x�f��.�/��������b�:q���Yy��Ecc���"���|��rb=��!*2��/�~�PmR�[����/+OLU��9W�o����R:���d�
��k�����J�zsc��Z:v0m�y�g�F�vH�;��lI:�wH:�Fx���e�H~L�>��W��|����v�e�,tSbo��	����b���^���$����(�%e)�{��2/�K����-���|�sT�J2�"��i-?�������7�4[���y��-[�l���g�@����*���@�S�����E���oB�/6_�
��������W}��~s���[�.�?�.���{K�.�[8tt��%)7��
��""-y"^�nd�T�������Nai�v�����5��\�	��s��~��?��S���q�� ��H�����z�����_��'&H�}7��t��M�W�.����$D�����k�����/�5����9V�Gr���4��+�W�0����|'�(���-�wc5,�q(��U@�#a'�C+��D�
rf�7���~"�PD��"C�7s�c{8��^~b4j�f�������[h_g������\�w�?g�G�Y�E$������������W�����,����@��G
�Z�}7�k5�8|\�s_ H��M]�����q0�F�#������p���v2i���VeR�o����?8�d��)N�����>vmAa�w�(��j��f�����I�������r��QD�'�n�B��~�B�N��>�[�)����#�����c�������>=��zQ��Q���,�O�������	�&4���Z��/2��E�`��8}I��^�<�T�M]���������T�C,��]5�����s��S�45��������,�$SRV�o�1�B��^6m��Bu�~��]O��1�9\��
2�5��C$;Hf�vW���Y��A������R����+�w�/�V���q9���n��`[�{�p�+'�U���hu3�q��\PJ�az�B�h/S3x
��8|��A�:�M]<z�����SR*�mll>��#�G����H��ST�6�6��m&Ff���C~i������@���N7"��y�neOB�����M��D�����-y�!��1�gF��'������T��5����w���)���S�til�[�����`��V�"\S����TM��A�l���Y�������G�B�X�l���={��?�lX"9���+�t�iQC�y�rxv��v�$�}������ �9�x8;Jo�������}$��J���Gs�?u=Mc�w�^�^?�EV��4@�D����3"�Mw���g��&�<�w�_���5R����iiic�����&&&E}���;w���H����L�N���it�V����=��1���[���#���~��7���.��F�H�s6!�O��Z�Bh>��Y���3�����~z��u���"�����!��D���RO��������8p�����������kd1����
�9Te�`�����Q��H�R��y�������+1r���7r#Ou����2����Dm&yYO�LIO�t���'�<{������*�nI�����nJ�
��_����h�����j����g�.FDDL�2t���c,�(��Y�fm�����a��
�{�&����O=w�\���w��aaa���`�����3f�Q��[7l�0�dff���\�p���������K�O�����SA�XCE�v��J3�t9�?~���Tz!��(��VGzq����K�RAJ$��U�+�s�hgQ�"��HO#��b&
���uz�'�o�L���K;��L|z��\����i
���}��af����o�>]�~�H$JOO����������e�����s������K�.�Ke0�A���sA#9���]������(�1�Mw-/��{�����B�
	)��V��{O��TD�HdD&�;�K�/'�T�W#*R�"�"S�E�Tj#(��G��w������*����W���������L�d�!]A���������7v�JE�r���G�|�����\*;���"�wS"� ���1���?����_~�����18p`��=������`���#4�w��J����������[9r����%����:�F�#J��?+�-z�[EM�;�"YB�v�R��gZ��������?���jL��	��9��-�������N��r/�q
A����Y&g����F'��ov�q��� Z��Ep?����/��bKKK��Z�h��!BBB����o�@�C�����J�������\5���^^^���r�������l��y���,��a0�AlM���Gs[��9������B�������E���G
��U	����=UbR�LJ�������"&���1�) ��oa��6��_������)�U�OxB�a���4��P����98��G�k��n"c�A}����C�N�<y��� ���
<���{OOYk@qo������b����g=J�/�����A�`]ZZZ5���aaaEm��D<���Xx��^�z��'������z8pCY�/[X�uw�U����ZK��j�P���0;�f-����+���z�h�����2A���m��,�?����G�y�.�2'c��Q���8+�LT�"��KU��F>_j$(6��EF"�	��X���V#���9��v�[
?�4 ������Jzx�"��[���J2K�sd
��M��N&�.�V�&~&<�)��J8��`0>� �6u1''g��9"}����gk��gwMj�����������s����P(���T*e�����C�@ ))i���111~~~�v�bZ�t�O�	�A�Q��*�Fj,)>MQ�^W�����V�����X|��25��f��X�7�U����S�2?��o���HgAu�I��T`!U�U�D����������������������<��;���#\b<�k���c"{T�~������y�
��bkN!x��n�a��Q���R��������.[�l��� ����k����	=��J���*���������������[5��5��Z�\�R dee��86a��.��z�M�@��������������=X���$��,Y�t��R����
�����j���QZ^��-��H�/1��������;���Lh	2	b�nb��n���Z�����N��?�5<�0�����UX�� ���A�����&M��o
t�ckV�#Fl��
d��d:i���{��Y�f�z��!US�PC*�XYY���@����iq4��M	a[b����|�G����#Ho�����'��E�����?�5Ko��T�y�]�N/���N_��1����cV,-��-N�*�e2����df��(��=H����9���,Mr

��q9�}z�����,�L�� �����b������;w��1c���:t������}�vMd��=6��T��.Z�(*������p���p6n�X�U��e�D��k����@��c��.��1�{�������������q�,h��RG���r�|\���|��Th�aX�S`�\� G�(ejV���(=G\V���O���FE���-��#��[+�pA����4��H�o�>=��������F�8�#T����,!A�EF��*t����H��������
���`����-h�2�r2���������{��S�(b�6�_�����yF�x\o'KX��p��
�A)�r��,���KPM[����@{�v�����a�
A�6uq��-_|�Ezz�R��:�%f�G����qj�?$EG����!w��~��h3��t����}!|��{�CT��"������ T�Is|�8Y�������3� H�aS����v��!C�==6RK�e��������I��v���:����Pz�wf�A��G���sQ�����o��K�hFY�z�����zvm��� �K�����PY�f-�yY$�/z�]iul�^��]��? ��cJ.���+S�>��/��Q����p�JgB*���(��<��������A���..]���/�����lllX�����AL��	x5d? G�����V����k+�Zeh�I�M����tX����\�;�\\��)9�������7������ H��M]7n����u������M��$w��kg���$��v@m�a2��D�=*_���A��k�S��^�h�?��l>yIjFH�3
��FY}�������� H3����
6`�"�py�eGz3��2q�
������K�Bg�����e�zBq�O`���6=hw��*�?�c�����>!����r��`���>n�s@A^"��E������gDZw���h��f�D�F�X*��qTJ�G/�B8\������^�uWb\��]�T�<vm�oGnz�'5FD��g����<}=��f� �6u��������?��[[���^�+������s�@^��VD��oM!p�2�������)~���=��d��/��$$S��4��]���	� Hc�M]�={�D"Y�b����	��t�G/@q�~V���Ij\9���\+|�'���Er��b
qE�b�(��iC�,� ��,����iHL-H�A���<y�������E�'��he,���f��?����u�+� ����(����c��$��p�����#tkEQ�Q��=i����z�Zb���"�haS�����`����O���������,_���{�����/���t0&1+��j[����w�����T��!� �a���������{��U666yyy+V��0a��c�X<���[!gM�eaa��1c��;��{�;vXX���g0�Acdd��3�J��u��
���L�.��U�����0������������'��PT����:���������� �T���k��9rD$A�����/�pqa M�C�)��-[�s����W���/]�T/���s����p8'Ndt,�/nT������C1I.$&fT�`ej��������w��Y	A�	6u�c���.�g������~�����3����=y���r���={��������5��.�`��!�� ��T����r������9��/��PL����biy��=��/���{+'cByX�gj�����Qd���b���m��5""BcIMMuuu����[rrr�$#4zyyEGG��roo����y��EFF�^�g"�~��S	.&^KzT���P����cp���}<�_ #� �
��2��b�U9u�������Q&�C����US�`�rFQ��
@��S���,�W�>|�n�QQQUn(;U}��ykNe����:x�v�2r	�yz3�/e��{`A�fI�Y�|��?�P�(
A�`-�J����D0h�III.��������k�����}���;���������6��kN�.������#��A�f���SaS����`��[�n1�-Z������a��0a��z�����wzz���ZZ���o�T#��j���+W�YYY�-�������Q]_�s�������A�� �|`S�N���_i67o���.j�f�(j�p���w��5�C����`�R����*$$����L��A�����n�C#�47��Ess����v�����^�r���>:	��??,,,"""88x����F;
F�.�D"Y�hQTT��8�^�A���M]��g���~:w�\�Xlii��G�C����.����>|��8#T����,!!A����#� MvtQ*�
����[�������AA�vt�o�������g�]������;�<+BA�:�]\�bEHH��F�daaQTTt���������c��+GAA���]���{\\����/^|�����BKK��������+W�KTA����w7 ~�a+CA���x7� R��."� ��EA���� � Z����[�~������J�RcTU�3AA+l���9s��];d�###�EA�z�M]����(�� H��M]\�b����,X`kk�b�����L�<���K>>>��������s������������B/������3f�P*����6lX233CBB.\�`ffVG�BAl��G}$�W�\�kd�}��w��������m�6m��k���q��e���;w�\�zuxx���K�R�`�8w�\�H�3q�DF�b��� �L`S���x����u�������G��3gc<p���={���CCCG�UU
F0h��G�����<~�8��#G���J!� �6e��E�<y2����+NMMuuu����[rrr�T#4zyyEGG��roo����y��EFF�q�A�F�Jv����>}:77���.$$d������,������,�������d����uiii��#4FDD���Q�a����p�ccc���������mTTT����fUA���M]?~|���W�Zecc����b��	&;v��CqqqC�Y�fM��m�P(���T*�DU��`�8T
���.\����k�.��QO����w ����[_A��L�;l���k��9�h����_|����b�@FF�n�������������|}}��2��T3g�\�r�@ ����mqDA^n����;.]�t�������/����:ub1���?�m��A�F��v��=k�,X�+Y5��5����UHH�===�G��� ��d���[�lY�`A���A��E���?�}�vp��,Y�l��w�j���aaa���A��(�������H$�-���b6���!����q#�uAA!l�������[Y��*�#�j077?|�pU�������233KHH�l��y�#� M
�OAA�����KXW���i � Mvt�������[��!� �4l�G

��333[�lYXX��!A�NaG{��}��]�~��1����Y����A�~`GO�<	���������!� �4l�G����������xA�S����G�N�>=%%���������X�AA�6uq��Y_}������B�X,^�lY��=Y�AA�6u1--m��1|>������>��s���AA?l�������������~///�Y�AA�6uq��U�g�]����2e
�"��/"� H���.���'>>}���������c��9w�\���w��aaaQ�����3f�P*����6lQ�Nr��33�z�� �P������EEE���<k��e����w���z������K��&�A���sA#9���]����QA�	l���y�@l�O����`p�:���{��177

5jTU]4���CpU*UFFQ���r����VA�aaS��]+����5��|������pssKNN�e�F//���h�\���]VVJY��GAl�bVV��g1�Z"�������Eniii-#4FDD������a����p�ccc���������mTTT����v�A���M]�*��M��.B�D�R�T$�2�A�P5HJJZ�paLL�����]��G=]������@�~
�,xB�������9����
6uQOy<���Y~~>��0���wzz���ZZ���o-#��j���+W����8"� /7l��nS��G�"""��k�b������g���!C��2B
��beeaOOO�����"� /l��.�-����0aBB�������@�����o������H�����H$P���(f3<<�q8��7�uEA���t�������u�������j���#T����,!!A�����"� ���j_�������g1�����eC�q�'D<!z�	�
�=����U�b����O�xB��R<'z��	����r�����C � ��#Z;)������ �8aG�7�{���~����Smmm�����]��sgV�GA������S�LIMM555����������Y)A�I��.:99�Z���w����*((X�n���=��#� H]��.���|D����B�N�:����������!%%e����.]���Y�~}�.]�B�n�:a������@ig���y�f�
6����4�sr��upn��ef��j�'�<v�X(��R�F�wf���rr������={���a�s3���;���;x���m��M�v��5��O����G�����H$JOO?v��g�}v��y�����I��A!,,��?����+W��fyB���o�����j����Tgg��`'
��\����7n�@ =z��9sc3?9���������'5�f~B����/�XYY�R���9�}�68I�W����g3�fxBbbb��5V����������E��\��'Of�����+n�'�L�n���4��������}�������	81�6m�g���w3o�I�<!�'i]�����LuvVN��aj���	<��O|����fs>9�N����t����b�������+V����9���~��G���O���={�,cl�'D��5z�3S������h�����7d��5k��m���4���|��?�P���OQ���[o�z��������9������o�7n��;�M��R�y�]�����LuvVN��ap�c(�����9k���cs>9��a����W/��5�xxxH$��"I3�cs>'���'�q��Y��9�]������S���A]4�u�����C��A�t����h>����I��	F��m�6(��?��iNk����[�nQ�����}Bt�Z��;35'|����h���j�]�d	�y��=�m��������s��3����C� ���9�(���Sg��
�����2�fxB4�f3���Y]���S]��;9������t;�j��C��U����H�o�>=cs>'�|�gl�'����UkT]59T��N�"� �hA]DA-��� �uAA��."� ��EA���� � ZPAD�"� �hA]DA-��� �uAA��."� ��EA���� ��	�kC���O�<YCB�]A]P������L�:5��51�uA������O?MOO������_z��������z+::�s���������n�{BCC���6l�0x��������������>|������gbb"��lll���������	��D���R[[���dGG�8#�h@]D�����;t�P�v�@ ���{��0~���`���\�d���A/u����'�,X����2]<~����Sgg�������o����O�n��X�]��=z����o�y���:�("�"�4�p���c�0�'N��}�����K�.zI�=w���m����o��e�@C�=z�(�"�!\5����A�A����#F�WEi��."H����K�v���U�V�Q,���1�^�{�JY��@����-[�T�����=v���#G^�V�R��� 
��������~�z�������F�NdBB�����$�ZZZZ[[Ww�v��������m��`Illl�Y}uww�j!���"�4]�v�;wnhh����B�`�X�b�'�|�}��?������I������;����L�r�����eee�6<��o���^41�e\�`��������D@]D������={��	<==�kd�K�.�<y2�����]�V/�������
�H$�}2�����Dj:t���U��jb�1��/���kW]�A�����������zF;;�����5�������k�|��I����+���21KKKw��
q���^�J����� �++�����46tA����� ������.�4.PAD�"� �hA]DA-��� �uAA��."� ��EA���� � ZPAD�"� �hA]DA-��� �uAA��."� ��EA���� � ZPAD�"� �hA]DA-��� �uAA��."� ��EA���� � ZPAD�"� �hA]��n�:a��J�lRu����_]7Nttt��=�8�1r8;;�W_}5<<������m��w�N�<����-Z�X�n]�N������K�.����_��K�.�)WS�T��5k���6l����f��t)�;v�;�������_��wo���]�v����`5CBBN�8�D�1c��?�L��14��C�8|��_|ojj��k����nnn��F^��u�}��d����>�r��������Q ��b�����W����z+s
L�:544����[�ly��wn��F���������m�6m��k�HS�&�(E"Qzz��c�>������3���R�}.�F�^�I�&�6@����O�p�����n��������1
��t�
^�3g�L�8��_8p ��_~�e���{���Dh���P�g����T�<yRc����������G��X�I
�F������_�?���+V�_�kt�$��0~��9s�0F�7n
�G���n5���++�Qj4���R���,]�t��e�F�������^�n��g�f�M���YXXhmm�����I���u���X�d��a� �����7�L��S�.�Oxx���[�g�k|���G�����G�/����?��??��J�2++k���o��F=�&��k�\�i��>}�0���'3����w��U��V3>>>!!!$$���y�����%��=������
�~����o��n�
Vtd<�:l������T�ch�u7x���\�n�S�6����E�L���S9����{C^�l�:u
�4��R/�uy{{���I��^�`�Z�����~���9����x��W��#�u7=��...P;]#x�'�����jVd�;=��O�E4�;3A�X����Dx(������/��G��:8��U���l��������?��S�=�O�nkk{��YM4��~i���Q��<A-��qX��W�����;;v���/g����
�H�=�9����4��%���8���666LX���M�c��H/�E��������w��7������S�#\�f��^��Og>\�j��5�bEE�����������%..n��!P��m���l��433{���`=w�\�i /���J�K	����~;n��;vL�6M�y����j5�n�����|Tb����t�^x������?�F�Vu�u�e�U���G��W/�=���^���G}djj��nJ���������Z���|��w��,�f�g��^�z5<q��o������H$D}/��*�(^�Ki��2::������ ��H��o�u7X��W��FBi������������� !!!7n��?�E�kU��Rvi.�xc���9�����`D��	7�m����<//���Q'�^���e������[�l��8����'N�8h� �IX�&���Ny����#F@i}}}��G����.e�C���_��/��K	n�RPA�6
,���{�`y�����|��w�i\�e������1�1h`��}\���X�hQ��]A��O��k��}����2��w�������������'VXW��������
<������Kg�_�u��I�7���a��K��Y�d	�y��=��h�4�j��;w��1NNN:t����K��#�yK��7x)���:u����A5]CS���j�_�~�,�����M��]5��b�
^w�3g�|��g�TZZ
���M�|{Lqu����B����y<��;z���;�xh����s���_�4�j�D�}��U������f�R�$���V��)��`5��o�td�����I�����COdd�3%i&�."� ��EA���� � ZPAD�"� �hA]DA-��� �uAA��."� ��EA���� � ZPAD�"� �h���k�%L�IEND�B`�
hashjoin-bloom-results.odsapplication/vnd.oasis.opendocument.spreadsheet; name=hashjoin-bloom-results.odsDownload
PKH��G�l9�..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKH��Gcontent.xml��ksG�%���
��~C2�=���^����m�K�{�����A@��4^����~�3�@U	�2���h�Pb���y�x�����o�\���yus{vu��[���7���������������������wW>�����^�|�X]��\]������/o��~�����������������w'���W��O���������_��?�?�������K�������}��O�������E}��W�������_������'Y�r~v����~���~����/_�/�]�||)�w���	���]�9��NO���W�e����w�����qn~�0���?�n�/�����]��Y�r��20�~���<_?�]?��'��o��Y�x��i�P�����8��4r��?�����������.�}t�Nn����!�������S�{�.c�
����/7gw���'������_���]���G�~�!���������=�������������k��o�]��_~�27rFS��fu}uswa>��/�-�������8t�����7��;C9z�0����g�/���>?��>�!�>�0�$�������o>��O�>_�00\��/���3y������G?��>�*���9��Ox�g�����+��1WWG�<x�_]��������/y?N�����?��Cr{Kw��������w$�&O�oz@���7�`���w�/|`�p���dut�:9���������w������������&������������g<���������;~��}|}u��<�^|���������K���5�_�noE\���0�|����������������i=��I������o��n�&�_?�|w�����Q�s��N������
��l�v���4y�������_<������;[���p������?�~Z���(_�����/g�2���txv��� ��r����t1&Mn7c����������Y
o���Vg?���#���|��oWGW�wg��G?~w�y�I|��%!�R�w��/���&�������������Q����?n�����~~������^���Nm����0�?��:�z~st��&��W;3������9���d�������=������L�Il�
x{9����o��X�o?Y1)�;�~�����K?�/wz���������2Q�����������i:���jsW���w��o���r��m>>�{�{�����g��������<��tu�S���Lr����W\����o�G�U�����������������j<����'1�\���w�/����_s}������\�?�&j����%����5�<����1�>���H��+Yl�ry�f�������>��t)=�W���������iH�d��L���
�C8�'������+������*[P���
���f����������o�p�������W���2�����������Y�9���d@�����.O�����q_�.O������yx����������V�����������a"k���n��q���>���?zAn
?I�G��n��y%���q(��<�{:�/�NO�7?��/��_������b��E���{�?,o5��:���}7��~����_���^�/{z+���7�����yHyX�X��i��������(�`���B2��x���������2�y}}�����V�h(����m���t|-��p{o���[�O��Oe������5�~P���G ����?�_/��S������ru�b���_��\���k�	�dap?�'��;/���>�ztuy���Azut�������,�����~�o�������K��i�'�e��&��M��x��&����?o�����l���	��&�/x��&�����n�����l���	��&�ox��&�����o�����l�~���	��_���	�q�#����������Y}��m����������p{&��y���l&�.~Z�n^:>�������W��_�X��.�?�v~��~�g���[�}}�/�����z�z��������B1��G1+�����aujz{40��i�������~#����y4�5��7�s��|����_*�O���w�w|�y��G<��]~|�f����=�A�����\���?.V<�6���W����D*_��O�w'�V���
��u���+oW��1g?�������������wo�
�W��ao���w�v�����pu��z����mt��������w�{kw��C��oik=a;s�Y9�W�IxEFR�_5+���_5+�7����*��q�q������q�������q�{
��/	,�l��Q�	��5-�G��L�\��E/O�v&�u'��M2����K�3|�������/fP;�L�!o�H`����\�,�c�����������_����~���?��V�:O�J����\������{X�����ok�N���7�,eKC�@vd�K���2��]2�)��f		�O>�,)RN�)CgPH)8E�`Lv��u9�9�\V��L�5AR�y���@���{;V��9��P�S���#}�c)���3	%&�f>A����6����;�����-~����8�5��r�C�MA����T@�CJ�U
s(����|`��������(��w�$et)�g"5�<�VI����#����]g�&��#F��1;���877]�,Cil�W�:
3�^��C����	�%�)e�8q4O��l�L)2�����y|,�0W��\W�`��4��?Z�
�F�@�i����Yi�]����|&o�H`%���P&U��)������S��>y����4���I�0g����������}�JR6�Z�&"RTLc�����&�l�����rM��S�+���w���bGs�Is���
f���G�"e����:�����^S���c�WRf��Gc5B�q�e��3\
%��r�����,�kN0\��8�u>v�}��hD�%��� �\=��3���'t�HV"�0��OY�DVJ����H�T��T�P�hCpH�6:��V�f�e^��*�w"z3�����I\\�ex���������3D�c�z���D�#g�Su��d��LT=L�X�
���xg��3�\�H�Y���u�.R�e��L,���H������1�kf���O>���PCg�*����g������,W/Z�})�0�	
( �'M�\B�q*����)f9W�=W�z��%���`����)(tv��~^��*�w"�0��*H�����dV,:E�tn���y��I��P:D�h���M��c@���fJ�S_��~�S<~L|�L\�'|�#�p����4�"5�\*�h�j]:�I_�\L��IN���gSK�z
�����N��S�J������.�;�[G�IwB=�:P�<�zY)	�b����DN��C������y9 Re)�������\�5�4��~�J��v)1��p��U�L��Ap�<����0%ss�EJ�����m��4W9��|*��r���
�c��!����	�i��r����/qB�:�:tv�������I��)\����Q��ha��}��U�����+��4 f)X�
,�TO�r�V$�V��Ip�\=�\=pu+4��1��y��S�]���W�����TI�L�"����O9�Y�8eH�h�5�`4.�tn���s�-3���S�y$k9e��sLr4���u~WN�&��
PY}����'a#F
���7W�"�bH�RY����i`z�"�9�����(����_B�����>��j��%
y�IO�y�w.sM["k%a���V9YO=YOZ��XC��x�b��Z��|���W��
s��33g(Z�$l*/��v/��0!XBBUO������E�A����lk�r}��D�42���J9q�,�FN���l�*`
Wh��S�H
��i'�a�1`��RS�H=�U�h���gr�;��������0�<�k���y��o6K~��)K��o�^�M���\��U���I���*#@Y�X��k���f��oTA�� Y����t�����Lt���X+.�*���Gj$�YGI������$�n&)��h���C�J�����	�'@+�Q�RgZ����1������$%r����*����:����"g�9t,l���������l����g�l�����nS��Zt�g6��#'��0�u��ut1
*��4�����W��������,�w1!E�����0���WGY�z v0�����P���Ut=���2h���.$�F��A,&�D*k���7/��XH.E�9�
`fS�{L!"2(ST.I�u"�D"J��Nw�J=�[_[�i��R�������9A���#k�������
?GN���V���U���\��Q$gAu	\`��1|'�|��S%|!D�iYP�T9O��r��C�5R��H��pD\^�_�&������Db�
V��Q-�����a�����B����s@"'�B9��G�H�3U��0���a���XWhY>��z�������T����9\�~2[VZZk�}���E6[gp��n�#+��h1s�_"'a�C�RP�/�[H
�z�C���%��2z'�|g�Q��L=E/�w�T�]����&Yf����i�^N��D���<&�)���4����/&#���U���L���=��C��������T9����8I�3I��EQ���P�W��v��?|t�9�\Yu������l��i-����&\G�c�W��u�������-��������)�;������� X3&�����	�7O�_e�N4��}��)#��y7DCc��)#��[���(a\�<�&��1�M	�U�gLr<v���hU4�v��{Gh�W-���-��+��jY;.�i@��)6�)�0�L)���	9�f�c��Y����Pkg_x����%���,l=X�Q���U���f�<c����#����I+���i��H0�0uS&T�Fi�c��j�0��{f���w"�;��*H��
��M uq����E�>saMy��a\�R�I�*e���
�D>1��Fg�)D����B.!��(��o�T�8��"��O1y�����B�$6�Z;��\a�2#�EV��R.��������9�z"����D]�.�e�u�\��u������m��aW����}LA��TX��`�M"i�Y�$����W�S����TA�.D����`TY���K���XQ��D�I�vf&&�d-�^��1+�i�N��g����VQ����$Mc�J���b��ODh�b�6DMQ�~6G9�!`��`:�cH�W\�$i�<hZx����z������Y{<r�W}�CS����J���B��O`*��Q�~)�4^��3��W��#&�V=4X�*B3�O�"���*�PAA*���d1d;��J������7q�HS��{)�0�LQ�v�z��c�<c^	�5cr���9	�=4@�D��F���XlP�`|�~��A�75ES���F6^U{��\�d��7���IX�#}��DN68�����t��fbc""E��V@&�
l^�)���	���`#�w���F���U�s8����9��Z`c���l�
GN6��)�-LM�I^<�A�BeJ�
l6EM�^
6\	8��{��E�b�[J�Z,��Z`rWl$r��P���`�BLQ��2�hl5����}O�|3`�\��l�3��,�Po�(af%���p)l$r�dPm #*o��U�d�O#���'�6�
6J��4`c)X�qI�Tq��f=��JIHw��$$r������������x�k�����o7�y��{6��;xks{�sd�$��	�v�H,�!��f8����{st�nX��i
iC2��B"k%1
�[Ip�$P3�<���34
mX��i�� ���o�0��Z`������#'�0�M(���x��f`����9:�L�DV���o�
GN6�z���Y�4�Y��fn���V3��6v�*b�p)Lr��0����8�7�Y�4/f�l���!��L�	���i��Z?<�]n��M��D6��Hd���Q���5M�d���0������5�Y�4,9Q��[+��� S��GN6�~�
:8�`U�z`��6�p&\�l����X��X��F�]��hp`%
�gR8��U�"h�%�]2�7�v�
�MA�~X�4#�C���V�rcz���!9	��E*�.z�&��[H�c��uv1g����hN�7*�THd�$����>r����V/2�$�l� �fI�(��s�9o�M����4/
;���U�pd-�I��A9	��ER�M�8��b��f1<�.�ump��in�)e�y$�R.�L���I�fP0R��iDJ��g��1*6�#v����M�����O�DVJ��L�>r�4�T�����0y�IULE���h���h��A.���Zp��Z�n�^��n��b�.�	!�`�����r�.�bj�5��0�i����4���jp�{V"'��A�h|PSr\KH�B�T�5���"���jD��5Z���D���q[�9r�t��@�hlL>����R���j,�sMC}�W���m���Z�g���oaGN7��U;�2�D��O-�@c�p7���]6���b�Y������Zp��I&�p�$p3���ZOz��9iv�a7@6���M��@�����(�uU�a]6��0;H��ZR,�&Yo2Eu�&���m������<Ug�kHd-���{�9	��b[��
RL�#�4f
�nZ1u�p��5d)��P"+%ar��������)���H1��O�����������9l�>�a�#k�M��9	��b[�������Y3V����}�`n�����&Mp�{��{��a��<%��jF��:�o���)P�
ZFW�e�		��uF���P������o
j����9l���-$��`v� T�
��A��
��>F"���c����.�j�}�:������<�*�����f�vH�$h3(]AG��dM)y�+6�.�k��B����i6f�z$��$�	y9	�BFW��=�(f��f��{�`�����M��.	2m%�R.�L��DN�6�����F�}�]�1��d�(6`1���6�,��X�m��6��������$�"7�]�3j��u����)�c��Y��FCu�]�����JI��~*�����bt��	�B����{�]�sF��B�=1�i��c�K�D���l��kn�+pF���(�r�|�.+jpS1�f�q�T������)���w��I�f1��1�x�9�@r�yw��m������k@
)��'G��;�g�79	�������	&xJ�x���,��FC}�]�d[����&f��8
�����tw���x��5���1*lh�O��k ��<�%��V�UK�$h3��}A{w�h	��A���Mqs�p��5�|.���JI�l�GN7�����0�X1��.�m���f��0��G"k�M����#'��AO��Q����!0���|�t�-�0�4s
�3�t���~d�F���8r������Jk�fy3v�~7�|g�������y{~��P�^�j��H6�f��Z)dv%��I u�1�7Fc�b ��c��c[�����L������X����Xi-!��DN�5�����w�l@�o�+�4�������h�)�a���S�Bx9	�F_��=����'��XN���f9.>�Wx��T0Jd�$,�6|��I�fP0����!L�X�
���5��,�3���:���8�Q�E+8�R�)K�X��m��`n�����v����=��5�9\�i�`a������JIx���#�����`~�1@�1�������#Z��=mh����j�����YmB��I��I�f0�?�d�������dGPr�T�vv1�o
m�����j�Oc[c[:GVJ"���v�V�#'A�A�
�PS����ll�c�^;�&�L���`���jD�eY+	3����GN6�z1���hl�s
f#R���6�,����-�=���uu�a����p�$h3��������7���ST
��[!u�h�L5����n�G��<�L���I�f��q����h��t����:�f�!��h#���&�:@K�$h3�CAOwi(��1�����M5�Y�4O
$7�������Z��Z�m,��m)q(pC��;B��F�m�-�S���:�f�������GV+�rm�$r�������0ZcT�>��I2�4G
�nL��������;VYn;j�I�d�AJ�P�l
8N��4g���"��F�f��Kn����j�����j��0�����E^Y)�����1�z�D����w�k�~�,��E)�z��Z)dH��I�e��KDc����8&�%"c
-F���� �fs&��Q��O���v9	���X�*@���C��+,f/������iV�'��.8�R���a}�$x3�
cI�u2r��F��O��v�:���9
o
�hf�|��&$�R��;��O�oea,h�}������X�����b��
o
�hv���K-b5s���c�?#x3hcI�uJ&>&DU�uZ����MA��l�Tn����p���yq�$x3�c�Q��'@P�'��C������Ns��2�6}d�$�1��9	���X�T���D1AB5-�R�L������y^�l��X�<08��9��A_�
�����7he�Q�;E.F���� ��z)WJ�G�=c3W�%r��JSA�u���w��uW��7�K�9���� ��{!��Vo��Zx����l�
GN�7��8��[�$�T"�4k���Uq��%�M3�+�l��ZG��6����9	���T .�1�@�=t���w~1~�
o
�h�����P�G������J"'��A\�
��E�H�zg5g v��M2�4���&���#k�tD���%r���������b��4���
oo�����NI�����B�Y9	���T�Z�0C�RHQS�������_�zF2�a����K]��E��	�v���tH�G�$pT���/���LP���N��b��5Y4�
�!y[pX+����&q�H��1�%c�<C`BT��k�#glXS�Es�ck�m���3v�a�m#L���P8����N�3�1J���4�h�S�P6�����=:�
8�Z]3&���D`���pJ$�bu��3\O��#�F��bN�5�)��n��ydC"k!N����#�A\#N���g����1*E��Q[�9d�i���d�]Hd-��Ur��� ���4�#K	-�Vq����k�S�E��c=���u����c
[Ip�4�c��S��
�$�R����1�q
q�y������n�L��B%�Vr���i����;X� �%�^�+�g1���8Y4��)s�X"+%�!e����i����%��<<���xU#A�;X�Q�8Y4�
��f����8!��^"�A��F����Lp%���(�}Z�,�9�NA�{���\6��Z<k�4��Y9
��5��tf'>Q���XE�q��mk����o�I���%��$��?/�� NZ#NIwv�)D�O����G��2�4D����Y���\K���s�3 ���h�K!�CR��C�b;�p���<8�l���D�*� s���� �Zp�c�1���x�i����cq���q���[UId-�q>���DN�8k�1��[�F��a��q7����o>��eJ7\�pc�R������m�``%?��(X%p\]�A�r��1%�����F�;g����6%|r��/'��I�$�R
��:q�i��V8B���b��%�
�����}��6KB���c��H"k%ar��%r�YK�D���+Q�@8j;9��N�Y�j�S�E3���`�cy��#)��
�q�+U9
��%�P q4 �v�#�1���C�ig�� ����EEf9�G���
8i*�YK��L�����dtV�s�i0�� �f�hC�G�B��i��GN8k�#�8�:�6��ICUqp1���d��8�f�`Hd5�5������4^�V8b���������R������yq��vQI�0*?	��E�DN�8k�#�X�:>L^��)9�b4�
q
�h^2%0}d5���7��ig-p�GU��-L�k���G��:d�i^`������]"k������9mw�1�Y;�b����""�Hs�C��x87�)���q�3�����Z���IH�4��c���������+�|2�43p2���8�dr��q��c,3����&Y��������4�)���q�w!sG"k��s���DN�8k�1y�:c}Bi�,��*�8K����vw��u��Gq2y�DN8k�1��)8F��N{���N�!#N��q�2G�J���$8r�Y��Dp��0����*�T���q��������q�SSK������L���0*m�e��N�Kk�#�u���GD��>���s�X����MQ��#�1S�-3�X���0&�����f���*G*Q9�Hc�A�aU��b���e�9���]���ZI��y�M"������J������E���,H� �(�f��@�{�C"�AN���DN9k�#�(��x�3�6h���0��1��r�\�h���9�e6��i0g�u���I�'d�J���-�0�(�f�hL�yQ��|1�X�DN�9k�#5���	|��)�ncn9�V�e��9��\I��ZIx�i�*��`�Z�HE��A#\��G��k�S�E3�����Y+��7������,V#�h��rN�~L<V�9l�i����Yr��Q��-��5�T�y�������Xe�����h�S�E3�E[����ZI�$ot�i\i��J%>��R2uK���n9
s��h`���d�(��*���L�-!����8����re����Y	�i��acN3��G��Z��r��%r�Y��m�
�'$������c��������f�.�9MlaG�J"�s�Sw����
�����qUe{�k�1�?��9u�hN��8��
��\���i0g-C�%2d@g1���cT2�qg��=:���:��os!�#k%am.���i g�B�%*d &:|�F���s����o}!�/���?���lp	=g���Y�B��}#���~��W���O�����F���l��q��5�?��������8yjo�����?�]]���}�:�|�	]�y}}�������������j������t|�����No����p�_�����]��~a\~;��0��7�~U���o��������/g�w��{�;L1�]/~Z�}���
u�L��U�����p���(����]�������+/���>�ztuy���������������������������+~���6A��	�_�}�	�~�=���	��&����?��+���l���	����	��&�������+���m���	����	��&�������+��6A?l�~��W6A?n�~�����������?��Y}��m��������kzqvq}���v����woW�L�n^:>�����g�����Oex��������_������du�S�������sp�o�G��c�.0�
m������z$9z���n�����o����|#����y�������E���������}i��!�_�n����}(
~:�;�����T>����n^L�5_y�:g�9�����W������.����U�����/r�W��������z�:�|=���<��;�����j��-����^5'���'8�����Jq�f��3+�7�����l��i�����'yq�������,��4
3-�����b�;To=�h3g�>�N��1���("�/�gn���.";��}r�Q����$��VcH�J�Zi��sk�����&��oT�A��Q�)z�E�
�o_~t�D�I�D�RSv���'�H��cD���Gh���H:c�EO��7�������/N�'�)������?/���0�`A�����[�w)y��0��xy��X��<��y.L����S[�������1���2����M>OZ�GV$���L-:��S@/�P^��g�e�`Y��W�S����TI�� ��,UB����Sv���LU�F�:[��zq����(�c�U��+����� ��J�U���fb������k,L
�[O��� �w�NOl��Q&K9:������I�$�m3�����?X
��c�+`��cY���@y�f}dE
?���"n�L���ZoL������)�=f���1�'�=s�����u���6��fM����\)�anMJ5K����G:�`$D>�	Dv�';3�8e9k�
;t~�#����<�X�'�NG .&c}�F�'�y����A����jN�s�q������F��I��2�S���d��*���7
����������!��q�GV�����G�%�"�z3�;3���0�<9�3�-�z�O�U��D�r�;U�����e���q�����\�<���EGS&�LY4Y���4��p��|��!vf�����8+��f����Uv��v>A������>�#Kr�)�!M��BI��9V=���c���Q���<~)Y��1�\�)�~N�p��q�p����������J>��(�)����~�u��t$ D����#a���y9��������w�d��8��/z%���=�%�������"�L����\j��
S���8S�#2�G.��(���������xDD��%���)Rn���Kc)0��e&�f.
� g�!"P`�<�����92,{������(�(|��,^\��F"�$�k������~h�n�SS)��lJV�3 �v��+
�cz"1��*�=d1����F�����!ea��&�eB<�U�@���p��jG�h���s����Fc6�f*�B
��0�rM��j�����%�t�����+&���G-'H9�����-%Iy�-�$�����4(�r��oB����W.+O3X-�Qs������������F"+qx�\�������^��N�2����X�$�^�<�.`�U��T�g�;U�.
�l3[
��4�~�/'���)b�:R��z����IL"<jT)�w~&!M0^:Ey��M����+E�q���4x�f��	"�!��P����1��T�)M-s	i������m�u4�����O�[�����r�H<�+Qx9	�w�����o����ex��H�������<79Q�
��V��\�y�����1�'bs����,0�yJ�H����y��#�h�ZD?�?zg���y���`�Br4��3��N:G���d�Xc�^#Wy��.1�1\w0�T<~I�z��L����D����4������h#Y�Y�(_�� ek�l�t�%I����%�E]p_~���Ww��Z�t'����I9���fl�o�KGV��`���F�������'�X�=�4����,�5�T,b�U�2x��~>8J�u5��<W9B fk�Z��B�V������k;���c&;��1�1)����K�;�L#D&����M��:u�8e�9e���|)���������5������(�]�����7�<�(��4�����V��-��\9���8���)����,k�����0���i��*�z*1��*���	���.$�1MrsY�$���
�y~b�Z@�L�[��BXa>*3���<�h,z���P6s9x&d����a�Yp�y���'U����0W�K��5��e��P�\���x�3m7r�n(�; j�h%��]�F��@�����@�4�Q�8����[@}��%�R3����$~h�
�.�}�Ai�lFs���?��j^eTO5)�|�
f8���)��I����\�����i$@�:��Q$.:�\�q����d��#o��M��Wy��"�!H�����3K�/NY�<
h��3�����D��<g-�x]A:��� &K�A%g+O���%���9Fk��MIl���Z��ah�rz2p��J,>�1O��,^"k���S+�[�2�{+z�@�������,�UF�D���w��?9�jk
c�5��e�CZ����fDM7iQ?���Xq�l�8���Zru�<.�O���kR�P�d�9?,���5���pUuj����V�!�	�qv6mX�����$�
���aI�E�E4��y��[��&����EQ���t��T��:����#k�x��4Y���ZA�����!���Q:=j����fUl^�*�z�Iy�;U@}Y.=�(���4��!�l����J���c�����Mr�.iX��������L>��[���f�K�i�.R����2��<�X''��c>���?W{���M�8o���J�?��A���K7��&��,o,~	,~5���:��<"��Z��;h"��;V�GVb���y�����,~h�
�~���XiZ����P!M��73��Q=��<��*H����ON��L������Y���^����������a�5�����S�b� +��C��M�5@3]e��I�8j�06�g�z��K������6s���.�{E���l�1��xp���dc�����A��.��0��1X�+tfUZ,�f��2�����6��������D�d�C�VPwln({��
)�%�pC�bYl^�*�z*?��*H9J�V�Q���9�+l-1WL�H�0�K�('�"r���)��.����c��*}
���=�,��Ts�\��,vK=b��
�y���1f��\)���u\�ipy��41�$b|Jk�����h|������i{<r�W}�CZ�Q������d�d��P��G�4����G���;��X-�m ?5}d�$���Id�zi����,��#���n��usm����>@��o>�~/h��4z!QS�r
S�?7�4v��)Id%�!��X"kB��
Z��@	B���GF��Lv�0h4�Gv����
�Fs�d>�}d%�n1y$�1cs,06w�tBM���{�-��n�����&���c���+3���t�Cf)�GV���cf�O1H"kb�`�����+0�4���wnjC��A�M0��D�(d���ry�����?v�w�I#G����U��r�A ;�����h�x(��l��`u��sv�X��Po=�F���GV� Kc����LqdM<qP��c�\��M`=�aM�xWz~�a�0h�s%�})X��Y����A�r�D�� �naG����H?����[=�C��D�A�&���@p���4�������C��GY	���5��j���51h8�����t5o�j�~S4yOY	����Mj����4�OS����A� �u+�d3����JI�����&�51(
0���5Z�^K����)�GVJ"B�5T���A$�"��o�� h�E���(B"k%(����4���@$=����`P��a�����/���0!eb�DV� D��I�bE�0h�\:������A���
�>�&
"iR���0Rl�jc��c�O��DV� k�Wm����4h�����.P��A�k��g�����O�,L�e��D�^�ms(��U���Y'	+_��t��	���
��6��R��l5�j6�v��C��Ma�~�$5�t����}d%5��c���j,��	B��
���Yd.���4n��uv1z�B�,�I	����Y	����4��� 4�1�@���%c�/��Hc�*&%�Qc~S �'VI���������Jb(����J"k�����=�7�y/'#-`��T�
���Q	%~x�PH"+�@�a[Y�I&H2�P�}�r��y�B[:`jV%V���ea���B����[d8�&

�L*Pe�N��{�cKm;E���}�
l(T1�fV��eN�#+���1�$�"
�A�i�k#&�����FD�a1�S�)���fV�(en����0(d.M��51h�e����&Z����Lw�vf1��
��i4�1B�!��B��]�� $�5AhPf��Z&BD&k]��QG����P3,����Z�rd�$�[${��D�D������&��AL�Bq�f���
.
5��S�Y�>�Nr�}dMd��@6��|��Dc��l�'�h1�I
��i4�� ���@"+%���-��5Qh�M[�n:\-N/D�
����BB�f\|0�($����e�X��5QhN[�p�Q��m"��������4����K"�L;�>���2��D��A7m��iqO����Cn�j����
��i4���!�������0S6�G�D�A7m��i�OJ|��A�Q��H���/N7��G���`s�#�{����C�1�>�NseQ}dE�u�4�H39���Z�5qG,����0h?��y	:�)��#ki�L��WY�m�+�f2���hXpQ#����w��@�b�;��y	%�y`W"k������#k����t�L	�@^a�������)���]B2O�����Y@�t���	B�4�H3=��\���F��j&�@H�E�.���<ivY	��fn ��5AhPf�ef�b��0L�&*`:\j�%qL����Jd1��j��0h�e�?���$2��b",��S!u������!��B.d�K��5Ah�e�?����a�ad�����w�Uc�l���{Rs.�2��>�R1��,{��D�D�A��
�lc
��.$Gc��N*���P��Q���K<����Y����}dMd����6�-q>Q��Q�`�����>��\���O�2
��:I�\����%�&

v����6EH.Eg	IuR.�c%�PH�Fs.�
����Y)	L��6�GVD!?h��Z3
�A�H��i�4N�`�M�x�(��K��@��DVJ������#k�� ��j�4�����A2���nA�I
��i4��pl���i]����2��}dMD�^-��<!�������-��lC!}��$�`��PY	��k���$�&

�i�VM3
1���d�T(D�e�F��\�������#+����<���(4���Z6-t5���c��gq�e�����7��]B�L��> ��6����OM$�R3�}dM�����3\�>x3��0f�	�i��Ma�~�'5����v���:IX7Z�o�����2:���@����O^B�:jt���K������A!��TY�i�/�fz�l��������4���������pOj�%�a���)Id�$\�]��#k������Lo�#�,� g4G�<�����m ����X��6*}d�$<z�l�+�A(��P`f+����'���W����Q#4Rg��Kl�1��S��J dMf}dMt����68�>����&jd������k ���9�XG!�	Id%
~l������� 4�2C��m00�w�S�|�L[�������f\��[#�Z���J�(�c��OQY�Yf(0��Hh=Y4��h�qA��B�,�o�u�����Z2O���51he�/���C�"z��m��SL�;\j�%.����!��@��XC�� $�5Ah0�
%f���O�
�h���V
�BB��$����-��JI8[������ 4��C��m"
��	.84�I��bl���h�%�L��mY)��'u��I�0��C�^:Y��s�b�D7�.,��n!u��$�\/�>�R�@�A]��	B�`:����F"#Q
1)����c�B��$���>�Z��&$�5AhL�`�7��bf��SH{�&�>\j�%1�'qd�$�[�}��DV�8�c��-%�@��4����c��d{�B��
S4�i�%�1-1��"��� ������	��.3�e4�&�)j�����}��B5�h�%<kf���#k%c�VY�af,��4�!�A�����,�1��PA������G�JsaH"k��������\
&�@}��;R�����5�21��\Y'	k=f�'IdM���@��D,�d.h\�L
���y	�`���>�N���JY�}f,�g���d�Br���:\�o@���,�}�5.S&�GV�!H6��SY��f,Ph��'�L��i�B�RcC�C��������r���A��(�#k��������+1�ino��������Qj&�c�$"Y'	�4�{�Q�#k���������I��h\PeI��CCob����($��P3����Q(
2�T�kC�$����{���j�CF�fc�O
e��DV�!����>�&
�����6!�ODC^��(���A
-	���	�����ZI��U�>�&

�T"���$	R�Fwz�����J6*��9�0&���x�Y)�l���kt04h�S��,Xc��B�JC
�ml��a�y����X��8�f6�#k����Nj
5�P������f}L���
�jf��LB��>�}d%Jal��)IdM4�I���N:�yJ��K��;l+��C��$:����#+a!D���Y�
uRk���' ����k�2��������d�q����h��r����P�\+������Yp�f*���@��s��*�r��5*������2aH"k%)��I"k�� �L%f�� ��S����=A�"g��%�P34���v�}d�$�����a�1��!��~]!E��Gc��F���R����d5n �+K�a�������ZI�1m�VY�`
D%Z��)��e�6���V�.t6 Z5SN&�����ZI���s}dU �5���D�R
���!3�"����������&}d�$,���DV"Z�Z��@�A�����vQ\P��DY4c��21@"k����IHdU �k *����	��S����&�1 ���fmb���>�N���a����-���
�o� c��1=��n1GXd��M,�<�fY)	��p�iY���
�oS��xpCt^�CK�7i8T�E�7�b��w|D"+Q������
Da
Dj�[�����l�9�-��b[�>d j'���M�>�Qfs�>�*�5���#���8dH�Q��o@t�@�<N�������Z��B���DV���a5X�a�@c�w��������������z�d|f}(�5���jP���lCpmv�Ux���+�QA��$��3�D���5��oY���jP����l����
D� ������9��h2[����({����5���
|p!�7�QH���������5��]����^0�_�t�y�0��-D�����1�d�DV���rJ�6
z.C����4@�m����P	�����d��v;	��N0�,KY���M(��d �.��T�bz�7 *����`�\����e����U�h-���f
�)�
��'���r$�
�
�h~'���k5��H����XK7A-�����P���OFqjR�h�W��������##}d�$���l��$���t��M"��,c��j��h9�d��N�bf'�>�RvT�����.�����n�~'� �ID\{���C��wB<���b������<�MY�p-��"O\�W�\��0fx>��J�C��wB�����"#Y)	gb���DV��tK<qc�m�k�Y��]l���D�wB�a�%�D�J"���Y���M,������)R���
vE-	���	E
�k�Y+����Y����Xd������v�:B���!Q�;�2��}d�$��d&��U�h-��K���&
(�D* j�f
D��D:���W������������@�Vc�%n41y���$�QV3�&�>d j~'�B�'nY)	�3����@�Vc�'n�6Y��;&���]�\��,�����?[d��j��<'�$���
Dka5��#yc��m��F���D�D����h*[��#+%���.��$$�*���X"�����H���;����\�;��`��$�[	����m�'rZ.�D�D�J"@nYti����Mc��
y���3XN���DEY4�t�FNY-	��y��U�h����McLr\*[r4��"hPt�P�\OP��f�pd�$�d��IdU(Z8�D����Ep|�TP���dS
���h�'}���>�V�f��IdU$Z+8�D���C�gB�`4�/Ev1R�EEY4���:n�����U�KdU(Zk8�D��0#Ai�O�EEY4�14�[0�#+%aq�)d��1GV������T��B�0"`S�,��o���,��	a����Zxhr��$�*�u�Td�k�
`=����,�]T���,��	Y��w�GVJ���I���P�VrR��3Z�z����E�
E��;�6@�ZKE�@&)���H��rR��3zK��K�E���|C��F�f�B�r��D�J"Q�ZY��.�T���`�0��!j�h�
6(:h(j&(�������ZI�17�m?���"��Z����!  �M�%��4(*����XH�~LY)	��x}dU(Zk�m�S�I��@�h5�EMk}�P��P,��e�>�Rv�5��
GV������h�C6X�:��*#���1iPT�E�Ba�3�0���b%�\��2����P�[�"�\�:o���ek���f��}H�y�0�I�|D"k�"r���#�"�Zkm��r��Z�����Vk����o���:��/|��9���W��s�*�G������)��������n~�p��.��o�n�.��H���6/_3h�1���C�~����}#�?�|wuq|wvr������&t������G������GW�����7���������;�9����
���?�ytvy��������x�W��=z�������?��rvz���������������O��P�,����%��Z�6/��/���~��������Wwg~=��<�|}�w���������������wx��oo�
����/�>�/�>�/���G��G��G�W|�������������=���=���=������}���>��G�#>~�������������������?��>|��{���.���519��>_m^��t����+~�N7/��}������W��2x��pv�3����au}~|�����v�o}��)��7�#��b�n��6��M����������������o�������O��R3��jt�����&��<��\����������1oi��fl��K6x�ot�f���$kc��L	��`���k��:�`�j�Y�#.z��H���������/Y�@��b�vf�S���<�����+
:�:�f���'��Z����u{���I5��#���^�Le����D��=��q��	�_�G\r��R2�5�����W?�@rv������������Wy��r�(�c�������U3�=��%�	��	hl
|�C����ZI+%��sv�4���W>js��L^18.X4����������uFt���(�14>&�V#���b����o���?��L���k3M�#�K*�j�� �]#����6���8��;c|��5�<���2=�{`�$���R��L��SB'�b���I�������o����=�#`�����0��g�C6�a�xw�N�X�W�(����Kp�j��.j�T���0:�����9En�����x`,%�|\��1��e����>��=;���
��lm�s`��W���h@"�g U`|��*�p}���7���P�C
\�&�u���|OSmb��z�d|�����.�$p����BtFv
�|��X�CW�Xy/�_���QSi�PkW���_�f�q��a>t�����<W1�]'I��� ��[���,>:�;�b/�+��|�fr�{v`s��V�N�8�)�s`;���6���q!9��@���Q�$������&vT����������4�JE���zgL"�3S�#�s;4�����g��{~\cL<����j*���7xH3R��(�N3�Mgjc|J����5���cM��)��z�GpFcTC�����1%uQ,/T��^!�C�"|~){����a��!�L���5V)B?p,!O�J�����X�|�%���&���2DE4�#��V�zQ+s����8��U�]�����
��?�����c�.��������������a����z��Y9�&0yqA���Qu���)y&~:a��Z�rn��
h�XK����.U^�;87�g��g2�{v�x++B�����hss$����Y5	��j�[�D��0<H�����z�`�%9�bT�u�le^V�d�����<m����;4��=;xqh}}�FV�:?O6�Rg��_y[8a�X)Dw��js��)%�"��Y[��TH�:�b�*����`U]Wh~��/�c����aF���0_f����*�����H<�F�
�H?��Td=�!i4�}�Z���H���4����nX����S'0�}�1���{Z}���c��Y}�����e;���`%������	���]�I10R�X����!u�6{���e�����J-��^�0B�K�'��	@�|m&/;��{��5+��x��b�
�*>|e�c�N�V�\��no��.o������_<>���Z�}}����_�������xwq�w����PK��aY�2PKH��Gmeta.xml���N�0D�|Ed�&������+H�]���bp��vH�{�h���`��g<��7��
��:it�H�47B�u�^wa�n�Ei��$*o6�}�_�U;:�*�XMM��������S�=Y�)M��Q�)�?+����b��m����kL��9�*���6V
���	�������T��V2��z|,=�%q���{��Vu����a���KB{����O� 6m���J�i���$I�|������|^��(H^�	+�� ��~Y([��d�����s�����7W�X����#�
��Xv/W��8��h%W�R7��kq����`�����Y_�6R�0��o�������������F�
�h9(5iI�N�Y�aG��Z.>���PK��\z�PKH��G
styles.xml�[ko�8����pw-0�����8X�`�L����/�E�H���$
$'��{I�����$�&3�mE^^����\^�g��3Nh~5�����!�H�\M������z��K�$���������!�|�s���W�-�Wq�W9�0_�pE��A�:z���-J���
\-��;Xbc�����>:bh7v�����1;���NL��f���}J��W����uw���nvFY�����U�V����-K*
]�b9w�3�5�4V?����o�[�FS���j�0,W��8A�1
��KF{�]�Cs�Al��)p�Uf�xW�E����^��S������X6v.�mP2R�^�F��SJ��r�v�n�y��~��w��#�<��(
-�4�"
p��I�7h&�+y�2\P&�"��d�6T7"K�CU�h���
��\[�����F.��*P=
�=Wbl�U�e��b��#v�|_`FdJ��UCB�cR���R��U�g���_?�����$�RJm��k��������p����NQ�y���rW��1��t�= #��iw��B Y��N���w����������!Z���@�
���������'P�g���vX�f�J\���Nn��v]~�#�mZ%Fr��rx'�i:5�1�0Tl����3A���]�)�p"��eQ���I^�$]g�����1]�(O�(�^����[0P��/���
���+��c �6��h:~��/Vnk)�lA�m���Q����1Q���Z�|np
���_�>)�B������O'2�b���g,�0V��@�C]2������A�9�>�^���/|�lW�C���6�)�VP^ �3$�TCQZl�a�����*�P�A4�����s�0�r�OBaz�>�����`��}Ia����\	�z�
>F)��k����_���}}�����KM^B�-VV8�� 
�#��������o@�bt��X@]�|�,W4i�����`��'��jV�����A�����o�Nq�i4)�2��3
����$DpPQM�!���
���wL���{�P�)D��!=�~�����V��>�����-c�r�����'��}GS�v�f��C�CvKS�m�c
�����Z�Z"F2`��&�n�*"j�k�},%��T��R'�8��W�8N�8\5*l(��{�J��������uTi���p�gZ#�=�AG���3�6�����������*���E��KQp"��G�R��n�MD���~�s���`����aQ�8Q��C��9*�F��~�8�3^2�;�����p=�k�'��`�����^�����x��[/�G�����L�3�u��O��N�_C�k�>E�����W�_����*���5�/!k(�=y�����_2����FT����O�OX��v���X�<;^�<;R�<����}
�g��n����Q�u�����l��?l5���jZ�G�D���Z�v{����g��:�E9/$f����)�h@)I��[*���:jg6��e)�:w�4����3����C����Q���yr��<����_�f�fJ������~f��d#�#����]_�[�]��7�����R��vL������������x�@|�|Th�kD�������p�p����$���H$?��75=������}��B(z,9���i��B���?�?0��q�09J�~��p�e�,&�F8�F��o��o���J��T��c6�����}G60��<c���O���c����5!������'}}�,������TV�'�������������G7V�P�=8M��_��O�k���f:K�&�3��H�N��������>��	:��afJ�:��h,�C����~`5/�S�����
DhU<7�bJ��q3��w�M�H��`9�}��!�@_�c��ld%���k/)�[^����~�Ju^BSA�N5�*�{�a��OfCU�S�Oa���e+������(P�?��a��7��
�7�'[�jx�M����-���Q���#������%�N�8�Y��0����������:�[^$��E9�z;��TR��X"���y�7�;-{��w�����t/m* Z��B/;�;7�zP�������)�1R�b�}��z5��u��=?V�^��������j;?2i��[r��!nE���l����K�a���kR����6��_��X������n��l)Z&h-ik�={o&�;�'�������o�����`D5HT�������/��
��-�6p"�5�B�${�V�i���������\�5;������Wj�I���;~������\���J-$p���(�{�J��Jw�OS����[�O���e��^���:����y|�3T;�l�TT���Yg-g=��cm0
tR�R���O
��'O_d�	�D���r��Y��'2��PK�j�z	�9PKH��Gmanifest.rdf���n�0��<�e��@/r(��j��5�X/������VQ�������F3�����a�����T4c)%�Hh��+:�.���:���+��j���*�wn*9_��-7l���(x��<O�"��8qH���	�Bi��|9��	fWQt���y� =��:���
a�R��� ��@�	L��t��NK�3��Q9�����`����<`�+�������^����\��|�hz�czu����#�`�2�O��;y���.�����vDl@��g�����UG�PK��h��PKH��GConfigurations2/progressbar/PKH��GConfigurations2/toolpanel/PKH��G'Configurations2/accelerator/current.xmlPKPKH��GConfigurations2/floater/PKH��GConfigurations2/images/Bitmaps/PKH��GConfigurations2/toolbar/PKH��GConfigurations2/menubar/PKH��GConfigurations2/statusbar/PKH��GConfigurations2/popupmenu/PKH��GObject 1/content.xml�][o���~��0,�<H��E�8o��df�9�y�)Jf������&E��������Y��&���_U5[37{�W_������k:'�W�.-W�n������?3s���?���u�f�U�>l�]3K�]^���z�������L��^��mV/�tY��]���leuW����|{;�������7�����n��v���J�����S��������b�.���}���OE�����}������������j����E�
����CU��V�"+2'�^�9]�c�Y�L����U�=l��j�k�&�fV�����us�5�}RM��v0�^��>�|���M��sb_l}�|��j;U��\�V�~���h���,U�
�m�e��E�������*o����8<M�t�x�s��1���0�9�>q[t�0�^�|����[z�m������Y���dw�L�&���rQe��j���&�t�o������~��Z�F��:|K��k�=�����`� ��^���E;�g�s7�1��#�W�!���������i�U�����m����|Q��G2��D�yV�|1�4����mkX&�~����C�}��8�4��:|b@i]�f,����a3�������]��@����my:k�����~	
�N�M�!W�;}?]�H��0�����i���6)f�"I3X��d��Z�6Y5[����^/��8uo�Y��O�:�7�>��������u���gw��k��J��`�\�UM��W.<�QU�;<`W�2������8�����/��K���}Y�M;)M�������
�Y���j�8m:�9����������)�7�2���Q�;�<[dO�V��c5}��Q�h5}�����^�*��&:\��j�?�q�s��^�E��.C3�~&;����Q��P�:��?��|��lv��V�n�fEd�N��!�<�3���TY�����y���ove5���}���j�<9v��r��j����6��;�y�EW����yV$wY�
*�M���6O�T���p����x�PA���������c�i��X>Ti���)�=����td�p����F�b���u&���P=��h'�\� ��k�x����C��m��b��W��/��d�'J��`Q������5���f���1_�2'&���#��K����#�W�l5|���vOR��=Q���^FF��#��L����;��gd|�z������w=AR�M�&��|��8�b}��3B���'�����O��i�^�M���q����'�Se��D��8o�[^~"�,]��$~@>�D�h����wt�F���|��`�oH�fq]���v�'���W.ST����[�'�b��r�<|hu�������jq�$��8���F��k�.��-��U��t=������s7�}`�ER���u�4�[��Go��T�M�8g�P9���J<����Rc�p������}R����wW����,�W_���6�A���0�f�	���wH5\z
�9�����%������U�X#����-�M�[]��=���������s�}��\�vf�H8��=��]�~�3W�M��/�f�TY2:J��p�{0��4\�jUen��mR�����~su�ac�e���f0)�g�Zt?�C�����������sa�xs������,�iYV�&
��������
�p�C!lN4����.�r;����6;8����s����I�<{w|�!�s�����l����e=��\wN{�>Fb�n��k�<_�������D�MY96:;�l�O{G�G�����q?=�[b��A�BR�
EO�K{����jw`�������US���o6U��.��6�gY��I�U^E��C��|M�����v��{����������������q�������=po3�~�gV+X^�sJ��)na��������|���inys��d����}�b�:���eb�e?���8���0�B������[���~���Y�&[�so��S,���/d��l�/�e�L��:���ef�e����:��_�0�B��������;O[���J�h�#HoR�1U��5��GQ��CaUL��������Q�iR��S�h��>KVY�������Xw�	z��{}�������Y�:4���t�4a�bar����GwXpe8��"�PpC���6�Q�����@�%�*���o�)��{�f�#E�YE��%�"T����7bj��YM�� �&�|�x�<������%���0y>R��SI������Na���KJSuA�Zrc�Q���c�A�J�k�����I!�&����o���'4T���$�Z���i�g��~'�Lk��P��t>]x��{h�)i��i�����k~�Cs�8�*��i�����kn�kN��Pn4��[-���9����5�����s��z��G��!����>r>�y��;����R���J	�x#���I�q|�c��)�E�����^c����[�J��5v<U�1�ik�VR�"�P<
���Z��xN]���+K��c�i��h�93T	k��Xh���N��h(��(a���Zpc�P�'_hXt �h?C$�|���P����H<���jb�,Ha�����h���-j�
��C�*�D�C�4 J@Lc����FJVZa��Q<�o��HHCJB*����hH{�m0���#
0�(�J*W��<$�|�-��$����sn�_�)��x�C��P��$l�\�!)S�j�hK��%�bDT���!:j%)������0	e��b�|������5����>MU�DJ��pb�P�8�D
�&��cAq��x�D���)�i�G���r\qe�J5���b~[j�J�G.H��1j��h�+Q��Wr
FE�@jc�R\��7HE��q�Qn���b(��BA*���h�gC�HI��t�X)1)!(��
J)�k a`(-1k�IV���E�D�/%��P�AQ���@<Z��
s
����\�5T(��-�76�S�?BsT)P<b����#a1-b(���P�1�Q�
����!L@���V\b`(�,P-���B�Y@P�H�.�U�2&q$b(b�&�J�6} )2%������)�DL
�Y�sM�	���\��B1��(�(���R������6�5a�uJE��Z����ph�;G��JR�������1B)!�1)a(�RQK5�����)B������x�������h�����u)8��DH<��AH}BQ�l��%i����h0��@�)����D[�b#���>K�#�K���4�H(�C��W��27��Q\'P4
�����7J��5�"j`8����Hh�C�D���;;��B�C"V���k�J�$�g�h�a�h����rAJ�
�a��.	i���B�c9!M�����9�>�aFFH<��*M�pg�q���x�9�[W�iwo��H����i�^(o=$^Ff`��L�C8#�H�������DI,!�KH;�B�W&��!��PI��!6�4��r�j���R�oml��wF�M�fJ��
b��^�D���v��\�^	!��'�}����\�17�\��RC;n`�x��>n���o5-���KkGL��xD��6PC	l�B�G�!���[K-x���K!����?�3|��������F���6�Xq\PL��&j0RJ&��#$�|�����7�H��K���D�k"����=�o9�&"�7����D�	�����KC
����8
�H���@�����
C� j����k+���s���8} �th��F�C�"�H<��
X����X��D������T���A���o�����0� �H<�+5'WL2�9�����v;��R|&#�c��7�o���"�)�8�����B.H���h�{P��&�H��8K>���&�?N��-F���Z`iL�������w�i�
�����	�TP}2���=��D�?��w@�
��E�q_��\2tD�G��@�������b�1��W@������\��p��x"k�;r
9��H�H4���\3#��Q������k!�[M��{H4�Dj������
����6�H�D����9��'B�&��B���U���GF\����L�����x��L���p���AC� Z,��C���J>��)&C�&_j��_��%���1M�K���PB�nF�-F�}i7�8^�/M���51�>B�y_r��+~p���h����B�aP*�H<*�J����0DHD*���w_p^���+�0�R�K���Dz��"�c"��������������?o�
PK�����PKH��GObject 1/styles.xml���r� ���)2��Cog&��>@��c�)F���}�.�&)�K[�/	I��i���cJs��$[o��
.�C���9}JN�?{(KN.��5�&��C0��b��h<$����KR3�
��09�pHcj�����=�
L���-y����P](���kk�K�Z�%����-�Ap�~H��4����}�U�l��!o��3��Jx���	��i��34������>1�������jW�8=�_/[��-��E�T�&:�H�z�������o7��h���.�+n�
pz�D��
P_�e�)�\�'Z�C����k@�9�2����l��=�Z�[g��J�U���#;�v�����aq����<����l�<�����#��|�*U����V�#�|)��3�ex�!�1�py�������:7������-uK��������&����t���/��PK�����yPKH��GObject 1/meta.xml��=o�0���
�f����`�:t�����E���`#cB~~�)����}��}�s�=7�wB�I�r��x��RU9y}y�7d[�e�p����oPY�A[z�V������(��NvL�
v�r�[Ts[��M;�Z����m�0t��6�i������W��M�(�k:i3;�Wjd�JZ�k��O�..
���LWF���.l����I�p?w�ci��!a"���-F�b��(^dN�B����;�n�����>�h���?��6��:���5���$V����e���~����P|PKTnw"JPKH��Gg^YmYmThumbnails/thumbnail.png�PNG


IHDR���7�Mm IDATx��}x���^>4	�w	�=������C�R��w���@p	n��!FH����=��de��?�lC�y{ggg��s�=g<�����I�'NI�����������MF�T
=P����4��[��6]bT��>�)yt�cTS�|�����Qe�K�6�*[#j"������(^���$�@	��l6>V���h�u_�&�����Q�bT��|��k�	�#��6^��1�L��&�K�a�� �*e\q"��.���������:���*AF��q
D���@�.������t����{���������_�p�����,aqI��M�h*��#����wT�9��H���x�����9b�����~#P�xf�2���Dz�GR��jGEP�����+*�����)�Qn�F�b��1�Lt�B4���*��H	����0���m����F52�P��w�N�D�1�2RP��]����W�jU)j!I�'D/{>+]���!��u�������S'��)�����7~��,f������+U�O$O���������;|�p�j�����K�,������6L�U`����q��h��k�O?�T�z��Y�25e����"�>}����2e���:t�p��xpvv�k��Q�5R�����S���/�o��b�����|�������^�j�����?|��t������~��D����=���C��9O�<��Y3���%K�*U�@HAAA�y�L���=��Q#������@��-[�d:A-8%�;w��g��,Y��z�j����]�b@m�5�'O�n�:��E�o����s't�n��	$����0���7��������_�6m���o�"EV�^�:uj���������"*���@�����7��4i�U�V���A�{��)W����9�x��m<�7u���t���h��/_F���~�m�B����� ���'hm�e����3v���<@��'5j(������v�Zh��Z��a�f��o/P���8q"����a��i��
2�T�tk��9d&^R����T�;jxH�(2O�2����g��	�@���#�%K�={���O�\����k���`�����]]]�� |}�9�#c����t)�i`����,�<	�{����7/x��2����f���4��m�r��]�B���,���ti�&c��|<
�\�l��;��o6M�MP8@	
��~�z�����B}�0���G������x��7~���s��`;�^�j�dm��Xv������y�(yx@A4t��[����u��m��E�r�A���T�R!
H�v6f����Xhai��m��9��+p�<0��|ty�>�20	��G�

����v��E��;�Z4i���f��l�������eC�H��K���7�H�"�Q�J�k�j�*.{0����Q ����.\������@'^�vj]K�m���O���B�Z�����A|�����/_�$I��{����PP�	
FJ(�xzz�j���i>����@Y��o��[�n��.������v��gG
@1������A"<H����Q@��#G�$lr+��hpPD�y��9H�H����*��"�K�q��������A��C��6���_������K���� #a��� ���{��
���"�I�B����E�`X�l@t4}���@���Y4`'E�3����)S�&h?�	���Y�r���!B�/A�a|��@��z�*]�4L+�u�P�!r��@k	�T��M��?�D�@&�
������#F���? 
n���q���,���e0R�3g����h���N��	�cPM��o�YT q�����6lW��V�ZA	�x`}^�|	�24��6
��v��`�+8��m���+W&�UJ�D�H���:�E�(Z�*<�	&��@zooo���/H����
g�����
:i�Mj��Y!J=�D���=��"b�tc��5p�`�
��8�v�K�h���x��)�<=l����9� �I�	���N�:�@���
�����2�O�J��	�	�Fh�=���J��8����4�#�O�$�G���|n�*I�����/��������H&nh$��4h@1�MY2&�(PY��e�����	�Mw6��E^\r���%=��M���[�H�-zgv�u<��,�T�be�%��|� �=zf�#g�fz�a���G���������JJW�H�@�"��U)��1���Yv�f�"���4U2&\Hz�t�����e-�?,;�G�)C_|���h�GF	�\tKJ3���TR��A�h�}a�1��W��:|����-]K�6��x6�K�`T�*k&A�8�Q����U;�=H�[~�!�te�F��`&ST�]�h��
|��XIO�c6�v�cq`��)�6��&���<
_��xA�+fX��x-Mb��j�T��`vG�6����]~�O[k�-|)��1��oXvA��O�l�m�Z�`1$/&8cW&�U9h�����V�U��_�[���l����!��d%���t�tt~Y��o���%I�=HB��P[w���Z]�h*/r������\�������MQ���>�UV�����I��dd�G[_�x�:uj<��>~����8����=D��U��!v�_}���Q�F�&M�s&-_�|���{��	

�2e
��<y�=z����I���O���k���9s���g_�.g�h�v�� t�1c����,���dUF�I���={4�B�
I�$qss��uk��5����N�
Y'K��r���N�)��q#��J#""�d�B����������[�6j��.1�r�D
��O���������a7��?�0P#�D�P#���Y��'O�={�w���H(($V�P��M��j�j��}h�b�<<<f����_?����;�:0����e�S���`'�n����]���a� A��e�Be�����Y�v����G����8qb^Mc;	����y�@$s�U���;�M>~�������3�������\�~=��~��<���A����.\@>C�<x0x�;v�$���b����t���F��T=��K�.A��:u�_BK<��x�"r��
�d�h��aY�r) ^%!WWW6(K�NL���f(�d�[��d�p�`&e�v�8p���2@�[�l�@���n���M����C9r��R���u������\�����X�/b����

����z9g��U}�����+�={��o�����spb���r��5��8��s�����������b�
�O�;�9���7�	�4��OI�L���������R�H>@#;t�0i���-[��7R[�d	�a�K�(q���<y�@G����'�e�T`�-�K�.da�V���A*���i��4��lhL��w��E�{�U����@��0aBtq�_�N��
6L�(���Y�T��w�/�LC���X��)-�g�������&����
T�_G��':�N�!|,�"T�������qVV�;� "=P�����T��B5���E��|U���.�"*-4i�M���������)��=MZ^�O3�2�u3��n<��j
�v' 1G^6�keQ�NA���5��V&�-;���g��%^d�*�[�b���E��QO�.l����"{��uh��hZ��.��J��U���1�1�"qGKPJ�a�2a�lqUYK����*���������S����l�����L�j�F@���u4b�Ea*�$�2��\L�i>gUM~�r��=��%��u:�2���;��R:��X����t�I����M~���p�ig�����O�_�~��Y7l����czf���#>EK�O�X���=z���%JT�P��m�y����r��6m2U�F�
D��4�;O���4
������.]Z�J�,Y�������k��U+X� ����e����:\�z����5k�D�h�������X���+W��
����f��T���[=z�8p`��%O�>}��eooo__����_�p�x��s��C#(��2A�+z����%K|||�
�&M�j�JzE�����Y��e��g����~��_���7�|�����v�
u�w���i�z��5i���������'��m�������1�8�D1�����.�t�,Z�(i��9r�(W���� *m���g����T��R��i�C�tss[�x��O����@���|�u�U�5��0P�����5U9-Z
��8�I-��j���������O�<y�x�"�S��;@Eb���K�^�x��	&��j�
����)��N�s=s�L<�����Y�d���'�����B�c��~'?~|����C�����l&S�����))�#��A���:u��)S�����sS�N
��pa�������?|�.x&H�����1c���q��224$�����x�b�����@t����-[�e��5��=�FKZ�T@���u4b9^������S��!���ggg�Sh���1��6��������'O��jg�� 
��o���}�6�J��E$h��1t��
.}���m��]�zu�$IX�V���m�
����hC|�?j�r��~�	`����%B�TE��e�������a�^�|�n�:��0C�al�������ApB��Z�j]�t	M`` 3�������F��������&�!�A�(}�����s���[�WdW��<����o��)��tW�:�f����H���R�J5d����J�48�i���A&�4c�T�tp�6�>��r�dSS^��%t����$e<��~'�0�gWf2#�#���}�KF����=I�6����w�_������t������$F�q{�����������q�M���3�;Q��������N�VZ~$���T-T���W�yN�s������yP�g~Q�j��n>���,����j-�����FYR�<y�a�%^��<�������2^2���S��m��@5}�tE_`"�����LGu�)���T=0+�+��E�/""���

}��i����,$$���gx&���P>#V�5XU*�;��3��y�����������#���T�Q+_S�I>^��*=A��&L��`�����;w��R�)R@��_�F�l��A�I�&urr�'I��
��~v�*T���m��]���qc���i��I� �����	2e�����d��K��>����P���0��<y��?�v�JB�T���#�t��Uu�U�~�m���]��M���z�j����N�Z�t�^�zA�~��'����������S�>�<���Th�����K7h����N��m���))g+�Z�
�LR���{��Oh��#P�J�*
2D5#�iW��4hP�\9�}���4R��$c'*���Z�P!��]>c�s��PMtvv�������a�����o��9sfOOO<�i�j�s�N4o0�yDV������{��5Be�+W.�j����/_>���=z��q���d��%�a��C�I�j>��!t��8��~A��sV���'�h�������3-����o�'���L�<����V���G�f��!�X����q������+R���j��V�N���n�z����3gPU�����7o�Mk��y���-[�4k��j����6n4���K??�1c������!aG��j���/E�3F�Y
;)Z�6mZn ���s�4i����I��:�C?~\�^�9r@�@�q���������F���+Z�h�5w�8i�����I�z��_�C_����hm������#�bKK��]���9�3�_I�<�KK��$]����<������O��Bp�����e��_?e��p��f�
l���������p'N�����G���3gN�$�(�t����i����S��ive&��y���v���v@_�T�
�?>�����+&R@<�J0��g��jcq���PY� :6�k��IS�PG��d�iBY1�|�5����>|�o@&�������x��Q�i5T���r�Wv�LW34�����
"%�r��g��$3!U�T,?�I>~���I�\s|��� �T���wZ*��mW�0U�)��a2z�����~b�7��cJ�����U$�����f�>;=�M�'Z���X"1�(6�����w2"�(R�L\�_5�f>Q���-mz�Z��9���c�.�n�]Y�B	"��c�0W$qretjE��/E�3F�i���5�V 2����*����f�t��#��\���!��]�����+n�+Zv�SM���Z���,Y�z2�u:���T��<�s���o�)%ee��h�0_��`�x�WM�[����3g����3'�������_�Lt��?_�xQ�dI�z��NP�_e�.����?~�j��f����
b���6�QYL� ��^�`���w�y�����n���d�����v���'�������O�:���%��m[����z������e�l��6�!���7�0�y���)S�@���o���{DDD�����M��S��4C�C"�K��x=y������h�/
>�4�@A� �B�$kT)��]���	��k�p�B___�����O����S{��}���q����y�|�����t��/_N��I��i��u��6m�$J��:t���)S&H}��M��W

b\#�?l�i�'N�puu��x�Q�M�&�e�6mZ��������aaaPA�\�|�����~��E�>|@�������/�
�
x������&Lx���j��Qw��k����9s����'K�������+W����������5W�^���u�\l)������ ��;w>x�J�t\��k�%����^�-[�a��3fL�2e��=S�HQ�T�O�>%H�@��F��wWC����5k���I�"��K�g���,X����pD�={���oi�������	�#P
����;�1e����R�
ZN``�������5Xv����Cp0�W�^�|�r�F��@�{���O��x��}*�=���p���p������W�P!�����*�8�~vI���l*U����u������+�&,���lT�cD��T�����b�f��lyT�PAR0&��(QM�z}��8~�x:��5��?��+�k:t�������3s�Lt��-[��G��?o��u���~����G������b����aZ/��6jt7���lD��:�;�vy8H�$t����.�������U5u�	S\�X��X<��=�!HPR������[�oPM���$�c��u�"�]�Jlh��8�rc1�W8�|��]Y2h��<;�r�2��C�I�3r1����Ud;���e�,�M�I�+s%��P�e\�+K$n�-���)S������m�]j����fU)��1��R��U\�f�y���V<��Y@��V�W���@�x��M]�����*s#����uk���/�O��X��Q+��)��v��b,�mW��e��U�fSL�jt������$}q�TA�M�b�;�_����ZB�jav�?/�;�<�-:���f�	����]\\X�bjt���������}U��������h0�>m�p=:�t�)��x�i����D<��V�N3������[�M�6�>}B����������+j5b�������'���E�1K3!D��=������@3���j?�h ��=���'����#��=;a��M�6��������O�(Q���}}}�)�W�*U�:uj��9��5k�����p���7+��l����m���������}�n����S'�4:w����'������v�Oz���f��yxx�jp#s���/E�3F�Y�����tss���W��m�?�&M!�`I���>|x��-�o�����7o�U�V!����G��f��W����
h���'I���~� ��V'�?����hOt�0�H:}����W3e�t���!C��]
h�Tm2�D��'gx"�M������<GL���f(�d�[�W����X�n�������%KBSa=��e���v��y��=x�]�6���Z�j�~���i�>|6p��:]1j�t�&�������hs=z���%K�n����.]
���������t������:$R@�$K(446�~��������$f�.c�4�2�-�H�������2������
�x:=�����V~��'����I�&0��[�I�v�Z�j`��w����EC��j�:q�����Q��"%�	��9�����
D���f���r��Hi���4����?�}�+V\�x�M���W�\y����V�XZ��ys��]�vH�>}�%K��Q��/����_������v��&3��R��f��e�>}����Q���Q�����32c;	 �k3.]������	$�.�3��A�2�>%��U�T�[h$�!:,T��P�j���D�t�����<y�Xw�p$wK�qO����E��+�>BwS�J�����:���(QB�*wSe!#If=�j��&LX�xqJ�6���i�G�T]
{�������v�HA���W5�)q�����#�S�%w��SX2��EZ���LUPU���1b���*4P�,�����2��c�iE����g����F����i��F��E�o)N&.�����5�vK��KJ��1�L�Mp��e����f��l���w�oLa�M�d4��_@�����N[�=��rs0����_��1l���)q��w�^t}�����+W�\����������?�^��x�PtL�H7o��-[6///3�k����w�������#G�_~���I�MYvy�	��u��x�4k���%K��K������;w�����Jd�eW�j>x��M�6�v^�zu���
4����v������d���i'���i��-;�yXX��#@��k��k�~~=��5m��-ZL�:�m��E����7nm�G����}��9s������c���h����~~~P�
6t����+b'I����h�={�trr���d�m%K�?7n�.<y���Rl���f:���I��I���&O�L�<���[�����;w�����[��a���3Cq��������{���\�rYv��}�����k_h�������$H`����f��������KP�V�Z���z�
zP�p�K�.�~��?S���Q�����>}j��1�~���:t _��x3�C��"p=�|��QSh|��I�B��l��m��y�<P��������%K,X�'�4��_M���3������cG�F�~_	�zIT���S��T�R�!��a(���E����"��b<�����6��'�7l��w�F�Z�l�K���m���N�����W�1c�9r�I�81�?|�'
�{����8!5�z�R^-Z J�7���K�nen�5J���K��3�mM�L�2o��]�j��J�*���AeT�zcF�)&F��v�Z��fWV���?�0P#�D�t���Y<�
�\L�"�w�}w��@ ��m'O��/�+VSa��m��e��a)S��
�P�B��Y��:s�L�=k��w��`6��PW�I����I
0�����x�QP���1NX��l9PLa9@��������\C��(�[���r�Tw[*����A�+��J�f����w� ��tjT���1HX��)lp����fw��++�%Y�l��ft�0����vn��.A�+#a�RT���'�4�����%�wIKQ}vm>����R��i��f���������T�*�D��j�5�V 2���n�1�FaX5�S9y��w���;�Uu���h�2����Juu�U�u�]��Cn���%@�VU0b�6s^)uk���/E�3F���y)������\�u[��s��H�<���B�++Zv)���J/��Jq,s�1�_�Y���s���K�_�3��g�Zh��v��.
�R�>}
��%�g% aDDD<{��./EM�81��m�XM!)��8�<y�.]:��SB|xN�0���+��}�,�@� A2�����%"~Z����R�J�f�:v�<u��H���^�z��\x�s���
�����6�� <((h��u��'Z�jU�vm�M`�U��r��6���l{���/��2c�("�G�	&���m���\�|�H�"/^,V�������g���%��/^�����-�����^�~=����w/b�6m��P�c��=|�0c��1M������
,		m�������hd�?~��a���)S�x��a��%K��Q�L�=���
e-]����������G�v��Ae����������
��=��������d:�����[�n�����*���k��a������N�6O�4	�	�N�� U�l�Jx����CR��eC[�����`CE��O���(T�P��E/\�0m��.]��>8�~���]�v����]�y��i����X(b�)��PV���m��
�z��I�+�m�,3�
�O�PM�����l���q��?�0P#�D�P#�
8��cs��M<��C���.�c(�X�"~��S�����������.����4]�jU��y_�fM��N��c���f���L�c�3w�\�
�|8�����3d�0d�����Cv�o��%.�!��%EB���K�,�I,�����f(�d�[��de����.]�����W�����O?��A�&M�>C��}����~��}{��y�����Q���N�:�����k�w[�W�\l�&�q��0
w����#%�P�B���m����1z2��L���'NT��{E<mh��f����N��g��Ic�/u�+< r��%��r���O�����t������t���;�uy��D'v���U�v9�\:����"���;�f(.��N"#�x�	(�5��Rw��:w��$;���r���$!Y�&)4������l}����O��R��"XzF�=7���A�u9����|$Kf��f��F��C?y��Zq����*6�A�34pXG#��g]���#�'�e&gUM~"� �0�!U���-�w�Z��������N�]���S�N�Pm��J�-
���2��x'f�%��d�l�M�zE1H0�'�������-kT��A)
�3�/�z�e�N;�g�q��g�T8$$�����	"������rrr:~�xhh(���2�f����� ??�"E�d���g���<[�Rt9cD�����������=zt���r����/�I:r�H�<y�g�~������W�P]��B�Y�fE�R��1��������4A��Hxg��+�w��U�V�_�~={��={��U�~���E��*Uj���P���O��9r$��@5u�uH��xBt@B�N��6m
�'L�v3����
b��j$Y��PV�^�����/�W��{��=s�L�����Cw�������%K6�n�������,Y��eKIQz+���Dn���^�z�c�&��E�����;������}��O�����)���i��b���$��NI������rPU���n��;�j>x����\]];t�5={�l����<y�W;v�:�K�.h�-Z����a7l�?~|��&M���g'W�1~n��
���orH�*�����F�u��%�������<�������F�����+��`@a�)SL��7��C�y��YUS��Pm���1c��o�`��A���O�: B�kO���"6o�V~��)PY����;���iRp���0���W�]
�Ka'=C�>��k�.I^�����~��2d�_��y5����S����/oh�;���/^�8}�t`��3g�-Jw��z���tl��k��^�
��Q�F��q��|���K�)g��h��r�J�>}�����/^�V�Z�&M�_ .4�
���;7��W�~}I�cP����7�O�Fgmq��epe��gS3�rS�$-<%�i3��ep������������T���#�t��Uu�U�~�m��'�����?x������IX?����zE.�����s��a4��1�<��)S��}�fC/a��2�V<m��D�-�f���X�#F0�����O�8���vJ�~�����*����+9m�v�"����K3`�<����+�K���d�� ���v�C��a�,� ��J����D�$}A�d����E��S��g_�.g�h�v�3;����W_vZ�M�E1����Z���+?]M�G�`�M�K��T�>�V`�LX 2����5���"�4���M��KQUG\e�������U����_�,qt��>dU��x�@E���1
���� .B������f��*�Lt5���3,p�%������[6i�P����)�f�_S�I	"��=�Q�����b7v������l����")�����";�����������)S�}9l>���f��[�����%�a@E��vc�]�0A7��9$��'�4�	��8�m�4r	��X��3��3SM~��G��'�3t��V���iSDn��u��
+W�|����������+{zz��55�W�^�����(&F��u4b{�7o^```�T���������$]����<������O��z<���������o������S����;��� �����m�v���?~,\�p����������K�-[��K��X�b�����,������{O�>]�P!�|��	�Jg<y��l��P�6m�T�R��+W�u���)S�!k4[v����w���s��o��v��=u��%x�,;��9s�A�|�r��m����R�"�M�:�E��R�%*U���Y3��/����Sw���S��M	�N�����>D���o��:�X�M�d��H��?@5����
��j�J����
;IBnnnh��{��-��+A���#vJ2r���&�k��$I�9r���k���I�&N��o��'N�@2 +�6\�x�r��-]�4m��~~~t�p���i��{Et2�����w��


m��5�'�n(�f����4�Q�F����f�����l�)����f��a��A�_��?>,s:����e���z����LG�^�Z�l	X�V-�[����/Z�x�<i�$$����C��b��0;]�v����	.�
�������3��F�{�u�}�6\���p�E�P��U�V��1�9�	��,R�Z@�k;�1bz.\�1c3�M�(Q���,Y��D�O��`����k�asuu����J�M��i�&�2��E�;���-u��L���G��s�,Y��������8w�*	_G�:w'VSA��<T�����$�'OmFfD���
b��j$Yg���J�#�G�T�|y�f�v���'�x��E�fPb��(:I�M���{��}����������Kr����n�6[�l,g`���M��yv�3�$�	k��<[�Rt9cD�������S���������^x�s�)z�m������R�Y��e�8�M��
�hW��)����~�%Y*v�l�!&F�H�rO�]^����qs��?�9�s��ego�^�J����r���8,�o[vIa���5Xv���U��a�����)����h�km�RI�-�����b��h;���iL��-��+g[�dL�h���8�q>�W�����f���]��J��~S����7V�x�y&hc����gP"f�.c������[��d�a�a��gO���w[��K�j�8q���5O�<����Wg���^�:�������&���344�^�z�	�b����-����_��-�������7m��"E��U�^�p�rt}�Md#}t����7^]�t	���I�Or��������!�9rX�WdS��>{��A��v~��i���+W��Y���C���Y�����C�
�q�F����
6~�x�QFg D�W�\�T
(���S���l�I��G�!b���u�����Y�z5z����[�x����3}��$I�@��|������w���k�2d��v����i�yvf,�m���CT���
�D�+\�p�J�����o�>���'O�z��nD��T�����%`�0aB__��~�)K�,v�M_|�x���b�.m�d�l��L5$�*E�3����q;�|�|���Y�Z����H�PT���5kv��9�k��
��_��A`������[������Q�'Xt&���5����4�k7�L�$���W��=z����w��^�:\�|�W�h�N
�Jo��0�!88�oi�Z�l�K���m��Nz���x��L9d�e���-[v��u���4�������K�.�������O�6����S�N��a�	��x����;������7o�dg��|��R�5jT�T������o��nZ����������E��������a����;	>���	,y��O�<<x�w�}C�AX�'<z�����/^,Y�d�l���%����0az�@/�.Qo���I�G	�2e���8qbTo���tI-X'zy���I�&-[����MY6���6����x����
p����
;��Q�?������A�-[��F��������������4i��^��A���P��E���������}�����ab'U�v�/_�b������F��g��a���M���`'=�0��b%e�6�c�]Y��;v,�*Q�KF�p:{�1�Kze�/f�d����������avO-�R�"�Hv�E�-$���9v�l��
hI^4WD��l@��d�&_�����*��QV[
�:��U�C4Sk������~bb$0y��L��`RG6�))����O��b&S��RTH��p��Dr��~���	���+)-�0$�b�HE"_76!F�d#���<1�+��9�n�i��^�g��l�\��a�3;�E+8�Zv�54�cS��v�X��?�M"�?�j�������z��Q���1�����rpp�������o�%�+�F��w��M?|����*�[���+s���X��L�$��w��_�^�zm������W�[���oL�2%Q�DE�)\���?���T�\�f��la��r���z���h��d��}=]"IAATy��������n���\�2<<�f�  h-8��w��-P���7o���5kVoo�q������[�jU���*�������3;�%K�J��W�^�]��A5�n����3�
��g�T�Pm<5k��d��M�6�[ww����<x��V�eMbbt	pXG#��hZ���O�?�@WH���o���;,�L���:���������cV��=;u�T�-8@��B@C��vB��J�j��>������9���s�Q��1���~�������	zyy��;744x�d�`�9f������
J1�����@���K��Z����\
�����C�[�
N�81G������%�������e��g�v� ��U���5�����J;�{���+W�Hk��J������~�:P�}��I�&���t� �OG�B)��y���T�R�
bj��;�_�Up�����ip��1�Lt5���@�[p�`4��i��S�y���l�jW�Z54T���c��������Y�x1l �1h�/���-[6DV�^f���vj���>;u��@p�����ZA�pS��]{��}x3x{����;�
�5�?>�<�_��Fs�]R:�@��'O�=������}vI�<:@p"�aM�6�������N�<"B|H	����/_��6mZ�d�
���,YB���=����c�G�S�!��"I�b>>>�ph�p4a`�Q�b��Y�X��������������1*�!�b'�z�[�lA��Q�F`�=�X���?�0P#�D�tj�	8C��r��U�)�P�y�&|3� ,��K�n���x4.]�����;w�d��H�}��w�i����1,��_��k_���.o��;99��`
��T��K$)����������b3
�&��������k���1��6��������QZ
#�����-J�tuSB9���E������m��xUz���@et�_v�'K���6��Dj��Ue+-;�����]�oj���Y�N�c�[�Wd�"��=;$�a�������v�i��u�[��*����ggk�(F�F<��u����������L�@�q���Uv���"�D��������]����+ R@<���,�D�|]���A\�@d<��dFe1}R���of?%�������d�^CM������Kw`FDD��u�=���w���e���7n@@�����f�h��P�&n�Sh���1��6��������td!��'O�/��t�Thh��G�hh������??z�g���'HY�P�k���I�����������4�!Ys�HR�
B+V���g�=z|��y����V��p�j8w�\�����X�b�J�:��#G|}}cjn�5*�H�@�����e�/��/^�@�W�\	����c�~��y
����O�{���/���M���_��5k�4n��������4h���4h 1�������u���	&$7l����h��2e�7o�t���T�R	���P1F��/�������/_>e�:�[��WXv "T
�b�jB)���<�r����7o��?��Q�O�������ys��J�*0��6m����{�9sf�?V���R-��p��>Dj�.]:@#��^����������&���#�����+WBBB@��q7����/���0q��J�*D!�v��M�0<qvv��%��I�&�K+>Y�x1PVq����)�2k����"�?��Z�+K�����gT/I�$�<�	x����!CP�h�:u��1�`���|����������={�T�\�*F���@l@P��;�f��q��]7��={v�xg��t���.]rqq�����P�j��g���_����Hig������w�+#CC+#[�h!i��
�3E�����GO�:5r�HZ���x����6�Fu�6�����IhKt������1��6��������>|��j����a�^�|	�
��������>���g�
�m�����|�2��D�p@���;�0��#o�&�UU�2��"d��q�����{���8p �
�:��uk<�t"#�Afw��"���Oi31WD�]^�HWH���A�{�*f���M����Z��������H�a
����?�h����5���FCvH0|�p�C�(^y{{�����G���$+����27�E��g�&����I��� 9=b��G	&��YV��c��h�����V���u��j�����Mu��{E��	6�����^�c�W$)
�;^���1A7�_�+��b�
}�c�Z`f��y�,���������h��"�����uM�����E�������NA��� f0-z���h#���fi�=��JG�'����(T��t1����:�DR�_Uk�-|)��1�M�L�����5��+wnh?��:{������
�[��c^/�c�y6�1Z�Ln������y&h;��444�jV@���f(�d"0��db����:��(~!�����R��=����5g2�����}��-[�A����w�������������gCj������Y���M�4)X�`L�BX�'2�u���r�X5���8�����g������9���~B���\X�d��7��O��eK<C�t����������������A�eg2I5>�}����3���O�^�~}��5$�}�v�����]�t�X�"x�+W����3�z�bb��uH��s��� ����m���sAL���f(�d"p:����x ��q��M����	��y3((����vl>}���~���C�	�d������E�h��u�\��]�t���6%Xq�y$����:i��n����M�����.K�*U�Z����>}�m��RT�eD��T�>���x'�u����W�X�qA[k�-|)��1�M�L�����5e��U9�8P�j��'#<<<���3d�Ac��'1b���W���U+���(QH	����k������[s���_�|����=zC@G��;���P�A��!6�h��i�:u����f�(`����w)S�tssK�&
����5r�6��>�|B�����c��,Z�h���v�Vp�'�9  ����}������~���j�:�<RB�%K���_na�g�E:F�WFN:iX�=>|����J�
�����K������Z�
���C��f��m��s��e��I��cXL�.�(`���A;�a���l��!&�����8$��'����Ol��;,8�c��5G�r����CwB/^������0�;v<{�,>��6k���U��'��#G4��0>0�v��������_�~��|���)SH	���T��XXXX�N�lQW\Gg�a��3f�'���.���E �A5����]���
K=y�d������Q�`R �J�*���x�>	�A���PhZ��<{L�K'��E0��N3�h[�$�e�
$nWl���@�+�X�W��Ld�&�:�5K��-��]�$IB�)�������v2��Axv�0K��f���'��@�X�t�0O�����D"��U�3�an�r�4�����G������������"�������F)�~:��d�E��1�L]"m21g�Q7�i���]J\b�0��%n��"V��|~a�=�X��.��rD
�7�V�=m���
b��D�d�h�AfD����f;#��n�'z���;y�U�_������Q>�k�T9�t1A[(�d;�l����5��]���M��V@���������H�a��k�+~��a
%`����`�����
\�z5Q�D�g��������R�J!�����W�V
=��iVSl����D���[�c��h$5��w���7o��i�<x1��+V,e��d����c�������S�����������_Ow��� [����|��M��������W/T{��9�W���B�.]Z�L�a�������K�>��'F�E:!&�������0��}{������Q6�������N�l��]k��1~���
&L��f��9c��)R����?�<z�hHp��A�[����O�-N��K�,A$�����,��M�7n��n�����g#""<<</^���T2u������C����?HH@���{C0?��C��}( ^�k�����)0ny��������;g���	�~�������4i�w��V��d���=��a������i�n)��v��?�:r��d���� "����/���&M��(�����~'�!����
��===U��K�Nj�!!!@
��8X�-[6`��i�$y&&{��q�~���`�.-[�,y���p����"~��j�e�?d����
q:���381�|cddz��=q���!C������k������a�z�l�f�h��9����	���Z����7c��m��q7�	���8q"����thB�T���0n...���r�
��v�Z�7o�������N�:�.W���;w([+���Di�!K�,hCI�$��0p\�q,����=�Z�����g��	6n^[@���u4b�$s�@S��c�h��<�8��.���d��sV���'�zPp(�@�r����/�q�F��={�DJ�h�= M�����R�[�#t��
���;�uk����v�i�v��av�0�{��`���L�P4�%W2�sb_�+3=��@�e��H�gPM�r�-\2�E��S��Ab;���/b��t9U����fx�'N�����c1b��uH��xh����)�D�|���|� �Y�&s(>3Qm`bS*tgZ�O.g�+�FR�b�H�F��|�*��v1t��:C�W�����M���l�K���m�������-q����1�����Zz&S�L�y�|T~��v:�3��)�������5#�D�tj�	8#l^5�'��I5��*#.)�����w��\@����;���-�����S���eQ���mu���/�+C����"�d�s#.W@��x*T=z�(k���6�z��@4tRE���ohh("�����fm����y�$�k��m����C��-[��_�~���<�1�
*��7g��=�r����L����9��!9r$��o����3��i>gUM~b��E,_����K����;w^�d	�"��w�I�@������Ap�)~�1b���H�q��L�2)R���b�HRV���������CLxx8*���k${�����W��[�jU�j���S���s��M�����;���������;�4i�2�����j>{�l����F��1cF����,�*U�"&K�*;x�`H�w�����w�n��
�;p�@��M�^�z���{��y{{3�������9�O�<�����w�l��a���e�`J�(�d��=*�V��w����-[J1w�0��MG;A�G��H�^��@��'N|�������K��f�����E��fKZ��t�R�$��7��y�f�������O5������Y�d�[��7���[�B�����M:��t7!,;T�o����Q����_�Z5jv|Y���,�H���5`'��h��<~�P�@8i��n���<y�d���'�����?~��
���'9@�����@��{�B��g�N_��}CBB�S����
�����pM�R��o���'LC������L����:��=��,L/�0�_�w�O��
�����������x5��o����srr��(�O����9s�7o�@S6l8u��u��e�t�0`)��g'9����|P`~�l����uww�����G$@M�}E��}aZbT�~�����x;vl���mJ�J�����
����]��`���!��5+I�$����g���v�v$�K�;wn1((�k���D_
}�������
h�i��%��h��4��z�3��z����.iv	�1*�!���s����8d���f(�d�[��d��� /��$����!>*!��v%�=��`8i��nhf`l�yvI�A���vd�c�_�v�&������H�,�6p�1��z�1�Lf]�L��y��i�>���%VA2������*�c�c��� ��H^��	?��z`Z���w`���S��QJ��HL��:�4��O�Xy3�qH��OL�\�|���w�$k�+�/�(X��xB�����&��_�NU&_��)(�a-t?���R�������_-W����������?��V���|��2Y�y&8�����w���c��m���
:DMJ`��"U{�y�V���G��f���7��A�9F5�}esE�%�������N�����B������`���v������?��?���}vVg�T:�[���� �y&hUMK��1���3��Lq��k����Veu�C�<�h�Y��Rbv�-VbG��4��`S�>V]/�U�2��fe�-��#U��~Zq4��lU�
g�G�Uj��u��|��+Ho�	Z����iq��?�0P#�D�P#����3���?��k��`���%k����7o�,\�088�i�����+V��{�n���V�j�S[��<z�h����N�.]d�{���@���������9r�h���l�������go���������<y�R�J-[���[�vm�����MKYY������7o���c���'L���r���;�O���sgD��^�;O�>���������k��������Z��qc�������s���������������������}����3���{��I��������l����\�
*�����W�~��%K��T�lY�.>�E�h/T�]�js4n+U��������Q#a��...�$H����s����L�O�:��3g��
�N�<�G�P_;�1�$����2r�WF��|�;�?��P�b��y;v��a��5k�e��L�2�1�y����_��'�*+m>b��:�OK�6s#�0��WWW����c>mt9cD�6�*[#j"�k�8)Eu�%��h���&!`'��^�zu��u����S���!C�%K�$N��-R�t1  ��OBCC��=[�L������K��F���}��L2��b^v��)Q���0ggg��������^5�dw4>�K���q8�fP�	�y��)�0�N�*�6Cm�/E�3F�i��������vH��6���t�����I�"���[����:t����c�{��V������w>y���k��;w.���<���d�����g��,XBA:���7{�lrMx��8v����q_�z���hE����
;��6K����)�9���MMb`�t��+	���G<���7o��j��B_dPI��h��5Y�6�PL�f�����=�dTG#�0b���������j���h����������
������'t��`���y�k�����o��F	�D=�U@�������9��t�=I��T�������C��"����D��DCl(>�r����N�e�.L�v~����)q�R���G3dDv��HI�)��������6�h���@��%���"��|�6^��n2F���?��a1,o8�g�^�.IZ�x:������<�T��+����#���T�Q+_S^7TQ}�������8��%`N-�2_+Zv�2K8D����x���`������Nl����LL*VH�B�_8�����I�@������}K�'�z���7n���/^�k|��t��&Mj�NhW�m��������S��S�L)<�-|)��1��R����k��IGO�����`�2e�'�u�:�HV�R��������.]������2dH�>=��AAA�NE�N]��1�#p
Z���(�m��={�������o��1�?�1c���������q����r�
]����!�%sH��x�YhK��w/_���E��O��6mZ�~�ip��1�L�i��x���g�6o�|�����g���������+��N�5jT�*U�|�=����)�{��o��%J����p����K�m��F��p����D��x 7i����K�$	X �}4�l�hF���9��;�l5��l�qk�H������is��I�*����,����7x�0aB@���[79�Y��s���AJH�����Q���������Lk�������+�uX��3�92[�l�8,K\�C"��]s�0x�+W.v}�C�8�i���A&��IV��O(%4�!pi��}���]]])�������o?z�h��M��r��m��|�����v��M�����d�g��;�M^�vm��-�K�,	�
��j~��	i���o��������++��NjB�����*��uk������w25�k_`����h��j��PVDB���3g�$K�������4�Y�fS�L�F�e����t�;;!Q�_>����2�b^�`�����
�����;�>h�=P7Za�;wn6�i���	pXGs�����@`����;v�H���:�2A)N&.�����O�3�r����;v���0����Sg����z��{�.�K�����>��}�V�`��|n�q�_�C�4v��1L��'O��S����>��������UeC6���w���^'`���!fI��),��iC}DbE�x�"�L�K��v�������>.��Abw��w�n���Q�(�I-������R���He��r�,��>���u4b�t?���M&����\;$��'�n��Ox+O7��!O�
�I�]����2�GF=����iSF��Vq���m�%������A�%�����5��)�?9d�����
\�,����iT.��l�N��r�3APw^T&�B�O3�28��db�5EmN\5�1+Zv#�& R��E*w������6nS,O�Wb�YM�U�6e��_���O�b�75����iSf2�'�<�V���/��������1�����2{��
Z;���G�B�Zr�u%e���7��5���������������w�R�@��]�6o��`�$X�xq```�|�Z�l���,v��P.\x���2��J�����$}����z��Y�H�y��=|�0G�����
��=�z���^�v-Y�dI�$���o&O������C�;v�J�J�s���Dvc�^����`���OeX2�{��EL�j�����O�>}�����[����?��s���_3���cD��T�������FDDL�2�F��*U�������������X�L]���T���UE�?�_U)��U����aaa[�lY�t)t�a�����������G>|x���7m�Fe��u��Uu����B��[�fM��;_�\���w��y�A� 4Q�DM�4Y�z�o��v��u�����o���P�B�x��j����Q��C4������H�<yr�&�Z�3&�!��?w3�0�e�ACBB ����������wqq�+$����_�-[6//�E��]��U������:��4p��^�z�O��n���?Tc���0��+WFc�_�~�	�_A�5DC�Z�*��@�l�����������O�v������m[�F��g*�V����9s��g��q���m����c+V�X�o��q��Y��M�8����|���S�HG�l��p��t�b�;��R����s��{�2e��h���w��^@eO�<���?�������i����L[xx��A��6m
�>�0����d���N(��`�����l�2�)����{H����&L�!Y�����Wm����2�"�e�N����w�
��m���������1#44�9q��s����9n5?��*+��N��.�k�nWF��������#�,�wJr��������'T���3��M����@G(%`�G�q���9s�����C����/_�XgE�N�9���*��]�6�	���uKJZvIQ/H�n�����Z��<[vT�����%J� !R�[r�������tr C$Ys��=�S
l4���� ���k�L�)�<�1Dg��Y�k
�a� F������o�<�����,��-��ls�����])m��~v�L���S����N#��j-��_�����i��@^Q�N,�����+Au����"U��;������c�
�����J��]��E�(IrMh,�����]��4L�l��f�aL�>0��I��X2	�	w������^?����)q��_��gM��x���[��W����������k�����b��
����S�N�F��$0�{�������������~�����f�����������y$

:{�l�r����w���5k�\�^�x�4Y�d�;-�w�r����=z�@�}���>}:��r���������}��K�.�X��������%�����I^���)S,Xp��]�����~'����>}�T�Z��~������s��������e���0a�������y���C��5�	�B����c�Z����g��1""�)[�l���=���c��?�0aB����?�|����|������U�����Aa�����{��;%R��q'M��:u��{����O��]�iW���!��m�w��	M��u+X��b��=}�x� A���/W�T������B��!C���o���'O�a5�&M�"E�{��
<�����Yj���!�6m}��}�?�V�-5�x��A5!�%J4n����=e���I�1px�n�8~��%��4h*���'������'O��]���3��
���S��N��������#�Q�F�p�wY�v���C��h��c*���p���|=�I��2d��k����_�oS�pa'''X�G��O����������?~�"(����J��P�V�N��1c���S7��?~t���[7Xt����(PYA;�f@E���%�c���9�3�488����i����	U���4h��C���o��Y���U�TA_=�E�������g�E���n(P���v~��j�/�n0����*T�X|���3�6e�M�d����[T��b}vU>b��k&�U9�t1A��]>]�g2��������#���T���UE�?�_U)���<]\\(,+:��T�.��D��@Y�6Y�d���$�B���c�}e��S�!]�2i��������n�����{u�Q��R% �a�a��<���"��'Ldvn�]RF|����#VX&6�L�n�b<�p��FD�+l��_c$���
~N�O���&���)���}v�N�����[��N����)A�N1����B�3������H�,����t�?�0�|q&�����a�YR&'I�4KD������;=�4�U��wZ�W$)�]��*��W�'#FzE��v��n�y����r��6m2U�F�~�^���y�?�E2�c�����%k��M?~\�l����[�h�5k������W?x��^�z.|���7�|S�pa�	�1��Ls���������S��I��j���/E�3F�YJ;��G�9p�@���;t�p����K�6,a�����w�>y�$�����7.Q�D�����7�9sf�|� �'N���djc�|����������?���u��=}�����/_�w���O�>P��-[~��w���W�!(K\�C"���q��;w�=:{��t���{�x�O3�2�-�H�� �������G�={�L�.�����o��gh!d����={���������r����S�N�m��\�r������)����x._��������k������K�,Y�/T���~��48��hM���O�7��f�pb�����C����	����4�@A� �B�$+��M>$p���h�P��������X���[��'N�|��m�	�e�U�mtqq���q�f����;i���]�R��"vRU����2e�����q��N�W�\>*����3��LY�r��d.�r���k����>YW�d�����)��6���p���&M�@)�$Ib�oB���5��!C����F?Y�d�5*Z�(<��:;;#%t���]��W����<i��#�k=U�i_�zGr7��H�JW��]RzEW�^E�>}����={���[��/_�z��#G��u��r�����|����t1A���w���?z��z��v�xGU�y����r��6m2U�j�D����#i���>>>h������w��9~�8p���k0�pF[�j��t����k��
f���x��S�Ld.X��@����$m��m������t�pEy�����S�N�?9@5���`b���y#)R��g��	��M���:p=a��8��]><{��H	�5k�9u�����7o�?>c���n�j��)���K�.y{{K�Xq&�$
�HW����@1��T�:��`�f�h��.�\D�l���o�AtH��O���OPY(���~K��[�fi`����b��MK��9�:\@��dn��wF��o��I�h�)%c#5�
�������}vz���Jb�����v��J	Iq�D�c������J�*�@(��A%[�a�nK�_I����':�N^Z*����u�NW��g�W,%�l�j�A�o�IEND�B`�PKH��GObject 2/content.xml�][s�J�~�_�����}�T����y����s���W���$�������*���O�,�;���
*o�ef��?����{V�y��rE�j���r��6_���_�57W�����r����zU��l���r�������;���C��.�:��w�6������g���k�u;Ww�n������������z���M������^U�����X0����z�S]��%X}�O�<����w~��o���r����x����,��v�����0n�P��U����MV/��.����I�����"��wY5�4I������frD|��0Mz�T�c����W���W�����?���`����c,T��s���Ti��'�����/�r���-�V\F�Xv����/��&��������H���1��8������!��!�'�e����K�������69������IvG�T�	'5��*��U3f=�0�[l�������C���j�
��%,}Xx��y��7��/��]���{�J�� �5����3@�)��Yh]>�@�\�eO�����i��
~��_��!syW@t�gE��J��)������eR����qv��O�.��F�Z�Wh"�k��E��~_:l��#��a&�(`W�}�<4%p[��[��oo:���R'�&��Y��N�/W?Sz5�����VY�o�b�/�4��q~@����h�U�U��@��r��������q��s{����l�=�:X'��xv�\���l�d
���Y��Y=s�	���?��r�9���/M�^����O��%g������uJS=d�u��iCv��6��!N�rF���.!,�~��������A����(��]�-���
��������(x���Nk�fZ/_�3��G@���Z�ow����F��������r�'��d�Q�hP�:���d�|��l~��V�n�fEd�N��!�<�S�?�TY�����y���ove5���}���j�<9v�]9U]5���`����>��h�U^�>���.+�BE�I�v���i`�*s� ���3�o*h1������<�{�=)���*
,�<��g{�b���������}A�Ql���Ne[e��t��� ^����R���P?o��b�<��T2m)O\����5�dAL�MS�J�����^;[AiW�r����?}��OO����A��`d�l8"��A'��O��gd�A=�it�o�����h:���q������!��9��|DG�h�>�#O��z��#:�����;�Se��#�Gt��.�S;"��5M��#:�D���!��Z�R����x}C�����Wo��8yg�D?���������-O��8w��y���t{��a����IT�qt����/W�ho�_�W����b���������N����_�i��7S����[�R4y��	�B�������6����������o�����e��-gwEYng���l��0���0�f�M��^?�!�B
_�`Z������iF�kU>�?��O�O[d�l�������g^�2���d8�������pz��Ov�]/pg6.q�;`_��<��dt j�##nwx^%;����������d������j��C��Z�es�I�S[�������������P.l�b!;�P��uZ���I�`���I���p��I��hN�R88X�m�;���`��^��d�*�&���i��������q�|��_	z!���W�i����uV�m��y�<��O��r��
�6e������u�����y�N��vz>e�Qk���YC������z��������l�l5k�1�����W����m���	��Y���I��I�������go�WZ���s��t�"/�2� os�6���m��-��j�KzF�1�,t�Y��}�b��t=�,o�����^�oS4�F����O���^���h�3F_H31Y�_z�~���/t}!��d�~�5�u�f��a��4S�5�����)��F���LO���^���h�;F_H33Y�?��e�i��8�5{L�b\/{L�khL��F�xW�r(b���~=�����L�b�=��F���d�U�i|��j�u�D�;c�`/O��Z?p~4V��������	p$����u?\���#���.��6���ns���l[�
��Pa��:��������n���7����_b
B�YI�z#�$�����bJ�������z��/������e���Hz>T��A��/)M�j�q��Gyt
����*i��n6+&��G��Y}���-�BBn�VV3.�Bz���y��:�w�\h*$��%�����d����!�%FZ����1d�:�\���$��r�!����<��'#���.9]A�Q�*���c��O]^��r�7�,�\q���>p>�yM�{HM�VJSF5����)�k9�Cn����R�U%9�?���]��DpC���Xn9�k�v��'��L��	�������f�*�p>AP<	��Z3M
'E�@
& qJ`Ek(�C�$P��\^�6�P,	$�R���PD!g~�d)��XR�m�����d���$ �8�����k0�����X�P�2�A�B���G&E�A��%�k���L"Z
�&t�3i��c	0QN`�b-7,���bI�(3�1(�4�
� ��I (�n�i��"X���Z�^hM�|�B�^���@�� ���b	OM��r��� (�4V2K9����IB��A�JQJ,�`��JmY*�%�|�)xI@�$ D**5
�EDE�P����8I��x6��	_Au��
MK����MC��$�P<bP�2��z+H@M�H���1V@�FT@�>OZ�
�t��� =r
��;��b�(H�@�d����xu��
�6��&���v�L���X�j�AIn4A���h0�	2��ZLM�f	
����H�$�x�@�P�B��D@�'�8���S�%@PD	@UK^AM$]�!�0�@�Z��,�JR@n@�LoYp]����wP<jrE���|;)�bI`(��\S�b�v(�(���
�R��8�P�H�����H�G"��Q����LC>@����h4����O��v��l�C ���(�����G��$�����xY (5h��d��BUC�#'
�k�������<��k�-��b��
�h���z��$,��v�P<���4�0GqB��&h�8tIF208���v�m�`��2�]}(f�,4�nM�<��=���h��=�j#���s;$$��	C�����u���P4	1��S!SK��h@�S:���S�����{�B��N��0�|��X�EbE��kvB,w
����(3F.��a��A%B��IC�h	|���(�����0c!!Pw�w3M
%r��P(�p��P��
��]�����y��!��4����-��'���13P4	�.���JZ��C���@�,
��)�&E��%W������P<	���[i�4"��tAv�.�H��h44��7��2�^��I4��)	�qD $���A��aRL�����9�"?�Q��x{�)p2�G��yxJu����fAH�����PQ-����Oz#$^H���
r �e
�"J����ej�SmtIb4��Y��}
�d�Z�i�!���x���'4�K��x�WZ(�_J��P<@��^�3s��-B"Z�U$DCQ&�
,�C�,����Z��8�O�H��]�q��d�I��GI��#�0��S�����h��G���:tAR��*���nW��bi�����>�:�jf���EP4@%�K���M6�6���&���\��@4�e�/����9!��/� ���	~!����=��(':0?F��/���+��,E��=���1�BD�	���;"�s%�qo[P�� ,���q���h�C1n�kNP����8����l����W�r�>���6A}��x���[!
�F�7�����	�1Jc:��x���Y]qO���L��@C(U��a�4c��tr(��y������+�C#��g@�n����  �r��*���=�}$��Py��Rj1"$b�.�>���K4���zb����*�~�g
�b�������x�W�~�c�r����!�8�
cDX����H�w�
��\1��-1�:DH���{��S*��#��[��f	�������A	��q������H4B�RB�#���v!���8u�� �)���#����rm�2,������o+SFH�@x�C�w;�!�����i ���#5>t��>�������E�������O���r�����PK$���$�PKH��GObject 2/styles.xml���r� ���)2��Cog&��>@��c�)F���}�.�&)�K[�/	I��i���cJs��$[o��
.�C���9}JN�?{(KN.��5�&��C0��b��h<$����KR3�
��09�pHcj�����=�
L���-y����P](���kk�K�Z�%����-�Ap�~H��4����}�U�l��!o��3��Jx���	��i��34������>1�������jW�8=�_/[��-��E�T�&:�H�z�������o7��h���.�+n�
pz�D��
P_�e�)�\�'Z�C����k@�9�2����l��=�Z�[g��J�U���#;�v�����aq����<����l�<�����#��|�*U����V�#�|)��3�ex�!�1�py�������:7������-uK��������&����t���/��PK�����yPKH��GObject 2/meta.xml��=o�0���
�f����`�:t�����E���`#cB~~�)����}��}�s�=7�wB�I�r��x��RU9y}y�7d[�e�p����oPY�A[z�V������(��NvL�
v�r�[Ts[��M;�Z����m�0t��6�i������W��M�(�k:i3;�Wjd�JZ�k��O�..
���LWF���.l����I�p?w�ci��!a"���-F�b��(^dN�B����;�n�����>�h���?��6��:���5���$V����e���~����P|PKTnw"JPKH��Gsettings.xml�Z�s�8~����;�G�P<���%�\��$��M�h"k=������c7�men:<������v�����5V $E>�:Gm��E������^4�[���|N]�=tC�jJPJ�"z:�v<<�B�m$�J���\��4{�m{+,~��(�XK���Z��G��#�V��������.�9]��/
Ebe�����I+�m5vJ���k
;$x�4�?�Mc�8Rm`i������jV���s���3#d����M�)W��}�z�*�k�+3��PO-����{�����@�L�������7}4)����,Xg��v��/�)�1�����R	��0r���4�@SzN���K�>���A%�^8�Dq��*��,�9)��O��gA��!_��?�+���Q�7z�^�%�
~BQ�zJ��@u�����G��+��O_���[<��f�J`'y�R�^OP�Q)�k���O5J����Qc�h��Y@D�f��%��4M�3DD3�!d#g<�u��#jF���Z8�$���N�v��G8����GK�0VG��q����}��G�F�7�m���m�$�?�_��2��������%���h{�I8@�oD��<��&s���� p������T�����K���4�(�:���n�]�"�����%�Z���\_�@��,���W�k���l�2�@:��"��$���H���#�b�+�k��0��;�����d�4|v-^�	g]Q��~M����u�~�@����R �?��j��O�T�S��A(H���9��F�M4� gi���.>���������w��������$�3>������*${�:���mn%��D���r�
D\��c]E
����^���B5�ZPazS4#NO�)'bc�
C}�?�����G\]��0��~��B�c����'��.�s���:��Q�6�����1���������pX�Bf��k���P�o����Q_!�b>�}��W���z�G��~s���EH���v�	(��c��A�uJ�A���:���9,(�nW>�|��/�W�D��M��]��������-��fL�>R�N����b+����_PK����L�)PKH��GObject 3/content.xml�][o��~���X�}�4�����^��M�-�W��$�R�@�����!E�gL)t���
���f8���9C&{���M>�O�*+�����\M�m\$�v���?���������X.�8]$E|�I��4.�5�>���j�����������Zl�MZ-�xQ��m7k��h�j�T�S>zz3�?�N����X47��r3�?;)�����X0j��;��������Eu�I��g�??]��z���f|V��9���� p|��+�fT��<u�Us:��n�&������}��w���m����y��_�����	�����`�^��w/O�s7Q�>�3�
`���o�X(7c�rc���2��V���_�AT7�M�F\F������g�?�Y�������q����!��8:������!��!���������������tg�<��Um��)�Nj*�e�+��`��x�o��l�z��Nw�vCWe�q�Roz��? ><v�B)vv%�fP�5�5��9�r��ru�����T��ko��q��������@O��|^|�#�;W�	���4������c�b�� | M���7���q��\j���GqU�z(~���aS�9��W��������n��i����u��(v���������t�OJ�#��&��$��M�Owy����{d�m�Vi9M�UVJ����8qo~���/W�87��<�e���jcm����r��MY��n
���iYgi5q�	�*�?��b�:����-��/�\�k�%g������qJ]���s��nBvmW��!N�rF�?kY@X@�Ve�������0��)�Q�=�}6O�����GkzN�A��5}�������('P����y������jG/�<��n����mPr�������e��e�l�wI:]gI�n�q��@&�(�@�3���ZU���2��i���O����(�l����L���c���c�U���o6�w��i�g��"�*���i��9V(/V�n�M{�)S��@�e���MC-F:�s���s���'��cqW��%�������
�����U���g��:���lB�l�������(�,%�N������������K��)��%�1&3b���6=�4jhW:"�k�	�v�+���*��{Lz����Z.#�e��0:Q�p%��au��q����C;Hj��x�A{�=:�D+���SBr�y��8�}hGG���#��{t���ll�^y��^�>Z�o�$/*V$����K4?y��n���p��ts��a���bITuq�N]�
�����Z��t��j6�����2��.��<�����*��������<�p����jgLX�E���O.�y+��3��i�(�n�Q���Qd��|r��fr_�&�����A��������-�@��=	��iyJ~���u�8���,�g�v�t���*�&��E�Q�-jp�U'�Y�zB����nBa?=}�E��p��,\��./�iT���@�����;����%B�'I�6v���*���E���K���HCp
�M�?��H����i�9�i�f���K1����)�&n�^��(@����+��KW`�n6��*��*lF4�
�n��h�P�p��I��~��n��+�MT>M�}���������Rx8-�L���z�����������+�g���$�LMWE�Hi���E@��G�7�����Nk�$d&d��jf�8es�IrW6�������.�L���VZ�Y2�x���&��(O��J�^��9�t�������~�?!/�t��&�����(�w��;��]�^�?<z����g���/��=��fc4�2���d�y��~�x�8�����e�����e���P<�B���i�+������J��i+^��g�����~�x����/��;Qf|C�/^yP��(��u����rx��=�P����Pn�sO�����#�.��F���:���t���f[a���z�����<������Xm]����Wwu3���,�����=���;��.\��-h����X��?w���ZA�uE�V����z�n�����JBq6V*k
)�m+	)ef�X>���I5V,���Z��H�|�+��Y��`��!�!�V��
!���bRH{�����Y���8!+�B+��L!{2��H����7�Ar����!�d}<h$���zp��*��TiEX/t|d$
��[h���Ls��B
���|���o!?�Z)M��BFR�_'��D�
�Jr����~���D���J����������)�,p�����@IJ�:@��A�$��K%���>-�H��]�RN	�T3M%�>n}P��"�%^J��p�+h�%�H	!g���F��
6r�a��>�E#�BI������v�)WH
&���2�%��K��PX�
*�)$�Q�/����@M���T�%@P@h.�d������%��2��"-���X(�����,)����RW�p�
&��	!�$�V��`Xj�`j
�*�C��Bq��������A�$����P�!�%@��SHM-� 1�F
QE���A�$��h��%�h�x#�,`��c��Z�
f���.�C�K�$��pI���=�e%��@P8	�D�MQ���dZBpa� -�v�P��J����Ph[�u��ZH�WzP���P Y���6�P8/X
��%FI����0S�[�40J�����`A�K��&��Z(��"1�6��#o���8(L�\�
��Q��l�������P+������Th�%A#M8������$�Ph�,N�����T@#/��g��K&�k��(d
�GL8�k�
	��jM��R[�dqPb(���nq���Z�.���%�=���J�
&�^Ab9(�
�c
�4p����z;f�`bJ���@�f,Pug�����p�C�� �����p�`9��X�I
&�6�7o�����0����0��p��A��RA'���F�U��`^B�f$}����j�!�-�2	�sm,.8fV�!
f"�	��vl���3�pe��W $��C;�R��S��p1 �v��U�|���K&��\���I��`4uol5���2=$��P"Qw�C`O����p���+�4��0�M����
6e�6��[��q��d��h}��KH��;���z]�]0!��J������p]��^<�H��%w;�t_�`z���A(�������FH0����@��u��=	�>�E=��h��	���}����`^2"��������
��E�P�}?C�;l}=���y��F���Z$�<����	!����p+���h��B���t��P�R�4N�>���P	E�����E�%��P���`��jH�P� w $�������!�-NG�,��v��d\j�X�!��g�QW��&	���p���+�NS����#wG*��j\#���]0!�o�]��b��[��p:��P�3��9�;d�F��1,A;J(���2\,"$�����qgfLY���H@����k(�
���C���v�N����	/�^����
����j������!������+��lr�PK�����
ePKH��GObject 3/styles.xml���r� ���)2��Cog&��>@��c�)F���}�.�&)�K[�/	I��i���cJs��$[o��
.�C���9}JN�?{(KN.��5�&��C0��b��h<$����KR3�
��09�pHcj�����=�
L���-y����P](���kk�K�Z�%����-�Ap�~H��4����}�U�l��!o��3��Jx���	��i��34������>1�������jW�8=�_/[��-��E�T�&:�H�z�������o7��h���.�+n�
pz�D��
P_�e�)�\�'Z�C����k@�9�2����l��=�Z�[g��J�U���#;�v�����aq����<����l�<�����#��|�*U����V�#�|)��3�ex�!�1�py�������:7������-uK��������&����t���/��PK�����yPKH��GObject 3/meta.xml��=o�0���
�f����`�:t�����E���`#cB~~�)����}��}�s�=7�wB�I�r��x��RU9y}y�7d[�e�p����oPY�A[z�V������(��NvL�
v�r�[Ts[��M;�Z����m�0t��6�i������W��M�(�k:i3;�Wjd�JZ�k��O�..
���LWF���.l����I�p?w�ci��!a"���-F�b��(^dN�B����;�n�����>�h���?��6��:���5���$V����e���~����P|PKTnw"JPKH��GObjectReplacements/Object 1��lW������c�l��&vb7�i�������suh�v�S/H(��&�mc�

� ��E�*P%H��j��MA��(RD�BE�"�	�FM�������"���f������v7�g�I�������������[��������������E��_p��hi���
\+��z������k�����_��&����R��Z�+���C8d�wx����j
�yF|�q�V���i����������+�-�]�a�}]zM����]9r���'q���u'n�O����g[��mkz>�n��F��w���S[0Z��M!�g>���\[�C��3?�is��x�����?�Fa�?�G�����U3B���6���C���+|��U�C����[�|pb�N��>"�E�k�F'^��W!�E�k�F'^��Y�l����x	�B�l����x	�1$�E�k�F'^�����v�7;��=���l���������[,�E�k�f'>����(�E�k�f'>���Ee��v
�����<]yR�����]�������8]�7;�
��y��6����x��������w�����x��������w������x����������8]�7;q~�a���Kj�q��'��a�.��|��[��[�`Xwa['�n�f���a[&��4��ua3�9�?Z�O�/�����R�`}��,��D�c��v����r������j=84mB���fF��1���6�\������K�s����[�?��[��������`�������2����)PS��
g�������C���/1������e��������$��2��T�'J%�������6��)����bN��k6��c�r�pfz�R�OTH���<,�����9��d�!�A���T��#�@M!f6`��	�lC��_��VI��*���R��]!��d�=�K���i��7�I�w����#�@M!f6`���{Ib��H�1�����d�c��[�����?`�"�_��_b�^����b��v��)����b6���!fu���`��F$��������/e��93]�����opf�6������v��)����b���#�������fj��M�?���f��������f�W��������S��30���h��z���/pf���|���b����_.e�:�����?��i��oc�5v��)���3b�J� ��-��-�m}��6%�o����������|X%�7��}d`lpx��`hT�4�W6���P����|Q}������Kz��Q��+��@�p<���J�B+�[�����(�ftx�!���|�����tBL��7B�L�)Om�W��JSRm��na�����L�r@��X?S)u-���i��e���A�^��D��m��o�@iJ�MsC��z]����o���m��.���LK�N_����|�.����_�K������-���tT��_$�j�����_���)�5L��`��{��4�{%�	�~�V&���CG���9�4���/OK�����/�+��+��~�/}�JO����Z�]D3���x�/R��{�k�#�A����cV���CZ����w��E���p�w|�uU5@���_�y�Q���a����`���a���{����.��l��mik�]z�=?�{��r�{Q;���X>���X^*���>����h���2����2�X6����a����gG%�kX�������:�zo�Hm*V��jS<�6�S�Pm���M���R��Lm*W��JSRm�W�M�jS������M���M���Vm�NmZ�6-T�<�E�;�E���>��[��M�]����(O�`V�"���Z��<6�a��t�}�R�3��O���xxo���,�q���KhW���,�������rcN'@���cU�~!�F�on�����cHb�N\u�6��j����l�[���Y:qi�`��;�e{k�	o=�/f�����i��e{�n�	o=B5f���1�i�'n��[f�z�u���Ko'd���M2Q�1��[z�3:q�=����r�-x��_��gt��c%<j�"[��or�	���Y�+�>f���=��l�[���'<���=��.����]��U���������.�=����m^�l�)`+��MF�^��^��z�fp�\��O���7�1�A�EL�R?�i������v�\h�ig�qN�����X��c�M$�|1g|������47�N�(-�m�!��U���������N{����ag�v�a��M'�cM����P��������GK����{�U����;����u�i�(l���c0{���^ly,�����B�����b!��r���r�=�����e?�}���p^}Zq-��f��!�������Y~$q
�����w@Mb��xO�t��^xF`@t�a10�;>
I��KG�0������C�`[$�`�I	��T<��/��F�	iP���b����	wc��	����D�|���X>D_�?n�G��X���B���i���*L��FN$3T1[GN����z5���\.~���f���M���PK��	
�qPKH��GObjectReplacements/Object 2��}lW��l��}���;v>l�$1	qb��1Mj���N}p��Rp�FMlSA���h���5��BP�U���P[�*�h%B��
U� �c����z����������w����3���w�v����o����.������B�
-��8�
���hX[
� n^�����p)b��K���v}�V�2.��R�0P"����
���>��Xy�w����4K�JC��Q��Sx>k�y��!���x=�x������0�o�.i���v�.��8��a�`r�P������C���7&>�e��F�F�{��a���pP�m���KZ�m�!���W`��).7��R���2h�fG{�db(���vZ(;>j��q(s���-���l������4�%��zNZ���F#^��W+�"���������_$]�7���*�I���F��p����k�F#^�_�~�t
�h�K���/����x�������f#>����I�H�o6��{~p����k�f#>���_&�"�������]�/����������'��]lqmxk4��{^q�
o6��7*���f#>�G�]�zk6��{��K�f#>�G�]�no6��{���f#>�G�]�cc6��{���Uf#>�G�]�Wg6��{^���*������-[%����/
�?���{�����f�[�:P���+P�B7W�\���CY�
�ey;�m(���#(����+����	����>��G1=��kn���Jr�Z6�N���
�%s��d��O�Hf��3������������3?�o6��d�M��N2j�d���d�m����tH�72�b�_��k���������?��WB��7$��%��������[���)P3$30�&3��Wl$�m�ob�e��*"�OWI��*������K�;���m.�.�!����o2��d
������l�/�H����������UK�G$�����b�E�����b���3]e�WC�2d#�5C2��l2|'e#�/VK������q1���|#,���$�b�of��\��q�t����3����'�6�)P3$30�&��r�F2W�H�S��Z���b��b��;�3������W�N-�w��).�\���t�5C2��l2��$s��������9���0-����/3|���0�r��:��*���d
������<��\Z+��2+��q1_f���d��2=�����{�#\�u����1;����g�I�C����]����[v$�6�&��������	�m#{��O��j>tXn4���
��������B����ImtI����)������;�@l�:��~�5��������#^.%�a�yM���q#�IP�J��R��L�J�U��U�P�M�X�u��kd^�q�{Jf��:���!�h��2�vB~�����ZU�.�S�*�1?�����K���d��?�����:���f��^?���z2���2��q�K$RO�l�VK��J�����$f��}
�����P�f~u��I����L�+u��Q��z�_�����i���G�E�z������*�d8��3s��uu�_��o�����:
}D�WG���f�V�����3�:~�\u�e-��L�^�H?
�p�?�0���U���]�y�����DyPl9�`h_���FC�g��x���^�*�a��m=����==�=l���C%�~
<�m���a��m�����#8��_�2��1w���}�Y���V�Q�RjU�B��TP�����Z5W�
�UUjUD�J�U�j��F��U�R��ujU���jU�A�jT���UMjU�R��^��s��	�W06����3������#��xy�����m�`;�.����q_I4W��4��xb?�-������+e?�|���n���W��}b��/�S��x����4mnY�pE����0T#��s���F\�%�5��z���y6��g/F-��4�7k��?'[l�[���Zqi�z���v�O�R���3���F\z#k��r���J����FD-���4QN^�M�E$s��~�G���F\z..���������jz�g4���9ux��E������;<�g�o>��S�G�P_d��b��3��s�ixvO�[d�bbZ�K��F��y�p�v6��5������ik��������\H��["�:�{�8bz|��(t[�T��c�EL_[���G�����d�#uL;A~�<�F6���^a����)�t�_3*���w��nX#:]�����3a�o:-�kDM[��u~����*���k�r��-:�2���k%���y�@����9��S(�O���'k�a���S0#p7�	8��w��������_`��4��l��n/�s��F�'������F���������{��knwU3�AH9}s!��
��:���2���z�&��	�r�K{�s0���G���,|�o0�k��4���&p��yt�-G0O��f�xM��O4�H3&��wKk;��ElcX0�1�G����>��+���~S���g��F~���a/����3&L���E�r�11S�E���U�\j�s}�C|
7�S�����PK3)�1<
I{PKH��GObjectReplacements/Object 3��{l�����t�e��T�Q��EB,�[Q
�.�����D��K�b[�@Q���a�_�QQ�R0�h4����G|��Q��g�+�_��=s�t���K�;cg����3;���������������-O.�Q��������D��S���@��[����QDt�CP*�[���nB����t�j�U�(����k����;��D*�����6l��L���U~�^��Q�y>f�y��!���|���J5�:y\����[���z��������h;>�@+�$��'�k='��=q�����KWkl�K{�����p�d���!k�D;�0$����&2���o��A.�fF_O��>,'J�r��%���@*��!M�XqvZ���
��U��T{��64����e�7N,�7��(�b������o�~�t�l�M�s��/������	������c�f#n�t����c�f#n�_~�t�l�M�5~�K���F���<��������/+�_,����]�v����c�V#��_�!�b��������_,����]�#O�K�lqlxk6���^q:
o5��O��
�V#�K������]�������x����F<x��;�ha5�������%��/WY�x�.�w|��j��w��+�Qx�{�S�n��g����|J{��aZ"����#��`��d�$��!g�������-��j���������}:�Q����>��t&�g�o�}
�R��O7��=�����U�����m��F�oDa�`�����C0�#���OI������?"�_�����w����+(�S�_�����Q����f�H�����;r������'�gE�u��V��;,�_��������d�U&s��_,���L
5C0G��`VM�����#*�_��Q���7J����<,������_��B��
�3]({�3r�f5��	{�Z�K0��
�'�HT��_&�~�������r���L�7$��g�H&sX&�����-���q9SC�����7��'(�`�W�'$���G&�72��e2����2�_��'�d����
���g�6 �o����P3s$`�	&W�C4�V&+���,]�l_��-a�_�`id1��Q/��tuOg_W�����
��R�������N��C�bM�[6�����.�a���x��JT�'I�a�>
i��P=�Bc�3�ye~�r'�x��5�zE���_�%Z�fh���V�U�jU�R��V-S{�fV�Q14by�E�;�"���n�RmG���VX�/amc>�7>F��P�
#��*#�MY���}~�~�t#��Y���}~���z#���
�</��z6���"�c�����Xm��YEF��p���a9&S ^���j�g��Fl����GS\����3'y#�
����@C�d��h���{#�=n�vz�����B����y@���adG����������hFv���qTe���e�o���3"����}uR/��i-uSm��l�Ki>w�zl_������}��z����"1�x��9ka��xp�4�YH��(�2�������.F��7�_���~Ay
�v����.�����{�$"��B�����{��,�0�1���U���*��C�*>N�
�O�V��j�x�*�V���r�*�v^��G��	jU���Z?A���>�Z��V�C���VU�US�*���[����C�E�}U�����r�z-J���A_v
�jq�wQv���eO���/�����;8����W��e.��pu>�3�F�����m�63����6m����������?���5D���6�TKk���0��������9���=2���C7g
?q����2G��7���q�������
�js�O�z,����~����Ss�O��E,�{�W���9������?FKkdt��Z�]�s5l����B�>�9��z���H��#�hmlv�������y�e��h���&�h�Z�{j����0"so����KB�����(���m:��"2\�'�������S�<=�������G[ao�L#x�t:.���T��H�	_��AB-��	�b]W�����������A�.y���V�:������j�>�D��q��3^���������&�O�:C@u.�^c.���0?�W��U!�t�r���#��s9]E=��%P���T�t������������g���)������Ci��Qv��o2]SrY�c�s��/&kyI�T��&��P������c!�5a��(��D�������]���Q:�k��W����W�2,muk��%K[�*5�Ze__�/'���o��Cu�PKuC�)	�oPKH��GMETA-INF/manifest.xml�V=o�0��+]
�����	Rt(
�\0�If��<&��/��������A6�x|���N��j�d��	�rQ��47��}C~�������l��8�w�,��n�6�[]���5S�j��@��{���-�8;P��Y�����<���}v�������c ���V�74�
��aH��-���C��,�����9R���A��#����Y�
����F�;�������B����Fw��v�J�8	aj,����=x���r^G	�?D�G���p�.h��	U�����G���:_1;���V^�k&���������@��K�V���Ll}�����x� ��b���R�]%v�J�v��n?�~�A2���g��u�M�	y��x1���QU��gg�b�J��������/_C�mHz
�J����;�[�����Y��PK>C���PKH��G�l9�..mimetypePKH��G��aY�2Tcontent.xmlPKH��G��\z��Ymeta.xmlPKH��G�j�z	�9
E[styles.xmlPKH��G��h���dmanifest.rdfPKH��G6fConfigurations2/progressbar/PKH��GpfConfigurations2/toolpanel/PKH��G'�fConfigurations2/accelerator/current.xmlPKH��G�fConfigurations2/floater/PKH��G5gConfigurations2/images/Bitmaps/PKH��GrgConfigurations2/toolbar/PKH��G�gConfigurations2/menubar/PKH��G�gConfigurations2/statusbar/PKH��GhConfigurations2/popupmenu/PKH��G�����NhObject 1/content.xmlPKH��G�����y�yObject 1/styles.xmlPKH��GTnw"J�{Object 1/meta.xmlPKH��Gg^YmYm�|Thumbnails/thumbnail.pngPKH��G$���$�|�Object 2/content.xmlPKH��G�����y��Object 2/styles.xmlPKH��GTnw"J��Object 2/meta.xmlPKH��G����L�).�settings.xmlPKH��G�����
e�Object 3/content.xmlPKH��G�����y�Object 3/styles.xmlPKH��GTnw"J�Object 3/meta.xmlPKH��G��	
�qYObjectReplacements/Object 1PKH��G3)�1<
I{�ObjectReplacements/Object 2PKH��GuC�)	�o0*ObjectReplacements/Object 3PKH��G>C����3META-INF/manifest.xmlPK��5
#2Shulgin, Oleksandr
oleksandr.shulgin@zalando.de
In reply to: Tomas Vondra (#1)
Re: WIP: bloom filter in Hash Joins with batches

On Tue, Dec 15, 2015 at 11:30 PM, Tomas Vondra <tomas.vondra@2ndquadrant.com

wrote:

Attached is a spreadsheet with results for various work_mem values, and
also with a smaller data set (just 30M rows in the fact table), which
easily fits into memory. Yet it shows similar gains, shaving off ~40% in
the best case, suggesting that this is not just thanks to reduction of I/O
when forcing the temp files to disk.

A neat idea! Have you possibly tried to also collect statistics about
actual false-positive rates and filter allocation sizes in every of the
collected data points?

--
Alex

#3Simon Riggs
simon@2ndQuadrant.com
In reply to: Tomas Vondra (#1)
Re: WIP: bloom filter in Hash Joins with batches

On 15 December 2015 at 22:30, Tomas Vondra <tomas.vondra@2ndquadrant.com>
wrote:

3) Currently the bloom filter is used whenever we do batching, but it

should really be driven by selectivity too - it'd be good to (a)
estimate the fraction of 'fact' tuples having a match in the hash
table, and not to do bloom if it's over ~60% or so. Also, maybe
the could should count the matches at runtime, and disable the
bloom filter if we reach some threshold.

Cool results.

It seems a good idea to build the bloom filter always, then discard it if
it would be ineffective.

My understanding is that the bloom filter would be ineffective in any of
these cases
* Hash table is too small
* Bloom filter too large
* Bloom selectivity > 50% - perhaps that can be applied dynamically, so
stop using it if it becomes ineffective

--
Simon Riggs http://www.2ndQuadrant.com/
<http://www.2ndquadrant.com/&gt;
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#4Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Shulgin, Oleksandr (#2)
Re: WIP: bloom filter in Hash Joins with batches

Hi,

On 12/17/2015 10:50 AM, Shulgin, Oleksandr wrote:

On Tue, Dec 15, 2015 at 11:30 PM, Tomas Vondra
<tomas.vondra@2ndquadrant.com <mailto:tomas.vondra@2ndquadrant.com>> wrote:

Attached is a spreadsheet with results for various work_mem
values, and also with a smaller data set (just 30M rows in the fact
table), which easily fits into memory. Yet it shows similar gains,
shaving off ~40% in the best case, suggesting that this is not just
thanks to reduction of I/O when forcing the temp files to disk.

A neat idea! Have you possibly tried to also collect statistics
about actual false-positive rates and filter allocation sizes in
every of the collected data points?

The patch counts and prints the total number of lookups, and the number
of eliminated rows. The bloom filter is currently sized for 5% false
positives rate, and the numbers I've seen match that.

I think ultimately we'll need to measure the false positive rate, so
that we can use it to dynamically disable the bloom filter if it gets
inefficient. Also maybe put some of that into EXPLAIN ANALYZE.

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#5Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Simon Riggs (#3)
Re: WIP: bloom filter in Hash Joins with batches

On 12/17/2015 11:44 AM, Simon Riggs wrote:

My understanding is that the bloom filter would be ineffective in any of
these cases
* Hash table is too small

Yes, although it depends what you mean by "too small".

Essentially if we can do with a single batch, then it's cheaper to do a
single lookup in the hash table instead of multiple lookups in the bloom
filter. The bloom filter might still win if it fits into L3 cache, but
that seems rather unlikely.

* Bloom filter too large

Too large with respect to what?

One obvious problem is that the bloom filter is built for all batches at
once, i.e. for all tuples, so it may be so big won't fit into work_mem
(or takes a significant part of it). Currently it's not accounted for,
but that'll need to change.

* Bloom selectivity > 50% - perhaps that can be applied dynamically,
so stop using it if it becomes ineffective

Yes. I think doing some preliminary selectivity estimation should not be
difficult - that's pretty much what calc_joinrel_size_estimate() already
does.

Doing that at dynamically is also possible, but quite tricky. Imagine
for example the outer relation is sorted - in that case we may get long
sequences of the same value (hash), and all of them will either have a
match in the inner relation, or not have a match. That may easily skew
the counters used for disabling the bloom filter dynamically.

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#6Oleg Bartunov
obartunov@gmail.com
In reply to: Tomas Vondra (#1)
Re: WIP: bloom filter in Hash Joins with batches

Tomas,

have you seen
/messages/by-id/4B4DD67F.9010506@sigaev.ru
I have very limited internet connection (no graphics) , so I may miss
something

Oleg

On Wed, Dec 16, 2015 at 4:15 AM, Tomas Vondra <tomas.vondra@2ndquadrant.com>
wrote:

Show quoted text

Hi,

while working on the Hash Join improvements, I've been repeatedly running
into the idea of bloom filter - various papers on hash joins mention bloom
filters as a way to optimize access to the hash table by doing fewer
lookups, etc.

Sadly, I've been unable to actually see any real benefit of using a bloom
filter, which I believe is mostly due to NTUP_PER_BUCKET=1, which makes the
lookups much more efficient (so the room for bloom filter improvements is
narrow).

The one case where bloom filter might still help, and that's when the
bloom filter fits into L3 cache (a few MBs) while the hash table (or more
accurately the buckets) do not. Then there's a chance that the bloom filter
(which needs to do multiple lookups) might help.

But I think there's another case where bloom filter might be way more
useful in Hash Join - when we do batching. What we do currently is that we
simply

1) build the batches for the hash table (inner relation)

2) read the outer relation (usually the larger one), and split it
into batches just like the hash table

3) while doing (2) we join the first batch, and write the remaining
batches to disk (temporary files)

4) we read the batches one by one (for both tables) and do the join

Now, imagine that only some of the rows in the outer table actually match
a row in the hash table. Currently, we do write those rows into the
temporary file, but with a bloom filter on the whole hash table (all the
batches at once) we can skip that for some types of joins.

For inner join we can immediately discard the outer row, for left join we
can immediately output the row. In both cases we can completely eliminate
the overhead with writing the tuple to the temporary file and then reading
it again.

The attached patch is a PoC of this approach - I'm pretty sure it's not
perfectly correct (e.g. I only tried it with inner join), but it's good
enough for demonstrating the benefits. It's rather incomplete (see the end
of this e-mail), and I'm mostly soliciting some early feedback at this
point.

The numbers presented here are for a test case like this:

CREATE TABLE dim (id INT, dval TEXT);
CREATE TABLE fact (id INT, fval TEXT);

INSERT INTO dim SELECT i, md5(i::text)
FROM generate_series(1,10000000) s(i);

-- repeat 10x
INSERT INTO fact SELECT * FROM dim;

and a query like this

SELECT COUNT(fval) FROM fact JOIN dim USING (id) WHERE dval < 'a';

with different values in the WHERE condition to select a fraction of the
inner 'dim' table - this directly affects what portion of the 'fact' table
has a matching row, and also the size of the hash table (and number of
batches).

Now, some numbers from a machine with 8GB of RAM (the 'fact' table has
~6.5GB of data, so there's actually quite a bit of memory pressure, forcing
the temp files to disk etc.).

With work_mem=16MB, it looks like this:

batches filter select. bloom master bloom/master
-----------------------------------------------------------
4 1 6.25% 23871 48631 49.09%
8 2 12.50% 25752 56692 45.42%
8 3 18.75% 31273 57455 54.43%
16 4 25.01% 37430 62325 60.06%
16 5 31.25% 39005 61143 63.79%
16 6 37.50% 46157 63533 72.65%
16 7 43.75% 53500 65483 81.70%
32 8 49.99% 53952 65730 82.08%
32 9 56.23% 55187 67521 81.73%
32 a 62.49% 64454 69448 92.81%
32 b 68.73% 66937 71692 93.37%
32 c 74.97% 73323 72060 101.75%
32 d 81.23% 76703 73513 104.34%
32 e 87.48% 81970 74890 109.45%
32 f 93.74% 86102 76257 112.91%

The 'batches' means how many batches were used for the join, 'filter' is
the value used in the WHERE condition, selectivity is the fraction of the
'dim' table that matches the condition (and also the 'fact'). Bloom and
master are timings of the query in miliseconds, and bloom/master is
comparison of the runtimes - so for example 49% means the hash join with
bloom filter was running ~2x as fast.

Admittedly, work_mem=16MB is quite low, but that's just a way to force
batching. What really matters is the number of batches and selectivity (how
many tuples we can eliminate using the bloom filter).

For work_mem=64MB it looks like this:

batches filter select. bloom master bloom/master
-----------------------------------------------------------
1 1 6.25% 24846 23854 104.16%
2 2 12.50% 24369 45672 53.36%
2 3 18.75% 30432 47454 64.13%
4 4 25.01% 36175 59741 60.55%
4 5 31.25% 43103 62631 68.82%
4 6 37.50% 48179 64079 75.19%

So initially it's a bit slower (it's not doing any batching in this case,
but the code is a bit silly and while not building the bloom filter it
still does some checks). But once we start batching, it gets 2x as fast
again, and then slowly degrades as the selectivity increases.

Attached is a spreadsheet with results for various work_mem values, and
also with a smaller data set (just 30M rows in the fact table), which
easily fits into memory. Yet it shows similar gains, shaving off ~40% in
the best case, suggesting that this is not just thanks to reduction of I/O
when forcing the temp files to disk.

As I mentioned, the patch is incomplete in several ways:

1) It does not count the bloom filter (which may be quite big) into
work_mem properly.

2) It probably does not work for outer joins at this point.

3) Currently the bloom filter is used whenever we do batching, but it
should really be driven by selectivity too - it'd be good to (a)
estimate the fraction of 'fact' tuples having a match in the hash
table, and not to do bloom if it's over ~60% or so. Also, maybe
the could should count the matches at runtime, and disable the
bloom filter if we reach some threshold.

But overall, this seems like a nice optimization opportunity for hash
joins on large data sets, where batching is necessary.

Ideas?

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#7Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Oleg Bartunov (#6)
Re: WIP: bloom filter in Hash Joins with batches

Hi,

On 12/20/2015 05:46 AM, Oleg Bartunov wrote:

Tomas,

have you seen
/messages/by-id/4B4DD67F.9010506@sigaev.ru
I have very limited internet connection (no graphics) , so I may miss
something

I haven't seen that, but I don't really see how that's related - your
post is about indexes, mine is about building temporary bloom filters
when executing hash joins.

FWIW, I think bloom filters should be easy to add to BRIN indexes, as
another type of 'summary'. That should address most of the missing
pieces in your implementation (e.g. WAL).

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#8Aleksander Alekseev
a.alekseev@postgrespro.ru
In reply to: Tomas Vondra (#1)
Re: WIP: bloom filter in Hash Joins with batches

Hello, Tomas.

Great idea!

Did you consider to cache bloom filter or at least part(s) of it
somehow? I think this way we could gain some more TPS. This of course
assuming that creating a bloom filter is really a bottleneck here,
which would be nice be investigated first.

Best regards,
Aleksander

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#9Simon Riggs
simon@2ndQuadrant.com
In reply to: Tomas Vondra (#5)
Re: WIP: bloom filter in Hash Joins with batches

On 17 December 2015 at 16:00, Tomas Vondra <tomas.vondra@2ndquadrant.com>
wrote:

On 12/17/2015 11:44 AM, Simon Riggs wrote:

My understanding is that the bloom filter would be ineffective in any of
these cases
* Hash table is too small

Yes, although it depends what you mean by "too small".

Essentially if we can do with a single batch, then it's cheaper to do a
single lookup in the hash table instead of multiple lookups in the bloom
filter. The bloom filter might still win if it fits into L3 cache, but that
seems rather unlikely.

* Bloom filter too large

Too large with respect to what?

One obvious problem is that the bloom filter is built for all batches at
once, i.e. for all tuples, so it may be so big won't fit into work_mem (or
takes a significant part of it). Currently it's not accounted for, but
that'll need to change.

The benefit seems to be related to cacheing, or at least that memory speed
is critical. If the hash table is too small, or the bloom filter too large
then there would be no benefit from performing the action (Lookup Bloom
then maybe Lookup Hash) compared with just doing (LookupHash).

So the objective must be to get a Bloom Filter that is small enough that it
lives in a higher/faster level of cache than the main Hash table. Or
possibly that we separate that into a two stage process so that the first
level can be applied by a GPU and then later checked against hash outside
of a GPU.

I think you also need to consider whether we use a hash bloom filter or
just simply apply an additional range predicate. The latter idea is similar
to my earlier thoughts here
/messages/by-id/CA+U5nMLYf2cgbq+YUw-ArLBTcPrqanBf5QiFEC-PBRJCFzOngg@mail.gmail.com

--
Simon Riggs http://www.2ndQuadrant.com/
<http://www.2ndquadrant.com/&gt;
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

#10Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Simon Riggs (#9)
Re: WIP: bloom filter in Hash Joins with batches

On 12/24/2015 02:51 PM, Simon Riggs wrote:

On 17 December 2015 at 16:00, Tomas Vondra <tomas.vondra@2ndquadrant.com
<mailto:tomas.vondra@2ndquadrant.com>> wrote:

On 12/17/2015 11:44 AM, Simon Riggs wrote:

My understanding is that the bloom filter would be ineffective
in any of
these cases
* Hash table is too small

Yes, although it depends what you mean by "too small".

Essentially if we can do with a single batch, then it's cheaper to
do a single lookup in the hash table instead of multiple lookups in
the bloom filter. The bloom filter might still win if it fits into
L3 cache, but that seems rather unlikely.

* Bloom filter too large

Too large with respect to what?

One obvious problem is that the bloom filter is built for all
batches at once, i.e. for all tuples, so it may be so big won't fit
into work_mem (or takes a significant part of it). Currently it's
not accounted for, but that'll need to change.

The benefit seems to be related to cacheing, or at least that memory
speed is critical. If the hash table is too small, or the bloom
filter too large then there would be no benefit from performing the
action (Lookup Bloom then maybe Lookup Hash) compared with just
doing(LookupHash).

So the objective must be to get a Bloom Filter that is small enough
that it lives in a higher/faster level of cache than the main Hash
table. Or possibly that we separate that into a two stage process so
that the first level can be applied by a GPU and then later checked
against hash outside of a GPU.

I don't think that's quite true.

Had the primary goal been to replace expensive hashtable lookups with
cheap bloom filter checks, then sure - the size of the bloom filter
would be crucial (namely getting the whole bloom filter into L3, which
is an order of magnitude faster compared to RAM).

But that's not what the patch does - it aims to reduce the amount of
data that need to be serialized/deserialized when batching is necessary,
trading those costs for the bloom overhead. The size of the bloom filter
may still matter, but it's way less important because the
(de)serialization overhead is much more expensive than the hash lookup.

FWIW I've been trying to use the bloom filters in the "traditional" way
(doing "cheap" bloom checks before hashtable lookups), but I've been
unable to get any measurable benefit. Either I was doing it wrong
somehow, or perhaps NTUP_PER_BUCKET=1 made the hashtable too fast (it
essentially means we need a single lookup to see if the entry exists,
while bloom filter needs several lookups, depending on the desired false
positive ratio).

So I concluded that the attempt to use the bloom filter that way is
futile, and that the batching case seems like the only scenario where
the bloom filters may still be useful.

There's a number of additional problems with sizing the bloom filter to
fit into L3:

(1) We have no idea how much L3 there is, although this might be fixed
by either adding a GUC, read it from /proc/cpuinfo or just use some
reasonable default (say, most Xeon CPUs today have ~20 MB)

(2) The L3 is not per-process, but shared by all processes, so we don't
really have all the L3, but perhaps just L3/N where N is the number
of backends.

(3) The size of the bloom filter depends on the number of items it
should handle and false positive rate. I've used 5% in the patch,
but maybe it'd make sense to increase this in order to get smaller
filter?

Also, the bloom filter does not compete with the whole hash table, but
"just" with the "buckets" as that's sufficient to determine if there's a
tuple for a key or not.

Let's do some math for a hash table with 100k rows (so a fairly small
hash table):

* nbuckets = 131072 (2^17), so 1MB
* bloom filter (5% false positive rate [1]http://hur.st/bloomfilter?n=100000&amp;p=0.05): 76kB, k=4 (see [1]http://hur.st/bloomfilter?n=100000&amp;p=0.05)

So both the buckets and bloom fit into L3, and the bloom filter is
unlikely to speed things up.

The difference between buckets and bloom filter is about 10x, and both
sizes scale about linearly (with 1M items it'll be ~10MB vs. 760kB), so
there clearly is an area where bloom filter fits into L3 while buckets
don't.

Sadly I haven't been able to exploit that, but I'll try again.

In any case, none of this can help unless the bloom filter really
eliminates many lookups.

[1]: http://hur.st/bloomfilter?n=100000&amp;p=0.05

I think you also need to consider whether we use a hash bloom filter or
just simply apply an additional range predicate. The latter idea is
similar to my earlier thoughts here
/messages/by-id/CA+U5nMLYf2cgbq+YUw-ArLBTcPrqanBf5QiFEC-PBRJCFzOngg@mail.gmail.com

Interesting, but I don't really see how this is related to bloom filters?

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#11David Rowley
david.rowley@2ndquadrant.com
In reply to: Tomas Vondra (#4)
Re: WIP: bloom filter in Hash Joins with batches

On 18 December 2015 at 04:34, Tomas Vondra <tomas.vondra@2ndquadrant.com>
wrote:

I think ultimately we'll need to measure the false positive rate, so that
we can use it to dynamically disable the bloom filter if it gets
inefficient. Also maybe put some of that into EXPLAIN ANALYZE.

I'm not so convinced that will be a good idea. What if the filter does not
help much to start with, we disable it because of that, then we get some
different probe values later in the scan which the bloom filter would have
helped to eliminate earlier.

Maybe it would be better to, once the filter is built, simply count the
number of 1 bits and only use the filter if there's less than <threshold> 1
bits compared to the size of the filter in bits. There's functionality in
bms_num_members() to do this, and there's also __builtin_popcount() in
newer version of GCC, which we could have some wrapper around, perhaps.

--
David Rowley http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

#12Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: David Rowley (#11)
Re: WIP: bloom filter in Hash Joins with batches

On 12/28/2015 03:15 AM, David Rowley wrote:

On 18 December 2015 at 04:34, Tomas Vondra <tomas.vondra@2ndquadrant.com
<mailto:tomas.vondra@2ndquadrant.com>> wrote:

I think ultimately we'll need to measure the false positive rate, so
that we can use it to dynamically disable the bloom filter if it
gets inefficient. Also maybe put some of that into EXPLAIN ANALYZE.

I'm not so convinced that will be a good idea. What if the filter does
not help much to start with, we disable it because of that, then we get
some different probe values later in the scan which the bloom filter
would have helped to eliminate earlier.

Yes, that's true. This might happen quite easily for example when then
outer table is sorted - in that case what we'll see are (possibly long)
sequences of the same value, which might bias the decision quite easily.

I don't know how to fix this perfectly (if at all possible). But maybe
we don't really need to do that. The overall goal is to improve the
overall performance, and this check (disabling the bloom filter) is
meant to limit the loss when the filter returns "true" for most values
(making it somewhat pointless).

The costs however are asymmetric - once we build the hash table (and
build the filter), the cost for dropping the bloom filter is constant,
as we simply loose the time we spent building it. But the cost for
continuing to use of inefficient filter is O(N) where N is the number of
lookups (i.e. rows of outer table). So it's probably better to drop the
filter a bit too early and sacrifice the small amount of time we spent
building it, so that we have a change of not being much slower than the
current implementation.

That is not to say we can't come up with better solutions - for example
we can count (or estimate) the number of distinct hash values we've
seen, and only do the decision once we see enough of them. For example
we could use HyperLogLog to do that, or simply see the number of times a
value changed (hash value not equal to the previous value). That should
be better than simply waiting to X lookups, but I'm sure it's still
possible to come up with counter-examples.

Maybe it would be better to, once the filter is built, simply count the
number of 1 bits and only use the filter if there's less than
<threshold> 1 bits compared to the size of the filter in bits. There's
functionality in bms_num_members() to do this, and there's
also __builtin_popcount() in newer version of GCC, which we could have
some wrapper around, perhaps.

I don't really see how this is relevant with the previous point. The
number of 1s in the bitmap can tell you the false positive rate for the
bloom filter, not what fraction of lookups will be answered with "true".

So while this needs to be watched, so that we stop using the bloom
filter when it gets too full (e.g. due to under-estimate), it's
completely unrelated to the previous issue.

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#13David Rowley
david.rowley@2ndquadrant.com
In reply to: Tomas Vondra (#12)
Re: WIP: bloom filter in Hash Joins with batches

On 28 December 2015 at 23:23, Tomas Vondra <tomas.vondra@2ndquadrant.com>
wrote:

On 12/28/2015 03:15 AM, David Rowley wrote:

Maybe it would be better to, once the filter is built, simply count the

number of 1 bits and only use the filter if there's less than

<threshold> 1 bits compared to the size of the filter in bits. There's
functionality in bms_num_members() to do this, and there's
also __builtin_popcount() in newer version of GCC, which we could have
some wrapper around, perhaps.

I don't really see how this is relevant with the previous point. The
number of 1s in the bitmap can tell you the false positive rate for the
bloom filter, not what fraction of lookups will be answered with "true".

So while this needs to be watched, so that we stop using the bloom filter
when it gets too full (e.g. due to under-estimate), it's completely
unrelated to the previous issue.

Why is it not related? this has got me confused. If a bloom filter has all
of the bits set to 1, then it will never filter any Tuples right?

If so, then a filter with all 1 bits set should be thrown away, as it'll
never help us, and the filter should generally become more worthwhile as it
contains a higher ratio of 0 bits vs 1 bits. Of course we don't have a
count of how many Tuples matched each bit, so this is based on the
assumption that each bit matches an equal number of Tuples. Are you saying
this is not an assumption that we should make?

--
David Rowley http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

#14Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: David Rowley (#13)
Re: WIP: bloom filter in Hash Joins with batches

On 12/28/2015 11:38 AM, David Rowley wrote:

On 28 December 2015 at 23:23, Tomas Vondra <tomas.vondra@2ndquadrant.com
<mailto:tomas.vondra@2ndquadrant.com>> wrote:

On 12/28/2015 03:15 AM, David Rowley wrote:

Maybe it would be better to, once the filter is built, simply
count the

number of 1 bits and only use the filter if there's less than
<threshold> 1 bits compared to the size of the filter in bits.
There's
functionality in bms_num_members() to do this, and there's
also __builtin_popcount() in newer version of GCC, which we
could have
some wrapper around, perhaps.

I don't really see how this is relevant with the previous point. The
number of 1s in the bitmap can tell you the false positive rate for
the bloom filter, not what fraction of lookups will be answered with
"true".

So while this needs to be watched, so that we stop using the bloom
filter when it gets too full (e.g. due to under-estimate), it's
completely unrelated to the previous issue.

Why is it not related? this has got me confused. If a bloom filter has
all of the bits set to 1, then it will never filter any Tuples right?

Because the false positive rate can be computed without having to look
at the lookups. So it's inherently independent on the ordering of outer
relation, and so on.

If so, then a filter with all 1 bits set should be thrown away, as
it'll never help us, and the filter should generally become more
worthwhile as it contains a higher ratio of 0 bits vs 1 bits. Of
course we don't have a count of how many Tuples matched each bit, so
this is based on the assumption that each bit matches an equal number
of Tuples. Are you saying this is not an assumption that we should
make?

Sure we should check that. All I'm saying is it has nothing to do with
the first problem described in the first part of the e-mail.

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#15David Rowley
david.rowley@2ndquadrant.com
In reply to: Tomas Vondra (#14)
Re: WIP: bloom filter in Hash Joins with batches

On 28 December 2015 at 23:44, Tomas Vondra <tomas.vondra@2ndquadrant.com>
wrote:

On 12/28/2015 11:38 AM, David Rowley wrote:

If so, then a filter with all 1 bits set should be thrown away, as

it'll never help us, and the filter should generally become more

worthwhile as it contains a higher ratio of 0 bits vs 1 bits. Of
course we don't have a count of how many Tuples matched each bit, so
this is based on the assumption that each bit matches an equal number
of Tuples. Are you saying this is not an assumption that we should
make?

Sure we should check that. All I'm saying is it has nothing to do with the
first problem described in the first part of the e-mail.

Okay. I was merely suggesting this method as an alternative to checking
tracking and checking the usefulness of the filter during the hash probe. I
assumed that tracking and checking the usefulness during the hash probe
won't be free, and that it may be better if we can estimate or determine
the expected usefulness of the filter before the probe stage, and throw it
away before we waste cycles using it.

--
David Rowley http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

#16Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: David Rowley (#15)
Re: WIP: bloom filter in Hash Joins with batches

On 12/28/2015 11:52 AM, David Rowley wrote:

On 28 December 2015 at 23:44, Tomas Vondra <tomas.vondra@2ndquadrant.com
<mailto:tomas.vondra@2ndquadrant.com>> wrote:

On 12/28/2015 11:38 AM, David Rowley wrote:

If so, then a filter with all 1 bits set should be thrown away, as

it'll never help us, and the filter should generally become more
worthwhile as it contains a higher ratio of 0 bits vs 1 bits. Of
course we don't have a count of how many Tuples matched each bit, so
this is based on the assumption that each bit matches an equal
number
of Tuples. Are you saying this is not an assumption that we should
make?

Sure we should check that. All I'm saying is it has nothing to do
with the first problem described in the first part of the e-mail.

Okay. I was merely suggesting this method as an alternative to checking
tracking and checking the usefulness of the filter during the hash
probe. I assumed that tracking and checking the usefulness during the
hash probe won't be free, and that it may be better if we can estimate
or determine the expected usefulness of the filter before the probe
stage, and throw it away before we waste cycles using it.

Consider this example:

CREATE TABLE t (id INT);
INSERT INTO t SELECT i FROM generate_series(1,1000000) s(i);
ANALYZE;

SELECT * FROM t AS t1 JOIN t AS t2 ON (t1.id = t2.id)
WHERE t1.id < 10000 AND t2.id < 10000;

This will be executed like this:

QUERY PLAN
-----------------------------------------------------------------------
Hash Join (cost=17046.26..34008.58 rows=94 width=8)
Hash Cond: (t1.id = t2.id)
-> Seq Scan on t t1 (cost=0.00..16925.00 rows=9701 width=4)
Filter: (id < 10000)
-> Hash (cost=16925.00..16925.00 rows=9701 width=4)
-> Seq Scan on t t2 (cost=0.00..16925.00 rows=9701 width=4)
Filter: (id < 10000)
(7 rows)

But of course the problem is that the two relations are (trivially)
correlated, which means that in reality it works like this:

QUERY PLAN
---------------------------------------------------------
Hash Join (actual rows=9999 loops=1)
Hash Cond: (t1.id = t2.id)
-> Seq Scan on t t1 (actual rows=9999 loops=1)
Filter: (id < 10000)
Rows Removed by Filter: 990001
-> Hash (actual rows=9999 loops=1)
Buckets: 16384 Batches: 1 Memory Usage: 480kB
-> Seq Scan on t t2 (actual rows=9999 loops=1)
Filter: (id < 10000)
Rows Removed by Filter: 990001
Planning time: 0.316 ms
Execution time: 176.283 ms
(12 rows)

So while we have very good estimates on the scan nodes, the final
estimate is off - we expect about the bloom filter to eliminate ~99% of
rows, in reality 100% of rows matches (due to the correlation). And
that's even if the bloom filter is "perfect" in the sense that it has
very low false probability etc.

This example illustrates that such cases can't be really solved before
actually doing the lookups. Which does not make the checks you propose
pointless, but they simply address different cases (and I indeed planned
to implement them).

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#17Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Tomas Vondra (#1)
2 attachment(s)
Re: WIP: bloom filter in Hash Joins with batches

Hi,

attached is v2 of the patch, with a number of improvements:

0) This relies on the the other hashjoin patches (delayed build of
buckets and batching), as it allows sizing the bloom filter.

1) enable_hashjoin_bloom GUC

This is mostly meant for debugging and testing, not for committing.

2) Outer joins should be working fine now. That is, the results should
be correct and faster as the outer rows without matches should not
be batched at all.

3) The bloom filter is now built for all hash joins, not just when
batching is happening. I've been a bit skeptical about the
non-batched cases, but it seems that I can get a sizable speedup
(~20-30%, depending on the selectivity of the join).

4) The code is refactored quite a bit, adding BloomFilterData instead
of just sprinkling the fields on HashJoinState or HashJoinTableData.

5) To size the bloom filter, we now use HyperLogLog couter, which we
now have in core thanks to the sorting improvements done by Peter
Geoghegan. This allows making the bloom filter much smaller when
possible.

The patch also extends the HyperLogLog API a bit (which I'll submit
to the CF independently).

There's a bunch of comments in the code, mostly with ideas about more
possible improvements.

The main piece missing in the patch (IMHO) is optimizer code making
decisions whether to enable bloom filters for the hash join, based on
cardinality estimates. And also the executor code disabling the bloom
filter if they turn inefficient. I don't think that's a major issue at
this point, though, and I think it'll be easier to do based on testing
the current patch.

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

0001-extend-the-HyperLogLog-API-a-bit-by-adding-two-more-.patchtext/x-diff; name=0001-extend-the-HyperLogLog-API-a-bit-by-adding-two-more-.patchDownload
>From 8f207693faa65e65e8a1e5e894c2ad96ad1f3cea Mon Sep 17 00:00:00 2001
From: Tomas Vondra <tomas@pgaddict.com>
Date: Mon, 28 Dec 2015 14:20:17 +0100
Subject: [PATCH 1/2] extend the HyperLogLog API a bit by adding two more
 methods

- initHyperLogLogError (initialize the counter for error rate)

- freeHyperLogLog (release the memory allocated for counter state)
---
 src/backend/lib/hyperloglog.c | 29 +++++++++++++++++++++++++++++
 src/include/lib/hyperloglog.h |  2 ++
 2 files changed, 31 insertions(+)

diff --git a/src/backend/lib/hyperloglog.c b/src/backend/lib/hyperloglog.c
index 718afb8..2949a8d 100644
--- a/src/backend/lib/hyperloglog.c
+++ b/src/backend/lib/hyperloglog.c
@@ -108,6 +108,35 @@ initHyperLogLog(hyperLogLogState *cState, uint8 bwidth)
 }
 
 /*
+ * Initialize HyperLogLog track state
+ */
+void
+initHyperLogLogError(hyperLogLogState *cState, double error)
+{
+	uint8 bwidth = 4;
+
+	while (bwidth < 16)
+	{
+		double m = (Size)1 << bwidth;
+		if (1.04 / sqrt(m) < error)
+			break;
+		bwidth++;
+	}
+
+	initHyperLogLog(cState, bwidth);
+}
+
+/*
+ * Free HyperLogLog track state
+ */
+void
+freeHyperLogLog(hyperLogLogState *cState)
+{
+	Assert(cState->hashesArr != NULL);
+	pfree(cState->hashesArr);
+}
+
+/*
  * Adds element to the estimator, from caller-supplied hash.
  *
  * It is critical that the hash value passed be an actual hash value, typically
diff --git a/src/include/lib/hyperloglog.h b/src/include/lib/hyperloglog.h
index fd8280c..004490a 100644
--- a/src/include/lib/hyperloglog.h
+++ b/src/include/lib/hyperloglog.h
@@ -60,8 +60,10 @@ typedef struct hyperLogLogState
 } hyperLogLogState;
 
 extern void initHyperLogLog(hyperLogLogState *cState, uint8 bwidth);
+extern void initHyperLogLogError(hyperLogLogState *cState, double error);
 extern void addHyperLogLog(hyperLogLogState *cState, uint32 hash);
 extern double estimateHyperLogLog(hyperLogLogState *cState);
 extern void mergeHyperLogLog(hyperLogLogState *cState, const hyperLogLogState *oState);
+extern void freeHyperLogLog(hyperLogLogState *cState);
 
 #endif   /* HYPERLOGLOG_H */
-- 
2.1.0

0002-hash-bloom-filters-v2.patchtext/x-diff; name=0002-hash-bloom-filters-v2.patchDownload
>From fbb2baf9b60d9f57182be3b58b3678cfe52b2931 Mon Sep 17 00:00:00 2001
From: Tomas Vondra <tomas@pgaddict.com>
Date: Sun, 27 Dec 2015 18:26:34 +0100
Subject: [PATCH 2/2] hash bloom filters v2

- extend bloom filters to unbatched case

- always start with nbatch=1 even when we assume we'll need to batch
  (helps with over-estimates and also sizing of the bloom filter)

- use HyperLogLog to count distinct values and size the bloom filter
  (we can do this thanks to always starting with nbatch=1)

- refactorings and cleanups
---
 src/backend/executor/nodeHash.c     | 259 +++++++++++++++++++++++++++++
 src/backend/executor/nodeHashjoin.c |  24 ++-
 src/backend/utils/adt/Makefile      |   2 +-
 src/backend/utils/adt/murmur3.c     | 315 ++++++++++++++++++++++++++++++++++++
 src/backend/utils/misc/guc.c        |   9 ++
 src/include/executor/hashjoin.h     |  18 +++
 src/include/optimizer/cost.h        |   1 +
 src/include/utils/murmur3.h         |  29 ++++
 8 files changed, 655 insertions(+), 2 deletions(-)
 create mode 100644 src/backend/utils/adt/murmur3.c
 create mode 100644 src/include/utils/murmur3.h

diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c
index c53d485..ebfc6c2 100644
--- a/src/backend/executor/nodeHash.c
+++ b/src/backend/executor/nodeHash.c
@@ -31,12 +31,15 @@
 #include "executor/hashjoin.h"
 #include "executor/nodeHash.h"
 #include "executor/nodeHashjoin.h"
+#include "lib/hyperloglog.h"
 #include "miscadmin.h"
 #include "utils/dynahash.h"
 #include "utils/memutils.h"
 #include "utils/lsyscache.h"
 #include "utils/syscache.h"
+#include "utils/murmur3.h"
 
+bool		enable_hashjoin_bloom = true;
 
 static void ExecHashIncreaseNumBatches(HashJoinTable hashtable);
 static void ExecHashBuildBuckets(HashJoinTable hashtable);
@@ -47,9 +50,17 @@ static void ExecHashSkewTableInsert(HashJoinTable hashtable,
 						uint32 hashvalue,
 						int bucketNumber);
 static void ExecHashRemoveNextSkewBucket(HashJoinTable hashtable);
+static void ExecHashHLLAddValue(HashJoinTable hashtable, uint32 hashvalue);
+static void ExecHashBloomAddValue(HashJoinTable hashtable, uint32 hashvalue);
 
 static void *dense_alloc(HashJoinTable hashtable, Size size);
 
+static BloomFilter BloomFilterInit(double nrows, double error);
+
+/* let's shoot for 5% false positives error rate (arbitrary value) */
+#define BLOOM_ERROR_RATE 0.05
+
+
 /* ----------------------------------------------------------------
  *		ExecHash
  *
@@ -112,6 +123,22 @@ MultiExecHash(HashState *node)
 		{
 			int			bucketNumber;
 
+			/*
+			 * If we're interested in building the bloom filter, add the hash
+			 * value either to the hyperloglog counter or to the bloom filter,
+			 * depending on which phase we're in. If we're still not batching,
+			 * we only have the hyperloglog counter, otherwise we have the
+			 * bloom filter.
+			 *
+			 * XXX We may still not build any of the two things (HLL, bloom),
+			 *     e.g. if we decide not to based on estimates or at runtime.
+			 */
+			if (enable_hashjoin_bloom)
+			{
+				ExecHashHLLAddValue(hashtable, hashvalue);
+				ExecHashBloomAddValue(hashtable, hashvalue);
+			}
+
 			bucketNumber = ExecHashGetSkewBucket(hashtable, hashvalue);
 			if (bucketNumber != INVALID_SKEW_BUCKET_NO)
 			{
@@ -307,6 +334,35 @@ ExecHashTableCreate(Hash *node, List *hashOperators, bool keepNulls)
 		hashtable->spaceAllowed * SKEW_WORK_MEM_PERCENT / 100;
 	hashtable->chunks = NULL;
 
+	/* only one of those is assumed to be non-NULL */
+	hashtable->bloomFilter = NULL;
+	hashtable->hll = NULL;
+
+	/*
+	 * We don't quite know how many distinct values to expect, so we'll use
+	 * the estimated number of rowsto be added to the hash table, and assume
+	 * they're all distinct.
+	 *
+	 * But if we already know there'll be multiple batches, we can't use hll
+	 * because we need to start building the bloom filter right away. In that
+	 * case we simply assume all the values are unique - we'll probably use
+	 * larger (and thus less efficient) bloom filter. It may not matter that
+	 * much because the possible savings (reduced I/O etc.) are much more
+	 * significant.
+	 *
+	 * XXX What we could do is always build the first batch in memory, thus
+	 *     get ndistinct estimate from hyperloglog and then immediately
+	 *     switch to the originally estimated number of batches.
+	 *
+	 * XXX Not really sure how to size the HLL, so the bwidth value may be
+	 *     too high (and the counter too big).
+	 */
+	if (enable_hashjoin_bloom)
+	{
+		hashtable->hll = palloc0(sizeof(hyperLogLogState));
+		initHyperLogLogError(hashtable->hll, 0.05);
+	}
+
 	/*
 	 * Get info about the hash functions to be used for each hash key. Also
 	 * remember whether the join operators are strict.
@@ -588,6 +644,7 @@ ExecHashIncreaseNumBatches(HashJoinTable hashtable)
 	long		ninmemory;
 	long		nfreed;
 	HashMemoryChunk oldchunks;
+	bool		build_bloom_filter = false;
 
 	/* do nothing if we've decided to shut off growth */
 	if (!hashtable->growEnabled)
@@ -649,6 +706,61 @@ ExecHashIncreaseNumBatches(HashJoinTable hashtable)
 	ninmemory = nfreed = 0;
 
 	/*
+	 * If we're switching to batched mode (and the bloom filters are enabled),
+	 * we need to start build the bloom filter.
+	 *
+	 * To size the bloom filter, we'll use the hyperloglog counter to estimate
+	 * the number of distinct values in the first batch, multiplied by the
+	 * expected number of batches. This may not work when the estimate is wrong,
+	 * but we can't really do better.
+	 *
+	 * XXX The problem here is that if we started with nbatch=1 and we're
+	 *     starting to batch now, it means we've under-estimated the cardinality
+	 *     somehow. And we don't know how much, but it's quite likely it's not
+	 *     just by a factor of 2 (which is assumed in the next block). So maybe
+	 *     we should be more pessimistic and use a higher number of batches.
+	 *
+	 * XXX We also need to set some maximum number of tuples when the false
+	 *     positive rate gets too bad, and stop using the bloom filter if we
+	 *     reach it (we can't resize the filter).
+	 *
+	 * XXX We can't really resize the bloom filter if we reach the number of
+	 *     distinct values, but there was a paper about adding a larger bloom
+	 *     filter once we fill the existing one, and using them at the same
+	 *     time. Might be worth implementing if the whole bloom filter idea
+	 *     works in general.
+	 *
+	 * We also need to make sure we added the hash values into the bloom
+	 * filter in this case (that's what build_bloom_filter is for).
+	 */
+	if (enable_hashjoin_bloom && (oldnbatch == 1))
+	{
+		double ndistinct;
+
+		/* must have the counter to size bloom filter properly */
+		Assert(hashtable->hll);
+
+		ndistinct = estimateHyperLogLog(hashtable->hll);
+
+		/* We don't really want tiny bloom filters. */
+		if (ndistinct < 1024)
+			ndistinct = 1024;
+
+		elog(WARNING, "ExecHashIncreaseNumBatches: ndistinct %ld",
+					  (int64)(nbatch * ndistinct));
+
+		hashtable->bloomFilter = BloomFilterInit(nbatch * ndistinct,
+												 BLOOM_ERROR_RATE);
+
+		/* Free the HLL state (entirely). */
+		freeHyperLogLog(hashtable->hll);
+		pfree(hashtable->hll);
+		hashtable->hll = NULL;
+
+		build_bloom_filter = true;
+	}
+
+	/*
 	 * We will scan through the chunks directly, so that we can reset the
 	 * buckets now and not have to keep track which tuples in the buckets have
 	 * already been processed. We will free the old chunks as we go.
@@ -677,6 +789,9 @@ ExecHashIncreaseNumBatches(HashJoinTable hashtable)
 			ExecHashGetBucketAndBatch(hashtable, hashTuple->hashvalue,
 									  &bucketno, &batchno);
 
+			if (build_bloom_filter)
+				ExecHashBloomAddValue(hashtable, hashTuple->hashvalue);
+
 			if (batchno == curbatch)
 			{
 				/* keep tuple in memory - copy it into the new chunk */
@@ -736,6 +851,7 @@ ExecHashIncreaseNumBatches(HashJoinTable hashtable)
 static void
 ExecHashBuildBuckets(HashJoinTable hashtable)
 {
+	bool build_bloom_filter = false;
 	HashMemoryChunk chunk;
 
 #ifdef HJDEBUG
@@ -760,6 +876,33 @@ ExecHashBuildBuckets(HashJoinTable hashtable)
 	/* Don't forget to zero the buckets (AllocHuge does not do that). */
 	memset(hashtable->buckets, 0, hashtable->nbuckets * sizeof(HashJoinTuple));
 
+	/*
+	 * If we're still in the 'count-ndistinct phase, we need to build the
+	 * bloom filter at this point.
+	 */
+	if (hashtable->hll != NULL)
+	{
+		double ndistinct;
+
+		ndistinct = estimateHyperLogLog(hashtable->hll);
+
+		if (ndistinct < 1024)
+			ndistinct = 1024;
+
+		elog(WARNING, "ExecHashBuildBuckets: building bloom filter (ndistinct %ld)",
+					  (int64)(2*ndistinct));
+
+		hashtable->bloomFilter = BloomFilterInit(2 * ndistinct,
+												 BLOOM_ERROR_RATE);
+
+		/* Free the HLL state. */
+		freeHyperLogLog(hashtable->hll);
+		pfree(hashtable->hll);
+		hashtable->hll = NULL;
+
+		build_bloom_filter = true;
+	}
+
 	/* scan through all tuples in all chunks to rebuild the hash table */
 	for (chunk = hashtable->chunks; chunk != NULL; chunk = chunk->next)
 	{
@@ -775,6 +918,9 @@ ExecHashBuildBuckets(HashJoinTable hashtable)
 			ExecHashGetBucketAndBatch(hashtable, hashTuple->hashvalue,
 									  &bucketno, &batchno);
 
+			if (build_bloom_filter)
+				ExecHashBloomAddValue(hashtable, hashTuple->hashvalue);
+
 			/* add the tuple to the proper bucket */
 			hashTuple->next = hashtable->buckets[bucketno];
 			hashtable->buckets[bucketno] = hashTuple;
@@ -1683,3 +1829,116 @@ dense_alloc(HashJoinTable hashtable, Size size)
 	/* return pointer to the start of the tuple memory */
 	return ptr;
 }
+
+static void
+ExecHashHLLAddValue(HashJoinTable hashtable, uint32 hashvalue)
+{
+	hyperLogLogState   *hll = hashtable->hll;
+
+	/*
+	 * If we don't have a HLL counter, then we're not supposed to build
+	 * it and we can just bail out.
+	 */
+	if (hll == NULL)
+		return;
+
+	/* We can't have both counter and filter at the same time. */
+	Assert(hashtable->bloomFilter == NULL);
+
+	addHyperLogLog(hashtable->hll, hashvalue);
+}
+
+static void
+ExecHashBloomAddValue(HashJoinTable hashtable, uint32 hashvalue)
+{
+	int			i, byteIdx, bitIdx;
+	BloomFilter	filter = hashtable->bloomFilter;
+
+	/*
+	 * If we don't have a bloom filter, then we're not supposed to build
+	 * it and we can just bail out.
+	 */
+	if (filter == NULL)
+		return;
+
+	/* We can't have both counter and filter at the same time. */
+	Assert(hashtable->hll == NULL);
+
+	/*
+	 * We only build bloom filters while in the first batch (with all
+	 * tuples, so it makes no sense to re-add them over and over).
+	 */
+	if (hashtable->curbatch > 0)
+		return;
+
+	/*
+	 * To get multiple independent hash functions, we simply use
+	 * different seeds for them. We use murmur3 with 32-bit values here,
+	 * but we might use anything sufficiently random and fast (e.g.
+	 * jenkinks hash or such).
+	 */
+	for (i = 0; i < filter->nhashes; i++)
+	{
+		uint32_t seed = i;
+		uint32_t hash = 0;
+
+		MurmurHash3_x86_32(&hashvalue, sizeof(uint32), seed, &hash);
+
+		hash = hash % filter->nbits;
+
+		byteIdx = (hash / 8);
+		bitIdx = (hash % 8);
+
+		filter->data[byteIdx] |= (0x01 << bitIdx);
+	}
+}
+
+bool
+ExecHashBloomCheckValue(HashJoinTable hashtable, uint32 hashvalue)
+{
+	int			i, byteIdx, bitIdx;
+	BloomFilter	filter = hashtable->bloomFilter;
+
+	if (! filter)
+		return true;
+
+	filter->nlookups++;
+
+	for (i = 0; i < filter->nhashes; i++)
+	{
+		uint32_t seed = i;
+		uint32_t hash = 0;
+
+		MurmurHash3_x86_32(&hashvalue, sizeof(uint32), seed, &hash);
+
+		hash = hash % filter->nbits;
+
+		byteIdx = (hash / 8);
+		bitIdx = (hash % 8);
+
+		if (! (filter->data[byteIdx] & (0x01 << bitIdx)))
+			return false;
+	}
+
+	/* if we got here, we know it's a match */
+	filter->nmatches++;
+
+	return true;
+}
+
+static BloomFilter
+BloomFilterInit(double nrows, double error)
+{
+	/* perhaps we should round nbits to multiples of 8 ? */
+	int nbits = ceil((nrows * log(error)) / log(1.0 / (pow(2.0, log(2.0)))));
+	int nhashes = round(log(2.0) * nbits / nrows);
+
+	BloomFilter filter = palloc0(offsetof(BloomFilterData, data) + ((nbits + 7) / 8));
+
+	filter->nbits = nbits;
+	filter->nhashes = nhashes;
+
+	elog(WARNING, "bloom filter: %d bits (%d bytes), %d hashes", nbits, (nbits + 7) / 8, nhashes);
+
+	return filter;
+}
diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c
index 1d78cdf..101f39a 100644
--- a/src/backend/executor/nodeHashjoin.c
+++ b/src/backend/executor/nodeHashjoin.c
@@ -48,7 +48,6 @@ static TupleTableSlot *ExecHashJoinGetSavedTuple(HashJoinState *hjstate,
 						  TupleTableSlot *tupleSlot);
 static bool ExecHashJoinNewBatch(HashJoinState *hjstate);
 
-
 /* ----------------------------------------------------------------
  *		ExecHashJoin
  *
@@ -210,6 +209,7 @@ ExecHashJoin(HashJoinState *node)
 				outerTupleSlot = ExecHashJoinOuterGetTuple(outerNode,
 														   node,
 														   &hashvalue);
+
 				if (TupIsNull(outerTupleSlot))
 				{
 					/* end of batch, or maybe whole join */
@@ -238,6 +238,15 @@ ExecHashJoin(HashJoinState *node)
 																 hashvalue);
 				node->hj_CurTuple = NULL;
 
+				/* If still in the first batch, we check the bloom filter. */
+				if ((hashtable->curbatch == 0) &&
+					(! ExecHashBloomCheckValue(hashtable, hashvalue)))
+				{
+						/* no matches; check for possible outer-join fill */
+						node->hj_JoinState = HJ_FILL_OUTER_TUPLE;
+						continue;
+				}
+
 				/*
 				 * The tuple might not belong to the current batch (where
 				 * "current batch" includes the skew buckets if any).
@@ -608,6 +617,19 @@ ExecEndHashJoin(HashJoinState *node)
 	 */
 	if (node->hj_HashTable)
 	{
+		HashJoinTable hashtable = node->hj_HashTable;
+
+		/*
+		 * If there's a bloom filter, print some debug info before destroying the
+		 * hash table.
+		 */
+		if (hashtable->bloomFilter)
+		{
+			BloomFilter filter = hashtable->bloomFilter;
+			elog(WARNING, "bloom filter lookups=%lu matches=%lu eliminated=%lu%%",
+						  filter->nlookups, filter->nmatches, 100 - (100 * filter->nmatches) / Max(1,filter->nlookups));
+		}
+
 		ExecHashTableDestroy(node->hj_HashTable);
 		node->hj_HashTable = NULL;
 	}
diff --git a/src/backend/utils/adt/Makefile b/src/backend/utils/adt/Makefile
index 2cb7bab..365123b 100644
--- a/src/backend/utils/adt/Makefile
+++ b/src/backend/utils/adt/Makefile
@@ -16,7 +16,7 @@ OBJS = acl.o arrayfuncs.o array_expanded.o array_selfuncs.o \
 	float.o format_type.o formatting.o genfile.o \
 	geo_ops.o geo_selfuncs.o inet_cidr_ntop.o inet_net_pton.o int.o \
 	int8.o json.o jsonb.o jsonb_gin.o jsonb_op.o jsonb_util.o \
-	jsonfuncs.o like.o lockfuncs.o mac.o misc.o nabstime.o name.o \
+	jsonfuncs.o like.o lockfuncs.o mac.o misc.o murmur3.o nabstime.o name.o \
 	network.o network_gist.o network_selfuncs.o \
 	numeric.o numutils.o oid.o oracle_compat.o \
 	orderedsetaggs.o pg_locale.o pg_lsn.o pg_upgrade_support.o \
diff --git a/src/backend/utils/adt/murmur3.c b/src/backend/utils/adt/murmur3.c
new file mode 100644
index 0000000..764aeab
--- /dev/null
+++ b/src/backend/utils/adt/murmur3.c
@@ -0,0 +1,315 @@
+//-----------------------------------------------------------------------------
+// MurmurHash3 was written by Austin Appleby, and is placed in the public
+// domain. The author hereby disclaims copyright to this source code.
+
+// Note - The x86 and x64 versions do _not_ produce the same results, as the
+// algorithms are optimized for their respective platforms. You can still
+// compile and run any of them on any platform, but your performance with the
+// non-native version will be less than optimal.
+
+#include "utils/murmur3.h"
+
+//-----------------------------------------------------------------------------
+// Platform-specific functions and macros
+
+#ifdef __GNUC__
+#define FORCE_INLINE __attribute__((always_inline)) inline
+#else
+#define FORCE_INLINE inline
+#endif
+
+static FORCE_INLINE uint32_t rotl32 ( uint32_t x, int8_t r )
+{
+  return (x << r) | (x >> (32 - r));
+}
+
+static FORCE_INLINE uint64_t rotl64 ( uint64_t x, int8_t r )
+{
+  return (x << r) | (x >> (64 - r));
+}
+
+#define	ROTL32(x,y)	rotl32(x,y)
+#define ROTL64(x,y)	rotl64(x,y)
+
+#define BIG_CONSTANT(x) (x##LLU)
+
+//-----------------------------------------------------------------------------
+// Block read - if your platform needs to do endian-swapping or can only
+// handle aligned reads, do the conversion here
+
+#define getblock(p, i) (p[i])
+
+//-----------------------------------------------------------------------------
+// Finalization mix - force all bits of a hash block to avalanche
+
+static FORCE_INLINE uint32_t fmix32 ( uint32_t h )
+{
+  h ^= h >> 16;
+  h *= 0x85ebca6b;
+  h ^= h >> 13;
+  h *= 0xc2b2ae35;
+  h ^= h >> 16;
+
+  return h;
+}
+
+//----------
+
+static FORCE_INLINE uint64_t fmix64 ( uint64_t k )
+{
+  k ^= k >> 33;
+  k *= BIG_CONSTANT(0xff51afd7ed558ccd);
+  k ^= k >> 33;
+  k *= BIG_CONSTANT(0xc4ceb9fe1a85ec53);
+  k ^= k >> 33;
+
+  return k;
+}
+
+//-----------------------------------------------------------------------------
+
+void MurmurHash3_x86_32 ( const void * key, int len,
+                          uint32_t seed, void * out )
+{
+  const uint8_t * data = (const uint8_t*)key;
+  const int nblocks = len / 4;
+  int i;
+
+  uint32_t h1 = seed;
+
+  uint32_t c1 = 0xcc9e2d51;
+  uint32_t c2 = 0x1b873593;
+
+  //----------
+  // body
+
+  const uint32_t * blocks = (const uint32_t *)(data + nblocks*4);
+
+  for(i = -nblocks; i; i++)
+  {
+    uint32_t k1 = getblock(blocks,i);
+
+    k1 *= c1;
+    k1 = ROTL32(k1,15);
+    k1 *= c2;
+    
+    h1 ^= k1;
+    h1 = ROTL32(h1,13); 
+    h1 = h1*5+0xe6546b64;
+  }
+
+  //----------
+  // tail
+
+  const uint8_t * tail = (const uint8_t*)(data + nblocks*4);
+
+  uint32_t k1 = 0;
+
+  switch(len & 3)
+  {
+  case 3: k1 ^= tail[2] << 16;
+  case 2: k1 ^= tail[1] << 8;
+  case 1: k1 ^= tail[0];
+          k1 *= c1; k1 = ROTL32(k1,15); k1 *= c2; h1 ^= k1;
+  };
+
+  //----------
+  // finalization
+
+  h1 ^= len;
+
+  h1 = fmix32(h1);
+
+  *(uint32_t*)out = h1;
+} 
+
+//-----------------------------------------------------------------------------
+
+void MurmurHash3_x86_128 ( const void * key, const int len,
+                           uint32_t seed, void * out )
+{
+  const uint8_t * data = (const uint8_t*)key;
+  const int nblocks = len / 16;
+  int i;
+
+  uint32_t h1 = seed;
+  uint32_t h2 = seed;
+  uint32_t h3 = seed;
+  uint32_t h4 = seed;
+
+  uint32_t c1 = 0x239b961b; 
+  uint32_t c2 = 0xab0e9789;
+  uint32_t c3 = 0x38b34ae5; 
+  uint32_t c4 = 0xa1e38b93;
+
+  //----------
+  // body
+
+  const uint32_t * blocks = (const uint32_t *)(data + nblocks*16);
+
+  for(i = -nblocks; i; i++)
+  {
+    uint32_t k1 = getblock(blocks,i*4+0);
+    uint32_t k2 = getblock(blocks,i*4+1);
+    uint32_t k3 = getblock(blocks,i*4+2);
+    uint32_t k4 = getblock(blocks,i*4+3);
+
+    k1 *= c1; k1  = ROTL32(k1,15); k1 *= c2; h1 ^= k1;
+
+    h1 = ROTL32(h1,19); h1 += h2; h1 = h1*5+0x561ccd1b;
+
+    k2 *= c2; k2  = ROTL32(k2,16); k2 *= c3; h2 ^= k2;
+
+    h2 = ROTL32(h2,17); h2 += h3; h2 = h2*5+0x0bcaa747;
+
+    k3 *= c3; k3  = ROTL32(k3,17); k3 *= c4; h3 ^= k3;
+
+    h3 = ROTL32(h3,15); h3 += h4; h3 = h3*5+0x96cd1c35;
+
+    k4 *= c4; k4  = ROTL32(k4,18); k4 *= c1; h4 ^= k4;
+
+    h4 = ROTL32(h4,13); h4 += h1; h4 = h4*5+0x32ac3b17;
+  }
+
+  //----------
+  // tail
+
+  const uint8_t * tail = (const uint8_t*)(data + nblocks*16);
+
+  uint32_t k1 = 0;
+  uint32_t k2 = 0;
+  uint32_t k3 = 0;
+  uint32_t k4 = 0;
+
+  switch(len & 15)
+  {
+  case 15: k4 ^= tail[14] << 16;
+  case 14: k4 ^= tail[13] << 8;
+  case 13: k4 ^= tail[12] << 0;
+           k4 *= c4; k4  = ROTL32(k4,18); k4 *= c1; h4 ^= k4;
+
+  case 12: k3 ^= tail[11] << 24;
+  case 11: k3 ^= tail[10] << 16;
+  case 10: k3 ^= tail[ 9] << 8;
+  case  9: k3 ^= tail[ 8] << 0;
+           k3 *= c3; k3  = ROTL32(k3,17); k3 *= c4; h3 ^= k3;
+
+  case  8: k2 ^= tail[ 7] << 24;
+  case  7: k2 ^= tail[ 6] << 16;
+  case  6: k2 ^= tail[ 5] << 8;
+  case  5: k2 ^= tail[ 4] << 0;
+           k2 *= c2; k2  = ROTL32(k2,16); k2 *= c3; h2 ^= k2;
+
+  case  4: k1 ^= tail[ 3] << 24;
+  case  3: k1 ^= tail[ 2] << 16;
+  case  2: k1 ^= tail[ 1] << 8;
+  case  1: k1 ^= tail[ 0] << 0;
+           k1 *= c1; k1  = ROTL32(k1,15); k1 *= c2; h1 ^= k1;
+  };
+
+  //----------
+  // finalization
+
+  h1 ^= len; h2 ^= len; h3 ^= len; h4 ^= len;
+
+  h1 += h2; h1 += h3; h1 += h4;
+  h2 += h1; h3 += h1; h4 += h1;
+
+  h1 = fmix32(h1);
+  h2 = fmix32(h2);
+  h3 = fmix32(h3);
+  h4 = fmix32(h4);
+
+  h1 += h2; h1 += h3; h1 += h4;
+  h2 += h1; h3 += h1; h4 += h1;
+
+  ((uint32_t*)out)[0] = h1;
+  ((uint32_t*)out)[1] = h2;
+  ((uint32_t*)out)[2] = h3;
+  ((uint32_t*)out)[3] = h4;
+}
+
+//-----------------------------------------------------------------------------
+
+void MurmurHash3_x64_128 ( const void * key, const int len,
+                           const uint32_t seed, void * out )
+{
+  const uint8_t * data = (const uint8_t*)key;
+  const int nblocks = len / 16;
+  int i;
+
+  uint64_t h1 = seed;
+  uint64_t h2 = seed;
+
+  uint64_t c1 = BIG_CONSTANT(0x87c37b91114253d5);
+  uint64_t c2 = BIG_CONSTANT(0x4cf5ad432745937f);
+
+  //----------
+  // body
+
+  const uint64_t * blocks = (const uint64_t *)(data);
+
+  for(i = 0; i < nblocks; i++)
+  {
+    uint64_t k1 = getblock(blocks,i*2+0);
+    uint64_t k2 = getblock(blocks,i*2+1);
+
+    k1 *= c1; k1  = ROTL64(k1,31); k1 *= c2; h1 ^= k1;
+
+    h1 = ROTL64(h1,27); h1 += h2; h1 = h1*5+0x52dce729;
+
+    k2 *= c2; k2  = ROTL64(k2,33); k2 *= c1; h2 ^= k2;
+
+    h2 = ROTL64(h2,31); h2 += h1; h2 = h2*5+0x38495ab5;
+  }
+
+  //----------
+  // tail
+
+  const uint8_t * tail = (const uint8_t*)(data + nblocks*16);
+
+  uint64_t k1 = 0;
+  uint64_t k2 = 0;
+
+  switch(len & 15)
+  {
+  case 15: k2 ^= (uint64_t)(tail[14]) << 48;
+  case 14: k2 ^= (uint64_t)(tail[13]) << 40;
+  case 13: k2 ^= (uint64_t)(tail[12]) << 32;
+  case 12: k2 ^= (uint64_t)(tail[11]) << 24;
+  case 11: k2 ^= (uint64_t)(tail[10]) << 16;
+  case 10: k2 ^= (uint64_t)(tail[ 9]) << 8;
+  case  9: k2 ^= (uint64_t)(tail[ 8]) << 0;
+           k2 *= c2; k2  = ROTL64(k2,33); k2 *= c1; h2 ^= k2;
+
+  case  8: k1 ^= (uint64_t)(tail[ 7]) << 56;
+  case  7: k1 ^= (uint64_t)(tail[ 6]) << 48;
+  case  6: k1 ^= (uint64_t)(tail[ 5]) << 40;
+  case  5: k1 ^= (uint64_t)(tail[ 4]) << 32;
+  case  4: k1 ^= (uint64_t)(tail[ 3]) << 24;
+  case  3: k1 ^= (uint64_t)(tail[ 2]) << 16;
+  case  2: k1 ^= (uint64_t)(tail[ 1]) << 8;
+  case  1: k1 ^= (uint64_t)(tail[ 0]) << 0;
+           k1 *= c1; k1  = ROTL64(k1,31); k1 *= c2; h1 ^= k1;
+  };
+
+  //----------
+  // finalization
+
+  h1 ^= len; h2 ^= len;
+
+  h1 += h2;
+  h2 += h1;
+
+  h1 = fmix64(h1);
+  h2 = fmix64(h2);
+
+  h1 += h2;
+  h2 += h1;
+
+  ((uint64_t*)out)[0] = h1;
+  ((uint64_t*)out)[1] = h2;
+}
+
+//-----------------------------------------------------------------------------
+
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index a185749..ffc1281 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -864,6 +864,15 @@ static struct config_bool ConfigureNamesBool[] =
 		NULL, NULL, NULL
 	},
 	{
+		{"enable_hashjoin_bloom", PGC_USERSET, QUERY_TUNING_METHOD,
+			gettext_noop("Enables the use of bloom filters in hash joins."),
+			NULL
+		},
+		&enable_hashjoin_bloom,
+		true,
+		NULL, NULL, NULL
+	},
+	{
 		{"geqo", PGC_USERSET, QUERY_TUNING_GEQO,
 			gettext_noop("Enables genetic query optimization."),
 			gettext_noop("This algorithm attempts to do planning without "
diff --git a/src/include/executor/hashjoin.h b/src/include/executor/hashjoin.h
index 255c506..df22361 100644
--- a/src/include/executor/hashjoin.h
+++ b/src/include/executor/hashjoin.h
@@ -16,6 +16,7 @@
 
 #include "nodes/execnodes.h"
 #include "storage/buffile.h"
+#include "lib/hyperloglog.h"
 
 /* ----------------------------------------------------------------
  *				hash-join hash table structures
@@ -72,6 +73,17 @@ typedef struct HashJoinTupleData
 #define HJTUPLE_MINTUPLE(hjtup)  \
 	((MinimalTuple) ((char *) (hjtup) + HJTUPLE_OVERHEAD))
 
+typedef struct BloomFilterData
+{
+	uint64	nlookups;		/* number of lookups */
+	uint64	nmatches;		/* number of matches */
+	int		nbits;			/* m */
+	int		nhashes;		/* k */
+	char	data[1];		/* bits */
+}	BloomFilterData;
+
+typedef BloomFilterData *BloomFilter;
+
 /*
  * If the outer relation's distribution is sufficiently nonuniform, we attempt
  * to optimize the join by treating the hash values corresponding to the outer
@@ -181,6 +193,12 @@ typedef struct HashJoinTableData
 
 	/* used for dense allocation of tuples (into linked chunks) */
 	HashMemoryChunk chunks;		/* one list for the whole batch */
+
+	/* used only when the hash join has multiple batches */
+	BloomFilter	bloomFilter;	/* bloom filter on the hash values */
+	hyperLogLogState   *hll;	/* used to to size bloom filter */
 }	HashJoinTableData;
 
+bool ExecHashBloomCheckValue(HashJoinTable hashtable, uint32 hashvalue);
+
 #endif   /* HASHJOIN_H */
diff --git a/src/include/optimizer/cost.h b/src/include/optimizer/cost.h
index ac21a3a..999bf84 100644
--- a/src/include/optimizer/cost.h
+++ b/src/include/optimizer/cost.h
@@ -66,6 +66,7 @@ extern bool enable_nestloop;
 extern bool enable_material;
 extern bool enable_mergejoin;
 extern bool enable_hashjoin;
+extern bool enable_hashjoin_bloom;
 extern int	constraint_exclusion;
 
 extern double clamp_row_est(double nrows);
diff --git a/src/include/utils/murmur3.h b/src/include/utils/murmur3.h
new file mode 100644
index 0000000..e12bf08
--- /dev/null
+++ b/src/include/utils/murmur3.h
@@ -0,0 +1,29 @@
+//-----------------------------------------------------------------------------
+// MurmurHash3 was written by Austin Appleby, and is placed in the
+// public domain. The author hereby disclaims copyright to this source
+// code.
+
+#ifndef _MURMURHASH3_H_
+#define _MURMURHASH3_H_
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//-----------------------------------------------------------------------------
+
+void MurmurHash3_x86_32 (const void *key, int len, uint32_t seed, void *out);
+
+void MurmurHash3_x86_128(const void *key, int len, uint32_t seed, void *out);
+
+void MurmurHash3_x64_128(const void *key, int len, uint32_t seed, void *out);
+
+//-----------------------------------------------------------------------------
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _MURMURHASH3_H_
-- 
2.1.0

#18Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Simon Riggs (#9)
5 attachment(s)
Re: WIP: bloom filter in Hash Joins with batches

Hi,

attached are results for some basic performance evaluation of the patch
(and also scripts used for the evaluation). I've used a simple join of
two tables ("fact" and "dim"), with three different dataset sizes.

CREATE TABLE dim (id INT, r INT, val TEXT);
CREATE TABLE fact (id INT, val TEXT);

-- 1M rows into "dim"
INSERT INTO dim
SELECT i, mod(i,100), md5(i::text) FROM generate_series(1,1000000) s(i);

-- 10M rows into "fact"
INSERT INTO fact
SELECT mod(i,1000000)+1, md5((mod(i,1000000)+1)::text)
FROM generate_series(1,10000000) s(i);

Which means the "dim.r" column has 100 different values (0-99) with
uniform distribution. So e.g. "WHERE r < 15" matches 15%.

There are three dataset sizes:

1) small: dim 1M rows (73MB), fact 10M rows (650MB)

2) medium: dim: 10M rows (730MB), fact 100M rows (6.5GB)

3) large: dim: 5M rows (365MB), fact 250M rows (16GB)

The machine has 8GB of RAM, so "small" easily fits into RAM, "medium" is
just at the border, and "large" is clearly over (especially when batching).

For each dataset size there are two queries - one with inner and one
with outer join, with a filter on the smaller one ("dim") determining
the "selectivity".

-- inner join
SELECT COUNT(dim.val), COUNT(fact.val)
FROM fact JOIN dim ON (fact.id = dim.id) WHERE r < $1

-- outer join
SELECT COUNT(dim.val), COUNT(fact.val)
FROM fact LEFT JOIN (SELECT * FROM dim WHERE r < $1) dim
ON (fact.id = dim.id)

Those queries were executed with various work_mem sizes (to either use
no batching or different number of batches), and also with different
filter values (to filter to 10%, 20%, 30%, ...., 100% of data).

After collecting data both on master and with all the patches applied,
I've computed the speedup factor as

(time with patches) / (time on master)

and plotted that as a pivot tables with heat map. Values <1.0 (red) mean
"bloom filter made the query faster" while values > 1.0 (blue) means it
slowed the query down.

Let's quickly skim through the results for each dataset size. The
attached charts only show results for the "inner" queries, but the
results for "outer" queries are pretty much exactly the same.

1) small (hash-joins-bloom-1-10.png)
------------------------------------

There's a clear speedup as long as the hash join requires batching and
the selectivity is below 50-60%. In the best case (10% selectivity,
small work_mem and thus multiple batches) we save up to ~30% of time.

Once we get to non-batching mode, the bloom filter is ineffective no
matter the selectivity. I assume this is because for the small
selectivities (e.g. 10%) it's simply cheaper to check the hash table,
which is small and likely fits into L3 on the CPU (which is ~6MB on the
i5-2500 CPU in the system).

2) medium (hash-joins-bloom-10-100.png)
---------------------------------------

The results are similar to the "small" results, except that the speedup
is somewhat larger (up to 40%), and there's no sudden jump when the
queries stop batching (work_mem=1GB is enough to run the query in a
single batch even with 100% selectivity). The "break-even" selectivity
is again somewhere around 50% (a bit lower in non-batching mode).

3) large (hash-joins-bloom-5-250.png)
-------------------------------------

Pretty much the same as "medium".

So, this seems to bring reasonable speedup, as long as the selectivity
is below 50%, and the data set is sufficiently large.

It's however clear that the patch won't work without some sort of
selectivity estimation - either at planning time or optimization time
(or both). I've speculated about how to do that, but the current patches
don't implement any of that yet and any ideas are welcome.

Another open question is sizing the bloom filter in the multi-batch
case, which turns out to be quite tricky. What the patch does right now
is estimating the number of distinct values to store in the filter based
on the first batch (the other hashjoin patch in this CF makes this
possible). That is, there's a hyperloglog counter that gives us (very
accurate) ndistinct estimate for the first batch, and then we do (nbatch
* ndistinct), to estimate the ndistinct values in the whole data set.
That estimate is of course rather naive, and often produces too high -
for example we might have already seen all the distinct values in the
first batch. So the result is a bloom filter much larger than necessary.
Not sure how to fix this :-(

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Attachments:

hash-joins-bloom-5-250.pngimage/png; name=hash-joins-bloom-5-250.pngDownload
�PNG


IHDR��4�bKGD�������	pHYsaa�?�itIME�	&W�- IDATx���wx������lz'!�$RBH���K�"�:Q�b#�^�(W�T:����%!�	�@H[�7��n���{\H�,���<y��������9��93	�1�@!�����	!�B�!�B(� �B�d�B!�lB!��
B!�J6!�B�!�B(� �B�d�B!�lB!��
B!�J6!�B�!�B%�B�d�B�j�����0�����A�c����WQ^^WWW����]�v�=����-���^z��Z��t:�Y�III
����^y���:�2�X�j��� �J1t�P���:|;�F�����������zH$��g���3fBCC�e�Z��g��C�������.�Z-f�����<|��u����/�����={6�����;�@�����_v�v�4iF����L�!�8>����[�b��apuu��hDbb"F���iii

��#`6������;�|��1�9s�10����g%&&b��!��u+�u����(�x4
F��.]��{AA
�g�4o�PYY�?�|��}������-[��������l���l��zl��
#F����{q��5���c��a5���Dxx8��i�����~CZZF�	8q�N�>
�D��]�r�a���8v���� ����3��N�D�lB�R������<���	&����
�x��70g�������w�����!
a0��W/���`2��I�&��������q�6�P�T�j�(++�o����HMM��;���(���:}�4|||�Dbbbp��
���7�
���0|�p$''�1���8��?�F;:t�-�{�������?f�����F�A�~��q�F@aa!���Q\\�������!������1,--�1��^�g������Y�|9�����:����d<�]�p�[�~�zfW����[k,���3���aR��EDD�K�.�����y�yxx��;w�Y���kYxx���u:���?��v\�x1�l��-����UWW���O?��
��t�1�***�L&c��g7o�d��.��>�����0���cL�R�}�����F#���	111��>>>v#�Zw���B���b�����y3���������R�=�����3E"����z�j���aaa>|8��7?%%111�����/�Xg]���
�w^�L�Z�l�9��X,�Z�����{��]QQQ�����o_���������w���=z�@JJ
T*:v�hW^�VC�V���?��� ��O�J���<��d�u&�	B�)))vu���0���k�RY�g�����?����"447n�@�-j}����U�Va��	��������v��I����j|���g1{�l�urr2d2Y�rr�����z�NWWWn9���?��O|��7>|8�o��q�����A������:������G;'%���+((f���-�����p��������k�������z���=zc�����~k7�PW]:t@vv6����D����P�Th��e��2d�Rg�q���c�^^^5��;QQQ�����?��O?����"TWWsmx��f���N�?��Q!��v�
???�\��[�a�L�8�^��y�&bbb��~��*-Z���(����(_UU��'b���x�����j�������@���{��j�B��a���?~���5
�i�&n�%11�&���GHH�x�
t�����5::���\�a�Z��G���prr`�n�h4��Q�A!�{�b1v������?F����f������z�N��n�:�?������@YY�o�^k�c�����[�2e
����~����������O?��Jwww���b���Mj������#$$��o���~��c����={���6��c�|��gh��-���QPP����se
�)S�`������E�_%��z(//��b���{����Z�����=�Od]�J�v�U4������[�Faa!||| �]gII	d2Y�{8���*��I�J6!�<a��#��w�d�iB!5O|>���i��<4�A!�����RB!��
B!�P�A!�B�!�B(� �B%�B!�lB!��
B!�P�A!�B�!�B(� �B%�B!�lB!��
B!�J6!�B�!�<F����J6!���4i:D
A�C$�& �<��z=�m��#F`����v����1l�0���?����O���#G��������c�����
2��<�5&!�lB�x�qqq>|8����C\\���x��71m�4�x<�:u
m��E^^
Q\\���b���PC���c����$+//���+/^�9s���k����h��5�\����z
���/�o�^|�E���`���8p 5$!	M�B�2�������kWTTT��~����h������y�h���!����e2���T*��!��
Bi:�Z��^XXCqq1�z=����+����#��
Bi�M�6q3#114h<<<�v�Z@II	�����G�D"4
5!�lBH�"""���l����9�b1���{|��'���C�-����c��I�A�a��)<x05 !	=�By��y%--
�[�Faa!||| ��2V�pww�qGqq1T*�]yB��CO�B�R$	�5kVc9������������#�!�iB�����������	BM�B!��^PB!��
B!�P�A!�R�'�i�����,B,��k���j,_���f����F�Z�
III�J�:t(bccy|:�k��ARR�B!����W^yB����,++��U�p��(
���qqq
������v��_|>��Pm�������;�u���^z��������a�Z-z���3fp7�:B�iiiX�re�����C,;D[���c��U8{�,d2����H�eUUV�\�S�NA$a���2d�c��^}x}�z�m��eeeKKKc��.^����o�Z�l��w�n�n��	�s������g��mc~~~���>{�1>���,**�����m�������3f8T���u�������<x�%&&2___.NGi�;�������L&��msOOO���o�u��q??���C�����3777���_��������^{������[vm�n�:����yxx0�^�0m��
���;��=���m��O��p�e��}Y���������k�B�`�w�~�1���O\��m)����[o���-^��nG���a<�eddp��l������I1<<���q�[�n�:��eK�����k�K�.L��p�V�^�BBB&�?0`{�����
G�S,�3g��X�H1�i��}�������Lv��I�����f3�����e��������k��q�6l���-SRR����-[�h����c��^}x}�����'_~�%����^���/l��}�k�V�6l���z=c������e���5k��u:���l��
�����Z�����O5������#G�����***�W_}�,X�uG�a.d;v�`V���}�����������RSS�T��v'�?��;w�d���ve333kl����+Y�N�>�3f��={:\�6l`=z�`v����YUU����tVYY�JKKn����cXAA�u�KMMe����|��G�G�cee%������~�;�w�������gS�Tv��9���}�c��^}x}������ �a�|�����i�����^��j;v�-�T*���31~�x�Bh4���7n�L&���a��I8y�$*++�>g��M�:u*Z�lYgLf�qqq�0a~��w�w���>}:�n�
����8|��'�{�y�.6���^�za��]����x�Z���jxzz�-�����=.���x���1s�L����}S�L������G9T�����7o6o�����h���??���E���������H���9L�YYY
�X�p!��1c� (('O�t��G��a��%x���*F�R�M�6���^��/����X|������O*���`h4���q�233a�X�����b�W^��s��}�7�>���8v��M�����n�/^D�N����?��������~��g��c��ooo��;�&M�@ �o�K�.Eyy9�{�����sq��Q4o�����t�={��o�8r��_���{���o����c��i������+q��yDFF���0w�\8�Au9:�����w^�L��SJJ

���x������`@JJ
n��	��z���1��'b���h���_����\$!>>C�ELL&N�����c�����`��lFhh(��[�3g&L������������SO�g��w�\�t	NNNh�����p��y����C�g�����o_������GQQ�l����e}�r�����s�=�'N�1���=z�@��=��/��=����#%%*��K4�o��\vG�~���?y�$����",,�A�EEEq�{{{�S�N�kOOO.�9s��B!RSS�y�fl��EEEHOOGYYY��rt...5b---���=�x<��}�b������#�������D�8q#F���A��P("�O?�������7����������F�q��tww��~����T*���������1:;;��-�4i�������p�%$&&b��1w��9s+W������;�`���X�v-^y�TUU9T[����7�|���||��
����s��]�m�m������;�j����+8r�����^�z����())Azz:�y�h4��r���y��FQ*�ve����H������������ �Hj\����B!RRR����"���0��
���u�����\/^�J�����t��Q�;�~�-&L���q�?�-�[��O�������!b�y�&�V+F��Q�F��7��3��w��,))��������z��1���A(�]UUUd2�C?p��U\�t�{L����7n�������C��������R*�b������o�d��;w;vD�N�j{�w;D�>�AF����]�XNN��t����m���������R"�0�����������`z��`���vO�=z�:t���rv���z�s���/r�z�����}������3�<�c���cL$������V�e���l����k������UVV2���"##������baZ�����������4>�N����������q^�t�	�m�6�c&����������a���'h��G_!�s��1�@��@����/�����&F�9r$0`����l6��c����h�j�?>a���Zc�#�x��u&����e,`AAA����guu5���f[�ne�1����|||��_~�Xc�_^��w�>�dc����s���u�����]����h�|�r���V�Z�����1c����������l�y%!!����1�V������j��,Y��������	��dC�R15~rrrXFFk��=S*�L"���C���]��VTT�c'c�m���yyy1WWW�P(X�v��'�%���
G����?gnnn�����d2��O����P1����g�y�)
�R���O?��^��pm�cK�.em�����Qb����|}}YXX

bm��ag��u�8w���������/��dl��Y�=�������q��CI6������/s�f��Y���S�N�����M�����n��U�d�d2��]������l0�Xrr2k��-k��9k��k��
KNN~b���n�?>~Hq���ba999������<���������-���YYY�}�8J��o�f��h�F����]W\�+n���%%%��d5��p����X,pww!�B�!���0�5�����|>���hKB!���I���]���������	?��miB!�1y�G6��h���&�B�*�re��R%O\z�s��,@�����q�8��x�{S+���<��y/8t��`�a=o�����b��=�\��s[�	�-��M�OKFbo�C���
D7���)��xW��s��mr|B!�<D�lB!��
B!�P�A!�B�!�B(� �B%�B!�lB!��
B!�P�A!�B�!�B(� �B%�B!�lB!��#�&x�����|�r��5�n���a�h�Z���3f��H$��b10}:��������]����_v�������r >��
0��M��={���yb���B0�����������,.<��c��[�o[L�\��8����"&�P����P��`�r����?��:r�-�U[e�L5�\^|��Vk���B��>�1O�j0"�Y�l=~��"ZM�.�a�W���T�����b[��D������Pc}S���,|cZ�l0���\�z��]�E����g�`X�F���N�j���P.Fx������&�7�n�Im�~)5�;ca6����w�m�w�"�����-V�7]��=�s��Y�^
��������kz�-`@B;0������������EH�L.���S[���t�{z��@�"���]��dmr�"	�Z�ja���z��7��������a���F�m�^���~��g���k�v��%<LJ���lXZt��2c�tG�9,f�S���z],f���(�xB���`��q�������]��{�nL�<+W����7f�����B|���������v��%Kl����Ba[�g&��w�]��A�o ���j��Vv��&'N�?��]tK��'��i�<�r��'��h��M������"(�����������
\?�v-�^�	|��+�_!C��o��Y�+�;�V#q�7�L]b�Y�z h�<��pk�"�&�������]2���P.F��!THpc��Z�w�a.��%�m�6��e_e+��o��C��0W���}�x8���q�y�����g��c�����P.F��a)��m��e���k���#y�n��e�Y;�V��5���>��U$B\Xr��xf�$�<��&'��W;/$-9�\�gV<�B���k-?r_,!���[KW�c���~�..��0!����$��{O���&�!�nx)1b��������]�����\�X.��� Q������C1yS7l�?���z�X�	�^Rl}�l�bl���#!�P�6���U����W��%��T�G��t�d�~e��f\9]iW�e{9������YM�1,B���!��Q�6��|�;
'>6�_��������/����U%O���D|���8{�,~���u�g��|�	&BCC���_�������0����na!�`A���Jl����c����������
����dC���(���j&�r���L6�K��v�{�o�`�������u��
��q%l��fsq�-x�F�a���������|��IDn�jX
F���y(��0�^��}I����}�S�k�^�m#�P����5��z�5*���Bw���fB��@Z�f�[���-83�C�+l�1bw'��|��
E�+B�G����\�ux|!���l(�����s��n�/�9�Ns���]p������?�|
r�]����I��s�3:����a��j1c�}kM6�;��y���9*�+�	@�*C���\�!QIqy{���>�>�������sh������g9�9��o�w����j����0tA�l��$;f^@�f��� ��~�&��w\�x�7�tqA��=�\����W�q�X�v6�tQ"�y�F���c�����;�'�a���XFC��(�s���o�}b�W������^�6��n�Fv�NL|��K6R��D�l<b+W�D�~�j,����o���A�!''�.]B@@bbb�_yt4�V�M4 )	��4�'���\4@��%d[��d��)�S'��{�����n���t���Z���mBP��0�� okn>\��� IDATLIg����'���0�K�&tI!���������#`�2�4q��r�)C!p����d_r��A]�%P��;�������(o,��RU
E���K}]a���\u�p,j�h���uy����F���K4@�tN�P����V��`�2B���n����.��6*��F]��nG*���7���?��j-�h@NR6\�]���T3OrA������W���n���b�2b�5��bH]e��:>��}�2���K4�jR!<��p����O�6.H���f
4wEY�W�
�����p�p�+����km�M�=\���{��UJlz�+��8uX[��Ef��!�K4@&�������hd�	���j]����P�����30�L(..��;��G��U���i�V����c���o'�u�mD��HO�����7le������l	��;PP��������eV��s�x����	i��P���(�# �����8O��s}��"w�������%�:S~��_!�����>�n�8���^���I����WTU�-��H}\`���7k
�0����C��+(�pj�&�����JM��6p����5M�S��}�}�V���-�Q�%&m5�OND���(8q
B��m|ql�@���U2(�]���}W����	���+PU�iT�J%��tv��j[�
'���o�A������y�����
<2w9�l��C����.R��a��oQ�v�I��X���|d�,2�-����:�\��a��h�	��'	>qWO>��[���=�8�[V��c�l�~����g~A"Ly��_��mI#O�������P\�piii�<y27�R/`���Hw^��&S�	X�x�-���6�����	�x����Q����#�W_�Li������@(�9#%��������8o��^��
�`���;�y�{���S����
hO\�c���/@�x���\���U�A0W������Z21T���H*�*"�?�+ ��Z�|����MxL�h�As�B����iy�;��~�ME������xjJ�&��<V������jv��i�q�h�7mF�C�W�1�3��d������o��e��u	���1l�(���(:w���I(�A$@ �� ��;����{pb�5�m�Nr�������r����!�WI�����wU<�v�d�A8;;��-�4i�����W�Ty�m������pz��nL+)�~�6�b�v�����P�����i���90�k���,�\����9��6�c-�9D�*lW�����e�/�C�"|�:�7���B��L��m�K�}�����m���
���	���C���yvIhsT��35�� v�������3�V�(��V�Cpj�{��b7�~�K�m@���!�K�&�e8?�#��9y;�]���@*jt���zH\��$n��4�K�G����!�Y�o��8���#��o�c�?!����}���ih9�3~*���=�f+�U�O��
��H��P�l1�K�����A[qm��l'?'�yV��R=�%U8���I�M��
f���p
vy$}JU�r�DQ�f{�-5B_ajO�y�[����l�W9u����'~�V�Xc�9@�/�6������A�C�M�8���0�B��j���NFUU��S&��|oj��^WW���S���{/23�����[�O��w�����w�����OH.\���� S� (|W�e�!oQd;0M,�7k�7�_�f�K�m��'�g]��Q�^�8�WgX�l��<2������'		�,�5���?z*n�����Km��m'��m�!�g��=��5�7!���U	S�m��%2&Mt����^0WT�X|7Y��(�@&���	b�������������������7�\��e�;$�rT���i��f0j������9��
�w�]*oC(A����V),.,>���H����`5���o���
r��UC�m����E�������k������q��&���B>,Fd�r��vG��n�Hf�nMz�#�Sn���#H���2�1������JH�BX�*��l�E"��4���!0D�V�r��S��b�����_��a98���a��F61�N�V����
�V�V'''6�����`��b����
77��U��bK8�����P��-[l�!6<�V�ys�������r90op���~��v���1�����)�u�����)�aN����><���i�o����	i���~��0|{�E3lS&	��t�<���u�o,}J�R��w�d��_!�w�x�l����;���������RVs�}G����1���� �sl�
����&�&�����B��	���-��Ym���b{�w������������Yl/Te�*�V�a�F��?m���O}��RT�j��QIJJRs�q���<D$���-��YZ�F���p@ar6�*����:6
�������/bl�2����\�z��[���u���_�N)��T5z����B��	=pi�E�-��v@��0����f~���`��C=�V7�_g{����&$MA����DC.B�y}�w&���&�*Q!U
!���� U�^���������VJ)n��a����y�(���I[2���
�}��E@$�/�a@B;d�.����I1J����'�Q���]����%S�!S
 ���2�2�<�\�'zv�W�;�F;�����B�;g�|��|�s�J��;�;0�}�nb���x�K�L����z��\��w}4��������MlNN��$''�~�)F��B���`��m
��Q��]�l�"p���qU��l��{�����r7Q(l��G�����i�GfW��M��^
l���6(5.�6�Ks
�`<�3����=b���[���?��l�5��Y�;`6�|5�1��{�[����1�]�����	�9t
�����w�S�m.a�{�����%y�JD�z5��	p��\���.�0��`o2t�j��1"7�
��
��g��CEZ6����WOB���/Bw�g^X��������~�^�D��E���3��p��.�7�^BEf~��6��Q��@&�YW���0����i_���1�^1b9�VA��_�������w��;��!�q��5�u�[�.6��\����������C���� u����SH�|Pp>_���[��Y�
rO����MiM�p�Tw�G>��]Lo���U��e�:\���u��c������'�".���Yw�'J��i����]<
V����l��&��9�oP���^vV>����s
���\=���]��u�o�=y��T��o��J[;��y<���\#N�-��la�m���_��|�=�������O�iv�sM���\~�[�.���
a�F?,�h�b�t�[���a�1���M%��,)�@ ��K-s��M?}}m� eeu�<��*���O;�D����>�����-@�������\�}����N����+��
V�i��?�fj\�u����|=`5���G���#��$���P����+,7�R����
<>���Zy|�~n0W�a��������z��z}��W���M������	<>�{r�n[��y;s���g�������YV�����M��w�	��V@_����T����Q�Pn�Y_wG>�-����/���`2X�����]���������I�i�H��w�~t�n�_:�S�+���8�9�2kK#E���M�����2v��&�m4�!�4��:kIY��7������CA��{u��2fe���<�8�h�����
V����ZC�9�&*r+�{|5u��A(/���-�!��A!�J6!�B�!�B%�B�d�B!�lB!�P�A!�J6!�B�!�B%�B�d�B!�lB!�<�__	!��P�}}�������	`���a\��w�8��4�oK�R�~��ao�C�9�}����:Fx����B��s�������M�OKFbo�C���
FO�I���������Ic�������B!�����B!�lB!��
B!�J6!�B�!�B(� �B�d�B!�lB!��
B!�J6!�B�!�B(� �B�d�B!O������a�h�Z���3f��H$�+��~���_|������|������������W�o=ZkY�����U�PX�F�>��
?��-
��!xb<���<�#�����|��Z�J���G��Z��O[
��
|��o��"&�l���)���������������>�1��L����������"B��n]Z��7B}��6�\k[�
�����<i��5)N�X���}���	�����5��NI.Fd|_�v��d�o�~E��4��$BtLx�b�����q)�uzW��l0#}w:.m�t�����-�+�uk�����. }O�����w��}��QklZ�-`@B;X-���;F������E�o�\�}�n��+�����R��cj\������I�x!����K�5�|C�kH��L�������&���w7���L)��c�gY�&���&&x�ja�����ee
>�����,f�S���f]),f���(�xB����'O���+����3f����1W����'OFaa!6n���d�����l�YK��/�"l�dR��?X�l���:�Wgo��Y�6k_�����74����[?�v�P��s��R���_!C���5�Z�+Qu�R�D5�9�����?��I���7����{�t��q{��&��$�e��qpn���|�\�+b!TH���H��{�0�����"g"�N�S+o��e����xz�TH�TH���6-q��~���"y�a�b���B�����F�A�^�@"D���P��@�m�qx�.�������B(�J]����A����N,9	�\�~+��B�s���Z���FC ���pm���
�wc�E���
�=�kW�����h��S�v"�pC\b��Bh���&��wC@;�[r	b�#Wt�D!��������@L��_�'�����u����^?���#Tx+1�e��:����7���j����PH�����M6�*�c�;fl
�'�Y(�m��e�p����3�cX�K ��Q�6��|�;r'6�_��������/����U%O���g��>��	�������+3e��5�.�i���?��aq�]��]�
�h� ��IM���P��]�������f7Z����

��AW�p?����j��B!����d���F�g;����hqf;
�?3TC��	��n
y
�����wR���	MJ6��������^8�*�p��]0��dC���V8���j��5�f�����_���O�������+\���.�*l	��rqF-�_#�������!��.t���U����q�F��.Hz{7��!����q����#�����j	c��kM6|:x#�o0V��Be~�m{�J�cV����&��>;wwJ���3q�1�0�s�b�>�%�y;�]<��y�{�s
P���V���W+l�7B�,����aK:b���H�|�v��Q?y�����|��������{5�|C�����y���o��.N�z��Ie��4���7ph���~+C?q���q���m5�w����N�-��+����
������3��������� �=�P~~>~��74999�t�����q#*++����6�~��0T����%]�,�?w��xi%,U��5���I|�`�-np]
:AFw�Y]|7�P�t�`���D�^
k���{��"\�0�K4�/��R^��m�$��{tk��\�EIP{A�W�34�ja�������FUn�]�S�B�$��O~| ��Ots���\�I�pv��OeW�)�
F��K4@}*^��A N����������V��
��t��.p���!��\`�Ts�����o'?.N����.0U������X��O����u�k�	�Z�%p5���J�����'�_����[3����,W�kI����Wp�p�+�������,$.krY?1����������-�(������&��a|N���lQ��:\�
����,�4�>�xBeeeA(b���8s�L&����c��������7o���`�6|�U��c��nY��vpH|\Q��#�h��<y5��}�'.C��B�&iW5���l���\d����w���;3V��9�%��~����������^������R���*���[���S;k
H��:�����C����M�'~zw�#�����1�����~/�q����s��+�uL,*n�@��A���6��\��<Rwtc��T�(QU��[�Uk�uL*��F�*	���P�g[���
|rw*�~_�B���{`���$��~}���E�e��['�a5[1d~ZDyB(�A�!��#������$����������_),f����&�	B*��H����G��vq�0�]O��J�CoK�p �f�����p����0y�dL�0�1L�8s��E�-U?O���')w^�E5�����a����z>���A �9�E���7��Xj��I�������=����K#��")�+��bW������lL��� �*
��~�k�Dp�h��
y���+���;��n?���~q
D�]PIZ>r�^�������H���m�t{��$_�����#�N+���70���h;�-���4:N�Xk���vF����>��h;�Z����"�|!�
t��9�����k��9�:��^�H�y������1����t�6�<���"�HLj�-+�qxW�co#J6!ggg�����e�&MBVV�.]���r���������ddd@��_fl.�B�����w�
K��,]�B�<~���+v���m���uh��5������J�]���7�P������e�`�o;P�:�=|t
��E��������4�� v��_�)m#'�����Z!4~ Nx+����]������n
r	Z��D.
��0([����C}!R5~�X^���>1t��g(��Q~���qc���
?N����Z�wz`�H]�v�dn�����Z���A�qu�U��N~N82��fk���u@��K����*7B�b�����ZWZ
C�m�=y�Mn��/����\���a7���vul�����_���B
O�#���'l:��s���"�h#�Fy��fX�B!�j5��m7vUU�:[�Z
�����G�:h��#3f-Z����Yej�A��*a*����#[���A�i?�+����
�������"U��jP���q�/�����>[�Fc�����A��=5U��B�W����������VOB[��fC�	���2���5�9L�*�2�5�)��
=���N	�nB C��EsO��<Do�v%"�uQ�^��y;���\��,N��S�$�rT���w��5zh2�k&��������,�.��b�<�cS�z.A*�\�����|"}a�T�4��yz�����Op��'tG���8�C����=�(����#H���2[������JH��i��ey��"����Qo��n�W�bfp��(����mt�Zo}��D�U������[8���a��F6����a�0o�<X,,_����X�v-RRR���{m7@�;w�^�T�d�25-�����@!Ep�p�m9fe������M�U�Trxx�{�_l_��a�)���F')�0�f�s����B��I(����}*.��4���	=�,e0�����K��b�VA�||���i��|�;�����<�&�S��f���y*$K��[�s����������L�Tr���������"T�� ���8���$
^�����N4�(%��yxz�s��y)����,~�r���4����r����B��bv
�B�[���.����B�R�X��� IDAT`�O)�H)x���D���:�6z��	��B��	���%�k���p������G�[�����V4����S@t�e�
\�/Q!Q� ���� Q� Q����5�%"7���R�J-��9l�BHh��-�`V}�	����?E��T<Hh���E��V7)F�B�R��(U
!U
�{���`�z��k}S��)�y���������z��`�z��UXp��bL^�����&���JT�6��#�����}�\i{}���uA����R����_`U����\Y��_��hd�/��O?��#����P���l������:�}D���g5��'���9\���;r�Q��4�2pi�J���&��2	,:R�/�&��WW���F��f�V���W�DBTJ��Yq�]b��{�{�{������QE��!
���������n���=a).{(m���|\myz�t�5��l_$@�����n�L�sK������qv�'xz��0i� ��a�U�������Fm��]��N�|���~�����F�b;C�[�{�`1Zp|�N�Y?
�W��E�������w��������N�L�\���<hs���Q�0b�����H������Y?s��c�����yxT������}K2�w �Y�H�-bE
�T�D�*��Z�����X��U)<�
Q�Rw��X ��e��}�L2������	Y����}_���3��=�9s�����s�j[5�����f��wp����v�V{V}���4?��jqqi�V�O��44���f'�F����3{Sn���i�x����j�T��Z�����l}���������WG�\�T<.EG�Y��Q�5��?SH�5X�����I���Q�	��|���C��[~�����9��0����A��`Lf%�>�^�n�[+�;���^�[�i�]^N�gaF�#Z�����t
��5�y�a���\�i������k1�Ll-O������o��*�;*J���w�(^��um������P��X���������}lG���-�(+�J��!H_j�\��������nl$^G�:�B�=�����bdL�������Zl(G�:�����R�w�b��o<�<�����`\�:���]��������p�n�<�]���v��Zp9\���6�w�
s����z���w��O0]y���wk�����N�o�p=�{e���f���[�Q�����ox'p�������q{��lD�#��V�������A2��S~^�o(,�p����.��3\�%?�����.���i(��Q�e]a�����h�"�y�j�!����V���������k�]���)+��YB!���!�B	B!�6�B!aC!�6�B!$l!�B��B!$l!�BH�B!��
!�BH�B!�8���
!��������S�����b��-6+�����&*Ot�/�E�#5������u���f����o�;�cIW>��u�x��:ew����ck�(R�����/�#�|��k��;�%��wl�����i!�B�W6�B!aC!�6�B!$l!�B��B!$l!�BH�B!��
!�BH�B!���!�B	B!���!�B!aC!�?9�'��X]]�W�&''�F��1c�5k�oUgggS\\��g.��r~��_���o�n�:jkk5j?�0Z����Q�����K�������(��^�m�V3�f��5���FJw����]x]�N������p��_�����m���m:����YM$�GDjo\�N
w�����u��O���W��8��w|��M<Nw@u�uj�f_N���.m;��M���K����.'��x�n�o���75ks��~\r�pt'>8�'Kr�@�Wsu�<n/�.���������������mG����:�<Z���������m��snk0����$���vy����kN�vy�����x<n/���}��&n�j��r���q�k��9%����.�;���P-�f�$yd�:7��]��u�.Y�:�����x�^^\\P� ���f�00�LC��=���������+;����������b��a\�n������:^YS�������x_���[\�f[�Ya��R�u�\����������5�
�v��E��x~I-.���I�F�8q"555��7���Z~�a���y��gx��������������/��mc���X����h~�a���������������E��6�I^6�����;Z��t��p�J92�e4�&<7S�8e��t_�1r�]�J��E�P��\�l*�����d���0v[9���6������7�}Y�H�8��
w�����q��aKn���l�����@��hr}�����ec����k��-���f���}Dh�0n�<��3��G��dn�0��Y���L-?_r-�(3�l]��D2u�/��4T��
7��91�"xg���LnXv:����~�����wJ0Y��7��(jh3l����m�1ix��c-j�/I&"^��sT�E)f���IEyQc�a���5�n������g���S"Xvo`;�>)A<�q��u�
m�UT
K�NU���W�$8B��%������Tc�6��`RQV�l7l����]�)�5���|��jz��}���:P��)�����PZ�j3l<�-s��uO�b����$��x
+�wh��������M
�E�v���m�X���t
&���K���W�xn5c'X�!��YU���0I0Q*{�J��OEaa!��������������a�����QUU���SIMMm�������g���;����t��
	���s>J�uG�};���d���XG����e���^���m�y�6e��T_�aJ��W�f�CT)��thT^0���a�N��>l�|���g8�z���?l]4��s����>��p!����>���`�������Qv��_���Z����1$�NbU�rj
|;c���G�������w������Pv��������K�
��9�#5��c��l���wdI��������\�gk�jwy ����9��/�������6,VOH���n��3'�}�:H�Msz6�N���9y\�D�Xk@��O7���EM�yj�u����4:<���iq��s���!\:6�����6�vy������}����Z���p�7-�g��f`������>���A#�L�<���
�u�f<p��qZ���aH�������������7�&����o
R1}N8+���<���xjN)�:F�5��6*VMD���n,��	���%H��9��^��������c�]����+*$lt���Xrs����v�V��������FBBB�����t�;(����r�
7p��i***HNN�w��~}kZ2
E�pP��
���q�4���o,��mo��+�6��a8l����3"��R_T��9G�$Eb�����Y���:\�F��"�a�k�n+��\(!��s��pt�f�P{<�/xBZ�E���p:�$��P�������3��*G��Nz��=1
�N�)�D��H��y�����J�Rq�"�mn{��x��#5���=�b�)��	���|��B����������\��^/�K������_���sz���Jg���Yyx�pqjP���t��]���OY��z�jH@m��y`d����E
��l�)�^�j�}u���Cl/�?lD�j)�5\���3x�0$���xI��_=������������X�U��)��v���vh�m�hR�����E���7@�?�t��&$T��C.NwI��);y�$O?�4k����jdffb�����$99��7RUU�F���'����?��tRZZ������W^�������X�|(������?�����3V3��{)��k�f�=�j��N����J��=�(��/�����u�g�:F<7����1�	�g���K������~�&"F�A�j�G�3��|�g��� �J����-�l-1�f��"�}����`j�}�-�O�Z�1�Dh�P<.?{b�#Pi}d��W9�����1o'F��cL-�SMQ�Y{�	���3m�z�2����:����{~��j��O���u�~����%T�u���1���i!,�<��������f�1�������YE�#��]�:�S���"X8����_�z���� ����c{�V�r��'�6R�Va*��R��7r>��(���HOO'++���'��j���b��U�G/n��f���q�\����}��q��Af����R�E���n��x���[����������}_���#8��9�H����~C�$��qPs����Am����A��QS}���<����rl�\��=�}1�J��,>x���������2���r��K�{
�A�J���p����q������_���&���Z{O�-�nz��,�2^_�G���n�/�xo'��s���nY����OJ	�LT�:���g�w�	{��Q��w�7���b�QjIN1�)�/�(c���N/�P�h�{N$kW������������N�^R�5����;�^
=�����y�c�233Y�re��������x�|�I���Om������o�/����X�h�����������:������0�����EE���I�����3i,�}!*>���������;�Wg4V�[���=n(�k�>bd.�����CC��uK>9����9���8�}_�S�5
����#��P���6U��t`�6Z5��/�o���6sY���ee�Jxw�?���4���i��
�~��7Ma����r�U�FC�7G��U��9S��=���.�NF��d������w^�u���/�E���������N���p_"�FF��_[�U�4�����T����s?�e���x��r�W�U�,,����g��Re��_(��xnS(O���_�PS�;yx���}�+���� b�����[M2����{�=n��v�n��bT����={�4{�����8�FCQQ�����H�Fc�^�&�8���hC�.t
�WU�c�wv��\�v���+Bm����T_�Q�{
s�t�M�#tX/�Uvj��i�������4j�JPu�#��>T�����4��1��6]��>�&����V�M�>vX
U*���h�r����ym�+�7�]b/��p_!�F7��J��<Xb�����
���*�-!�g0���?,
GUe�*�]�]N�_RX4i_�����b��7��]m
&��>���}���p-�h}��3.IO]��4
��UX#.�����f��K<��dk5H���B�b����%��'�7�9q� *���o4)�����{����.d���>}:K�.e��������8q���t�z�-��2r�H�����I�x���q8��n�.]JZZaaaz�����=N�G����f��'���;x=^�2G5!
���G����7��K�9������.m��sNR�{�A�NDQ)h�zf������M����	�i�����������#)�
�N�Rw�gu=���e��I�)����S��(���~�A��"��q��W���f�g������3��B�:5��08c�o�i���/�����T7���o�p4�E����tl{l���t���Eo����QT
z�����0<�bN�P��P�[����DQ)��Z�����������<��E�F�B����XQ���xFN��P[�I�o_������J�2�%���^W�SPTJ���.3��	an00-��
�]*�Z?�d�r���v��=d>���o�@�Qo"��
��
l�4�U�,*�:�
L��j�Ef8WM�v���{�����b\�E�����d#gN7vY��Ji��7d�p��h���b��q��>��{���LU���dV0[��1[|�X�7e�3��+_eQv�{�m��?��ck=s�7(��p_��}{�,?�#D����"���;?~|��JJJ���`��u��;�JE]]iiil�����$����2e
{��A����_?6o��E]��g�2������e>��h����_���w�����a+���g}g�SGq������P���|u�J��i�����b��-6+�gm�/�+��KR$*����_�i���|�
�wec���g�zzM��KVd����6�p�5���k)����[f��W�����x]n���I��|�y��&*O��.���s��[�&�����~�Q���g�o���v�m��9�
L���p7�0X
�Y����i�fd��SHHK���Pv���3�R���/��X�<R�Y����YTy?���g��Qe��W�n��V��3w�/�;��@XRj��C;������:g���f�w6���o�~�r���g�w$��o��������m�4$�o�h�5�F�Cui�Y������+g��q�*����-7%������])�5����jp���dDr������x��:ew�m^�����H��R��E��Sjs�j�7����=+���*ht*���Y9�q���`	���l������V^����>1�b[#����b[#��y�C����oV��������Q���;��vo�Yk��;����m��=�����������\<>����YX�v�V�H�<��Tc��+J[����;�%�����m���E��l�N���C3+=�����[�gHd!���a*��j���p��?����}�;Rl�����6~^����"�Vk�S$eee��j�-������}lG#�����uQV����$��:6��X+n��������E����Z���-x�+�����������r�pT�}�����D��/��io��l7�u{pT�
DG���
�5�t���p������[G�Fw�����g�*��8=�5.�����#a�|	���RAYQ�#E	?������.�U��t����r���@Qbcc�~F�k4v|�������������k:����������Y[��b=N7���k�/�w�m���.��������K������+���WQva/�k6�B!aC!�6�B!$l!�B��B!$l!�BH�B!��
!�BH�B!���!�B	B!���!�Bq>�_}B!�y%��'f�2�[��A���7�_%�[�y�w3�'�u�Z���5�xPy�[�����);��v��{�O�O��(�����0
�
��r�[�y���R��k�{�(J�?�t���L�!�����!�B	B!���!�B!aC!�6�B!aC!�B��B!$l!�B��B!��
!�BH�B!��
!�B	B!����?1X�t)j��Gy�����FV�\INN���'����_^WW�������A��0f�f���F���x�����e���Q�:�	U:
I�Ih�@<�F�l���M���Vk5�4������S�@����^������^K���x��-�[�$\������J�������qbS�Y���&�g�#<���F
w�����u[:}TH��)��G��^@u�uj.�}=�{�r�8��_m���ui�ry�e$^����a��}z�p�6��_�%wGg�q��|�$����X�����x�^��xo��������������c|���9��Z���������m��snk	����I$��Q�f��Rv�;�����3�����l\l;��}��5+���Y�������S�W�3;
������gmg4��x0�a�f�./�����5e�u��)�>�������mU����K>o�^�W�V�nX���>�f���t.����yMu�����M��la�]�x������l
n7,]�:k;k���5���^����^\����|_�Rcv6���xq�mCCa�l9��`�nX��fu����a�d��.�d]J��B`��i��vbbbZ��{����������c��y��������{�`������0o�<jkky��������g���QXX��3(..f����
���A�zrt��P��$/���l����-����[)G���&�������7���������P��4UtY�H];���^���a�nCc�st�����z���m���m��K���������@�;�"o���.��L��3�y�����G�>Fk�2f����Z�\y38�IDAT��mo{s*j���}Dh�0n�<��3��G��dn�0�d���L-?_r-�(3;�P��)�dn��������pp����
g����L&,��Y��k�S�;%�9��7��(jh3l��VQ),~'���F����:�Z����F^�{8�/J1���~L*���
m���t����f��61zJ��
,�O1���=0�T�9������f����,*\KT��g�����2�nQ1����b1�UlY[P���Y�1
�I����n����,A
k���lQ�^Nt��es�����
Q�G��7�<���!)*6l�b4)�)��5 �T������*��%Zz�Txl��S}uVJ
l�&�6T*x�(-�U� "�,��=a���mcca�����3%lt;7nd���|�������2����/���C����.��p�=�PXXHqq1o���z����jjX�|y��1s�Ln��V~���w�6CB	w\����Pw$��s���hAF��a��ud>�\���� ���
�>6�6��]�ws6`M�G���]��L	a���J�L~��#��/��j�0�'|d_>����V�b�c���
m������/�u�����;R�C�(;����4*F-�"l��&it+�WRS�;�C
\�����q����3��t�7�r�������1�b���1=Rc�xl�6�Z,��c��7Rr�����.H�������L�g��C�O
a���sn�����e����W�v���Z���p�;-����qqjic��/>���?5�
�>�sY'ht�W�aZ(+�0(��c��
E�j	�����y�h�}��TL���s�N�r�aLL>��#
���]p��i�����14U�UcMm���U�����p���9��"l,^�[��r�!]�]fLS3o��KSU\;V}�vI�\.�����j�sa�
w����FG���i�`�HM��c�	��}#7�����p�5�e�X�^yx��;���NZ�bc��iu��={����
���t���((( 66���\����X�����SSS��������i�4U��@E�7���1��5k�X^�����WT�P]l[���wY�)���K�_DZ_����A�$�0��H�q�-�7����7b��t�1�Z���vBj��N�����b@j��:��-��
�S9�M��	!=�8��A������Z�&(.���~�!��D���V���S��F�G���~z��RST��s
O
&$����:c}�w��]p���v~;�S���SQ�p������������cp�=��X�>(���v�����������A�`RQS����f�����s��O��
���Ye���w�mq����������l�����b��U]�]��r��������^��4�c|#������|S!q��o��?���������3!(���;ed��E9����""#�����������5[v��I�~�i��Y�������������1�4�4�"6U��9
����k�98c5��E�G_�1����W�W5�������c�����s�"��B}A��VW���g��K������1�	���k���o�SBZ���C|6m
�O�s�����f������g������'8>��|���}�P�L�FB{��qy������Z��a��)�q��������cL���7{�����b�T������uv��%T����1�Br��e������7��L���c7������PO3�E�h�o�'<FKyI�kGJ�|��
%�^#@|O
��YylVi��\�-���T?�v	��6�MW�<@��4�������<�~CCa�t0���?.�gOX�����u)#���F�n>|��c�����������������z�L�>��{���{�[R������+���2hH�;���}_���'8��y]G���q{�Z#�uH�5j�����"�F�)�!~���w+v���n�����z7��
H�7�F0l���V�u���Tk�m�,&��<ny�NH��#�d�%����A�QQz��������k��a?_�xA��������=uw:��>)A��3S]����}��xo'��s������)F^����%�sK���M�u{�h����S��-'�
+*�����'x���(������?�gi0������Bi)��s�3|�z��G�:^|�z
���5��F�Z�TV6V-/��&��5Mc������LV�\��w�	�/�@ee%�F����C�:�;�=|�0			���?G���Ec�4{N��w�7v���OR�M�;����`�'�2|������p^�������T�>������E���}�8k��5
���P��~�=�S�}NCY-��ln
|'_=��/��I��s�vT:0X
��3�������-���
����t�@J����w�������P�[��������?����W6
9��+0Z���3�����������6�|��������o^������|���H����G{��q�,�������R��fu�� k����0�!���}��5���M�,�]�������lU��}�����M�����������}�E�^fN�MK��>
[���7����}}
}�z�w��&$$��`��@r2����0�l6��:5��F:t('O����i*`��������O�{�=n��v�n��'N����0u�Tn��V|�A�-#�?��C�_����g����<���:�����LI������`�;���C|��QE�)�=#�][:��*;��Z�AbI��Y]��y%��:�A��-D��m����������w*�g����8b����j��X�+�]>���*����K�(�W���M��R<.����Ek����w]��3?����A�B�G��HU
���I|��������������v�&�3�g����(�Q^?u��E�A�������zb{�m
����V��k��u^6����Ds���fA ��E������~%��V��rs4�?�0C���x�������&,\!*Z�6���������{�}�E������o����]�z�����������$ltR]]���466��x��������KJJ
C��w������:�.]�w��J��n�3}�t�.]��#�?[[[��e�8p����������/�0aB��������������f}�'a{�]�/��W=a$�{�Gb"r����g^M��b�O��J�fj��N*j�����D���T��d��QT
����s������6�^��$L�MC��=�6�D��I�WPw������{Erm��_?�4L:=~e�������,:PDQ��z�*�������+�}����!�C�?�?j����,�d �8��6��k�����o�~����M������[��$��3k�[��uj����{��Gtif2�&�������[��GS��it��|��w���^�<�kVc����T(*���XQ`tfi�:��������2�6��Oj���{{P����T}����)-^���H�'�u�=��� j*\Tw������dQ��)�T`������3C5!�I��Y�]�7{��v&�o��@=Gr����hT�����H��\�m���xcf�L��pM
K^�bIv_�mhQ�3�qC�i��_M�]�8�R�n��N�,�uZ,��S3����b��0�q-���{����{5�{9}��n_]Q�NG��ff����F_���6�u�{/����S��C������s�^
�>��7��{�.k���j�R��X����IHH���#L�<���<�N'���/��if��;v0~��V�-))!""������\t�E8��f��k�2��
�_<�lySR4�VC��/9��w���{5�|���?��3qV�Qu��������GS�*���ww��xG��V���{�������/�+��KR$*�����|���:����W�����9�r.Y����U���;�H�^��c���&��[�z�h�zJ����6���5������6�ex�p�l�Bh��V�����z��4����2��U�}�vL�
k�����`5�g�g�;����������$�%�qy(;R��[)���g�Z���5�xPy��m���CH�3�����r���T�jye�;D���-�K
A�U����%����^�Y��
���_�k��bi9k;-�}~�~0�6��<�n�R���3��{��h�
��3yvV�8��/�>:�A�.�u�+������4,!-oY�)q/��FV�H���gf�P{���%0&#������%�{)J���Tj�u�K��36'/�����w_��o'�>e�
��.z���|K/��th�
������S���=m�i��l }���j��2��������')��xqW,E6�f�0j���o������T�6����W�������x������&��ZTi 8�e�(����Zl6�o����5C���Z�Z_�8����N����n_�����{�����Jhm=1�7��k���3g���pX��Z_@���M�|�E+#�}���}m]m�vEJ��q�b0

��~�?����q4���m��8���R�w��#a����v8i�����!*T*��+��dcL���M�t$l�w��\�mO���*�����q�[?�5����8*����H�8W��f\�����;6��,I�����E]��C�e{a�;�H�8"b�4:<TW��FG�Fw��������)��@uU������s�3.jj��:��H	r��y���~Ca����+�;;��(�n����I[j
k;����Pmk��{Y}��>��~��/��K������NY	9��p�Q��V����j�k6�B!aC!�6�B!$l!�B��B!$l!�BH�B!��
!�BH�B!���!�B	B!���!�Bq>�_}�	i,�F,+B!�SV��6�B���4�B!$l!�B��B!��
!�BH�B!��
!�B	B!���!�B	B!�6�B���?�/�����IEND�B`�
hash-joins-bloom-10-100.pngimage/png; name=hash-joins-bloom-10-100.pngDownload
�PNG


IHDR	iHtbKGD�������	pHYsaa�?�itIME�	%1>1�� IDATx���y\���������+�����h�wM���Z�����61������-v3CK��eT�Z)����j��"��303�r~L����t���z�z5�9��rf�y>�y�	c��B!�\�B!�PH �B�B!�PH �B�B!�PH �B�B!�PH �B�B!�PH �B�B!�PH �B�B!�
	�B��@!�
	�B��@!�
	�B��@�oe4q��MTWW�d�k@($BH���rt����_��z����b�
�Z��N[uu5V�^�#F`��qHHHh�xM����z��Auu5���G�i
!����#*++agg��kIII��)S��h�������[����k����@�������Z��k���������e���i�0i�$�1����!�<bUUU,>>������[�R���-]�������F��w��1�z�j�������:�SXX���_���=[����{����/l����g��h���f�edd��m������7��54^Sc�����hX||<S*��_��[�x1KLL��5��s'�z����_�z�}��w��'N�`k��a�|�	KNNf�1�g������z�-v��zc���
��GN�� ::���������FTTN�8>��w�y.l��������S����C��b��HLL�t:DGGc��i8u��������C��[���g������ ����p��}yyy��LC�55Vk��1Z����?~<��?�����d��:���C��|�r��_�d	~����y��s�T*1t�Pl�����(..Fqq1JJJ��M�!���rM�&={���y�B�;w�����l[�j233��/�{��ooo,Z����������{�p8�k+((�����6OOOs���w��kj��<Wcj�����9T�o�o��,X`�w���3f4
$	***p��>|YYY����p��9�������E�!77s���+��B�($B��nqp,++k�-99|>���HMM!==����H$��JAS�9h��y����X-}���|\�z��x��Au~�f{�>}�������prr2o<x0q���?�w���������{�B.��BM��3g������!���Dg���&�t:�|>RRR,�z��w�����e2Y�jrtt�B���VZZ
pvv~�c�����;g�"p��y���:�j�s�Z��	\.���
���{�?;w���)S��p�T*-����%!�f���A��c��5�����j��[�n���BYY���z��e��r>���ju��k���=zt��{��~aa!����N���'�w��������G��_��m���"TUU�����6m������H��������g��W_}��c��j�T*TWW�h4B�RA�R�1���Pt��
|��F#�j5��]��S����h�x��ukt��<Wsl�����1��};BCC�
	!!!

�;����}��]�v���0����C��h���~��������J������@!�E("11QQQ������P(��m��=�����A������
___|��w7n�r9t:���M�M���X-}��

E��]����T*����N�<s�����[��D"v�����(l��*�
���7�9r$f������{���7�9��B !��E(
���<�����!�,��?���s)
899!--
:t@aa!<==!Z=fII	�bq�{���!����PH ��CSMH���My(��B�o��s������{�P�J!�B��4�B��@!�
	�B��@!�
	�B��@!�
	�B��@!�
	�B��@!�
	�B��@!�
	�B!!�B!�B!!�����a0h"��@!��M��C��D��i
!�Zee%v���	&`����q��v���c������/8{�,���1q�D8;;c���8~�8���!�1d��LBh%���D��"::��������Ctt4�,Yx��w1k�,p8�9s�;wFnn.
Q\\���b����D��qc����()
899a��X�p!`���x���p��%t��W�^�SO=x�������
������#0b��HB3��@yl
d��>}���������9 ��M�h��t����H$���b�*�H$��!�B!�YAA������(..Fee����������	#�B!���-[�������#44#G����+6l�())�������P*�4y�PH ��7

E��]��;w�����P(��?��������F@@�
�i��F��3f`��Q4��<f��B�#W�����4t���������@ 0�1�������K�{���!��-�B=�v!�����C�6m�l�r������g\]]i�y�r!���h�\xxx�J!1t��B!�|�B!�PH �B�B!�X����`4�����m�B(�O�UUUX�v-x<���o�^]]���������D3f"##{}j��|�	N�>
>���C����_����:����~�z$''C*�b�������������~$&&������������5��k������?lj.8���x�T*8s��5�$iu���!..����?�B��&�R�P`���8w��b��g�����qqq8s��O����G?���7�.[�7��)++cXZZ�_r��e����>k���~�i���?�;v0ooo���_>��{�9��wo�{�n����|||���sm�N���z�����<��o������u��\����c�����t6������w�}�m��������6U��?������7�|�<�BBB�[o�eSsy��]�9��q#{��7���+���������7;v,�p�KJJb�;wf�g�����������>�<�6l���R)��{����}xs���}S
	6����c���[�b��,;;�q8���a��m�6�����f]�ve�o�6o��q#��:o���z����J�y������l�����������	�T�P(d���u��R��:ub_}�����[���S�l�����z��gO�m�6��1++�`7n�0o���gm�����LIIaXnn�y����Y�^��h�
���3w��>�*$|��7,//�����cl��}��*��������J�c'N�`k��a�|���N����������B�~�z��o��		���gG�i�����������/�t�R�����#l��el��]�h4Z���c�������~�RSS���j�y�
��?0///���n���!y���X��=m���s������\�����_�~,##�"$�J���`�������������277�`�������,55�UUU�����O?e�����+**�D"a�������o��6U��={�\.��v��������;�X�
���3w���l�����������g�����0�����c����D�7o�N�
>��R��C�b����N���hL�6
�N�BEE���l��3g�D```�5��zDGG#**
�����0p�@��=			�p8����?��O���������Z-����V�e
�S�������Yl���4�=)YYY���1o�<������3f`������Om����,,^�[�n5��`k�y�U���D��������#--�fj�������e�0z�hDDD����N�����Z����+���T�2�[�l�[o���^{
���������_�T����P*����5o�u�233�X�
���3w�������a�������5k�����j��C\�|={����G1|�pdee���>��s���G���-Z�i�����BBB�j�*(
�s����-BRR��k�dM5;������w�9r7o����{���'N���Y�������8\�x��wx{{c��E1bD��zT�y�j�<��tO�M�����#G"&&�����:�Z-RRRp���������fjd���W_��E���7o��k.�1c� <<Z����*����3g�D�Z�z�;v���.DTT���ak��/��O=����os��+W��������F��������n���L�!!!<x0^z�%��������m���es����+���������`������������c�����0|�p���@.��<���j:�b�S�Na���8x� ���[T[����������={������Hrr2�|>RSS�u�Vl��EEEHOOGYYY��zT�<Gii)������a<���c���U[������o���'1a��9R��&j���/�P(0p�@���#33����Ri3s�����>�����H�e��!##z��&jtpp�?��m��i���Dnn���/���������Nrr2���p��A����X�d	6l���_����r��}1b���{���a�������������9��-�O�	O?�4�F#�^��#G�`���0`���PRR���t2J����gk�?)2������!p����v�_��p8����s&W���|>RRR�������;�@���h�G�[�n���2��|�2�ry�.�<LIII�<y2~��GDEE�d�/^����-�
4%%%������������_~�&M���������'lf.KJJp��Y�m���L��j���8��h4�XlS��~�:�\�b���-}vn��
�?�������J��\�D",Z�?��#V�\�.�G�����M���}�m�}��A��&M��6l��|}}Yvv6S����������
4�|S����j���;w�����Yee%���?o�����$v��!&�H��+W�UO�X�/_6o0`�����W�X���c����L X������R�XEE[�h������`�h4�������g3���T*0`{�����+j���m��m���\[���P��+W��c;v�`�1�����o��|||lf.��F�
�-�y������7$��j��K/���{�L��16q�D��/���J�������YXX�M���w�;99��n5��y�	v�����K�2???�My�PgUU���`			�1�������'���o�h�����S�-����vc�m���=����C��m}��aaaal��������/[�~=c��=���6|�p����!���
���,88��T��������[�r������bQQQ�=$��r�����l����BBB�L&cvvvl��1����������1��M��c			����9991�T��t�b�F����TH��:���+����\]]�X,f�
b���6UcII	2d�J�L.��g�y�]�~����1�V�Z�:w�\g�������2///����X�N���s�l��~��9;;3///&������x�����S�-���	yyy{��������W�+�g��aAAA�S�N�m��l��������
	:������EFF>���c���g�;wf���c���g�:ub����!���}���l�-�i0Xvv6S(4���]yyyL����\��������Vj�w������:����+������l������KJJ ����`
\\\@!����kTWW���[��������^QB!�!��U
�q��O��`���=~��7zE	!����/�����R|��By��*��C!���86]�X5��	��:��4����21�V��-�6]�t�+8�m�F�e��Yk�u�a��9`�5����d(����:��!���t�)��9wl��s��{t�9:�B!�B!�B($B!�B!�B($B!�B!�B($B!�B!�B($B!�B!�B($B!�B!�B($B!�PH �BH3�i
�������k���0�|�� >>*�
���s!�?�P��
��Z-�{7��P��kww�mg�_}U�����h@&���t:�~�P��S 	���B��$(���W��1S�m���
F��E��(�
�h7�%8�w�Q[�{�G^BR�~�!��.fl�c\���J�$vh3N}��Qg@��_P����Rc����#�Z�v_����
�=%�2{(�z��PY��_�"#�$�zc��[�'�!lv_�	��^�G��?��P���H�ym���AgD������n����A��4�2!��������Qg�~�e�����`#�V�m�w�7����@�5�����p�����q166F��U7[�W�$������Uj=.�Z�_����g����~0�]u����_t�����xH9���k�@���N�Q��06�*l��X�E��n�.�A��������<WM�[[�k�r
�\�l��D���w�t�=��_�H�X���c��1����Y����x�($< %%S�L�F�����EH��{7�O����8xxx`���(,,�g�}��'��	��X��H�u�����AQQ��@FF�����D���lbb�{�L��x�m���{����G��������.\���~���������:�A>�y��+Z<^Kt��6d]�!s�Np%"���T��M-��j(���	�������o�vd��	q�7���Ej�Z��B���p��������k�x��vH�t�����uN..�	1�lx�����Y�����Qp���S+OB ��u�C ����u�N���W��S�3��c~�H4��c���-c�[�a���0d�PH��8��A��������E$T��	/mz�]\���w$��n �R�7�4���B0{{(�$<�T5���r��Ho�Wc���pp"j�Sp�c��t�j��������THh���c�0g�S�2���U#zM{8��������c�lo����]�!���� ��a������xw��}�t^~��[�S����B$�����dH�j�;��\|��Rs�8����5��P�0���*�9b�	�dO��H!���o�G}�s������m,����ez�:vD^^^����N����~x�|`���C�\��	�;W�x+W��[��gd����]�z�i�(����Y����Q�A]�]��/kP�;�������5���>S����h�������\�_Y'$h�������$����`�V��[\w�1�HT�����I����
	R_'t������~���|z,UoH��u�[����������O~C���H���d{k9�:���P|�J����r��AuB�G7O��O|��"���Z8�>��9$Z��������%��y;X���1��9�6��4,���r_{���oF��R�������#ySJ���<�[�������1���}=$0�>	�r�)�����~V���S<�i�
t�%G�a�V���2��n����nv�.�vV��#�8a��<t�%�������%��������;����=S����y�M�[��)2��S�n��0`�����^<���=�9w��:����f^�����eE�j�9����JK!�&�����������<\�v
#G�Dvv6���������8}��7��b����Ri�� ee��Vy�:��m�NN@z:��i��/�}Aq����%�}��v�>����w~�e5Z(��}(�5�1,Ue��e��B��	;o���>m�	��
����j�s�^�����kh�$\!�j}�jt���������w����<�E��R5��j����C��KuNY��[�'�
T*s@���Yp�w����9���UJ����3w1`�@��<H\%p�����2��F�����(�,���y &	�mzy5��m�7T*s���s��/�������<U���s
�{����S����m����eUV���17�]cS�]����I������F{'>��k��Yi��8&�]zI�W����n�'.*�f�[ceL)��j:�0�����X�A������t�Vc�O�Ux��f IDATR($<�����=33|>��-Crr2t:����k�.����y�{zEE��

j��	�??�		�GGS�2HK�X����"\]�	�S�Z����}��]_P\���A�+�m�?�=~�C�1BOgTY.�U������������`R��4o��]�\
�������z���B�������.O9�E�*���C�NU�S�����WPp�:R!;y����4���d�2��4�T*s���@q�vr�}P�[n:p:���B�"�c�3�z#�/����
L���	����,��d-8����BUdy��(P���j�&$������9	���m����a��(2���c��W�=��%x���\�X1!
i���NsM~BL�?w�|=�U���F�������c��u�1)������'zL�o74�V��^�G��q��%���a����K�����k��o~����8���/����~8@$2]���z�BBL�'�\zh�zjdc�5>��0s��������2^�a�����q�^�?�f��P�������=8��AIR*��������#�;c��{�������
-�oBy�<�.�m�����4X�u�����LL�i:M�������3z���/�����$��=6bS��H�r����xwl<N�s�p�l�%B��	����B1�����9��Pcf�s���C[������c�[O����"���lq���)T������+��Du���������Nj)$�88����?��m��i���Dnnn�Q(L+G�?���>�$KJ�9sL�#L)��j�����D��,?�w]���M+>>��=
�
p-���M����?P�SFA���C�1z�
G��*����eui�g�>S� G�o@\�����kb���q}��`zt����Z����r����TsUi���[�����/|��u�qy�^����xvc$�a���U����Qd�
�l��ZYZw����;p}�ut�����8:�7�FT�V����~���o	�|}	NN��qxl��JEU����T�d�-)����))���w����%���Pd;����%N�P�*x��<x���c�Xk	��I����|����������6�q�������KSd��C��__���L������(((���a���D+��7Hj*��gZ����{w�}�nY�uq:t��ww��TV�V�z�e���"����v�$5B?/��`(3q�`�*T��n����� ���=Ie��T�fB�����2S(p��R��[��L*
��}W��S��x���V|k~�;��n��~(M����vNT���+.���ZY��[uwP����.�B[\rT���!r�5������"�R �s��Im������UJ-�n�S��������}c�Qp)�jJ��`�M�)��!��V������y�O-����N"T���>���UV���B���v[���������o��]9V{!=�P�Uiu�M���gp��8��$���������^�eX����{���Z����,���������X���?H���B��G��__ZIx�Z��J�Buu5�F#T*T*���1v�X,^�Z��k��EXX����7xJ�)(,\p���>����F#	�e����ia����x1�����V~�X��t���3�u�l�U�����thS3���5��W*�k�4(��1��1r�G
�<�CY9���-�5�S2Q�����/����'�?v<r�3����#�}TX�JGX0te*TZ�B>���w��w�v�E�����X�^*I�Fij6B���_j����pc�s��#��vT(���m�b�y!�<F`d��J��.k���
R
p/�����@*D��p�nK32�DvC��`�*������GHDWS�����������oAT�W���a�������o���C���zW%ZB(@(�'����@(B(��6�����iT{@^J!�S1daS_�b{�����Y���Iy�����r����o�sP�z��h������w��WL�X��9>�%�Z����F������������"=�w�k��k��8�c!�.�Pd��31��U����`(�r!�q!r����1������L�S"	��i�Ob�p����O"�6��)B!��c"exn��N,�`�7�X[����
��=��2#J

O���a�1����#����?����H$�0a��=>���� ���:t�oF9�?AP��h�d ����Z
>��3f��FG�W��R�)L���mjwvv�2}kB�7}k""�q����A��8!��
�I�Bp|T:���y0�M;�v���.�rg,�]*��p�x7�������K�a��F�R�������{�#����\�\�����>��9����O�7��p���:cy�G�Mo�X��Q������O�21�V��-�
��y`H������+�!�P�Gn�^m:�z��{������s����&�ZY	�X��
'��F��;�j��t�+8��]\�\0.q���pq��
��#t�j�rx
�s���n�S�:��M�`��C�(�����G,������0_�F�\/���(���7N8X��a.gm�}�)��H^w�zU��P�T`���P�T q�����A���8��rp<d��w��Q��5��>kX,Fp��+��T^w�6��Q�h��p/�h���+M����;�/��/���m
>�~��5��!s����x�s��>{�}����FQNVEQN�f������,��O��a�3�\�`U�U��h�L��PNj�syZ�2y�{0�os
K6������F�����ct��.�$��+��_1La�����h�Wma/�6���AA��{ ?��y3�1�1�>�Q�8=��QVl
o���#dx�K�.e�f�($�����x<8>xAsBB
//�}eM�r8�K

E��\\L7*�^&mNH���r�V�/X�%�5'$�C��3��j�e�V|�y8BWZ�����5'$��6��0hu��M�A��\���-moiH0`���������<�<��,��NS�AU�"3�U4}��9!����d�k���
-moiHx�;i..�v���C�l��WsB����"����R4]gsB�����`eH�{Z�����A���?�`���%%�������x5Z��:S��C�S�Hj����&���
��[K���q�:�s{�%���V���j����8G������'�B!!�B!�B!!�B!�B!!�B!�B!!�B!�B!!�B!�B!!�����
$!�B�E�!+�x�t}����p�����������A���eR����?�$Mg���k�5��\���Ym�u~���e�w6]���[J��a�_l����y�����gax��n���?X�#�.7B!�B!�B($B!�B!�B($B!�B!�B($B!�B!�B($B!�B!�B($B!�B!�B($B!�PH �BHs�������J��b���}������D|����r���8B��_�0���
U�A���`���8:�����z���Ng����3!��L�A���Q���V���.��B�L[���G�H�_o_QH��D���?k%�*M��kQ���;{��!0j�Q��4�%�V��4$mb&�;��Y�B���h�AUiU�!����0hu��}7���BG	��
�^�0TV#�����?	�������	yxzv����^����Wq-�R�}����~0����<n��Z��p�������-t�j���:��'?���~~�m���qm�u\N��`�D�~1�����������n�������O�h`���Z�;`!/�����n�i
8�;�����$<�����0��8�%��>�����h`�nU�U�g�
����b�g�p����R��X/��U���+�p�J�B��C�c���'��=���q0=�F��U%��K����z�K`�3��W5vnT��gu�!�����`Z>�F<�{�nL�>qqq������sQXX��>��������������7onQH����]��^�	81d���#��r��:}�����O��Y��"��,��o/�\8���Rh>���3dk��������MK`���V~�D�u1�H%(���N_���gS-�	�|���������D��H��#kex;�{<�y��Y��+T(?{�Npp�0�g�o����&���RV_"D�u����!}��z�;�.�9e���'����8�wGr��f����Mc���gW_"��u/B "uS�@���W������Ip
t��/c�N��s.����j\��$�X���pr�A�j���a����c+�@(�c���JH��Ro�����o����g����;F����� �T{k��:����!���(�6flzm�����k����.vR>�n�	x_��x���*<e���>�����j�����N�CiAu�!�����A��|�d����nj��w�b��@�$\��
	M�]�/B;����O�Kwt���V��P�l��H�Eq�������>��s���%����Y�>��Y�s����-^pq�a����($��`�����2�w��yyy��30i�$�����J_o��NDI��0\���+��t�������P�[�������z{������(��+�0�����QV�����������n:���yp[�f�u]vJ�����q���
b��i�Z<^s����s��8<��9�q�-�������^�{$o���/`�V7��ZR_'t������~�\c����
	���p�����Q~�p����h$�cv5��Z��rt����?B�u�����������y�������Ty��
��I����qs�U88��7b��T�kMgp.Rt=��� ��G��!X�����k|nix�!���;��C��Q��2��9�0p~_\�s��vk���	sR����y5���W��S�|��M�a���KCpt�M�usD��x�g��L�YR'!���duH2��s2��Os���T������8�|�����b��,t�%C�0�V���M��;`��%��>�N<L��cuH3�k��k/���������;o��A�������W���		l�����1�m�'zL�{�����k��a��������+W������ps���7���o��f��a=a,(�
t����ok>��_oO�;�j������k's��;�l:��ye���p=�a,(�j�a��/(6�@s���>�{�7���o����b���2^C�:����@y:
"/�y�4��>o��Q�E��_[��\�a����;}����x���U����TC��v',��C�S���V������� ��m���!�v��w?'T)�P���~n���gO��<��,AB�
��RO{�*���M�T*s@�;�s�����;fG?9��*s��3����	���d�5b.���M�%��@YPi�~���R8y���'�F�3�~��=��Z����I��_KJ�����R��������?��B��J��z��A�4�\9�BpO)B�U5��)��U7�oQ�c��6��� 
�E�q3!������I����dff���c��eHNN�N�Cqq1v���~��!++�/����al�"��;�E����:�����/���!]2��=�\Wg('DCw���������������(�|��7��+�E�oL}Aqm[^�!�+�u�k�?������3��,w�������wh<�mL���KZ�����)�����XY�4�i���2�*���}6�����!�
���'_��Y��^������r'WsP�z�[��R��E�����5�.��.����H��7�9����g���^a~8����=�PY._W�j�y�,�Pv[��>�(�5�..����8����l��W��V��UaGO���,�)*�m�����p��4���#P.������������M�����p����Q��t5�MI��4��aK�l�o��*��<��Q�k

��v��8���Q��{lsi������`����^����,p�<i��p�V�^��;���KHKK�����^}�U,Z�������X��#��k�����q�=�Ci�Tn�[?��������p�"������Xo�r�9UdBs��C�Q��=s4dAq�J��[ZcMM��������
-�oBy�<�.�m�����4X�u��n�M��i
:N���o�E����-y"�C�����b5�b��.�<�����'��+H+���,D���NF�7{����u6��Xv���N5�y.����t�
G����f��Xkl�����`�{�x��8�9EN�
��6j������r��)C&�`��5���Nep�;N����R��h
S��/l\Q��L�M�����RLK����7o�6m233�j�*(
8�����4�������y�aFE98�r����z�������2���������/�\������{(�2e�GC�k/��L��xE���K�<gS����O�)���������B���23���<����^<�<�{;����%�%����L���;!1C��� m�a\^����-��	�D�d{kU)*a�(��&r6��-�{��O#���� xb7��pb�!�F����r��v����]�xi����Z
+U;Z������+K�?��62��o����`�m������7BS�mV���V� q�|�����QUj:�]7�$.��C��m��-��y�0�������?'WO�V��Fl_r�����L���L�������.p���ywa�3���{-�_�a[R|����kW=_~�	�\�;�A@�mL������'s���
�'��`��|������v|0�x���M�j��4""��/��Q��>��^��'G�2S(�wS��p��e����^o���o
�??p��������zy��gt�N���\7�Z��#mj�~^�99�P���q��`P�P}+������k*�$=����J�;?O����/3�����W���U�M]� _���d��V��Tij6d~.�s�����>r����JT��{������Zh�k��U���!r�5���[��:S��������?���{�J���V��6z����
R�b���\�
������qfym��c����{�g��k~j!��;�PYf:�{w��VY��[��?oZ=�V��v���K�`�64��Q�JU��O���2���]w'h�:���2pZQ�5���O���R���6��tp����gk_;���VUi;uVk��zE��!2����U?������������c�!���.�4j��X��!i�����$<��0v�X,^�Z��k��EXX6l�������{M7�]�p�Y�)��>�*���\p�Hc��v����Q�8��z������d�cM+<$���;{���P]
���^y�����x�Ts�a���;��)���f�m�k�k�� v��������#`?j��6�+e����x�V����P�������p9�IEh�2
����W�<"��Q}k_��N��U�����JS�-U�����l�.���]c����3��G����P@�����h�B�y���>Pe�@�]�d{k���(5}���@*D���������Sd����
$����E�����
O��)7�lU��w�sx�S;��E��0�r�(���y�O����B^�.B�b{���4�\v����Fu0�9?oB#:�Vi::#��g���R���a'�C$��/���D2�������v�9�Y)e�JU��;����N����`��v���r�1o4�#�L���=^x�#~�x��ER�2B�\@,3=��qp�7�F�7��G;1�����#�L�������HOV�4���:�R.\��� IDAT�2�y.��a���7��Y}B�������~�vc�{^�i�=��R,�B"���F"3=���Q�<���)�p��/��-B�y���Df:�{��m���(������<��@+	����/0a�������#((;v�xh�+'�y��)o��j�*�(r9������@�F,vm�kq:��C=���G�(��d����B!��B���V_d���>�$~�������:t
��?1��#GB�s{����|<�	���Z�����������(=�����k/D�
U9E(�{�������
��io�c�6aH�����\9��pa�OyMN)��MA��"������P��_,�^]�����l���I�bt�d��O�E�����)�T9
��{
�j���C7���u/��Q������C)J+����c��#���c����]��/m������ "��X�W���C��������FvAyN9��{�j���
�4/����?>��[���v��!��!�����M�8��m��4G�~�~(�������l����,�(��'�"�P��o�F_m�7�.b��g�.G!~��[o[]���������Lg�mN�8G�!�^(������&���X�
�_��m!`F���?�*���T�����2y�}1I�F���a��(����4>��������d&�BV�5�����R�Up!� |�W�Q@������(RP�uA�7�� *��"H&���L&��oL�8MH!�������s������:�L�6>�Z�n�r��e3����f,I&$\�++Jy��
�k��������M���~�2����a�2��xk#�������8�X��D�����tv�c��vw�;`����*�j5���gvV��vl'>���{����Q��.���\�W�P%��65���ow^N���K�N�~����mm�^&�;�������e�2�C���G��������l�r��<�Li��>>��������I�P��OC������^�%�C�k��i�{/;�v���1�c��`����JQ)'�b35�T��5~*r/d�����!��8��e����*�c
X�����������anW^��u)<>�������5��b�n����AD��U�c���s�=(@C�[c�u����K�]���X���������H��L.Tw���!w��$�kQQQ���]��rU�1��r�2��"5:J+���~b+��������n�l,7�5�l��c������x�����ns�?���D��E��t�����gt�]T-]~w�����/�awSn�!:N�IB!��!�BHHB!��!�BHHB!��!�BHHB!��!�BHHB!��!�BHHB!��!�B���_�B!D���@v���y���������2�K�y��yP���5kYh����c]��?�c��L�����3��������\�����w�t��H�U]�eJ~���3w�o�t����������������r�B!$$!�BB�B!$$!�BB�B!$$!�BB�B!$$!�BB�B!$$!�BB�B!$$!�BB�B!��!�Bt���OE��f�z�)����h4�=�i����x�"//���r���1�?�����;�Y����F��C=�V��x*�iH�9������6*7�sj�-���=w|���a��#�W|���
�g�u�Ml�8�vNn�K��/N�^�g����d���h�x�w]�).����I��������{C�+p��+�.��t���/O�N�S3r�E�d%`�:�v�1��x���`�r��CH�J��psd�Iv�:�����>�N�%3/�GVV�7����m��k�$w�Gt�ew���{9���O��Ke�=��qb�	���ew��3Psu�\N7�Z�u���+g&%+����������w�>"�+f��sx,6��C�����{������������n�Sq���\��������|�����������^�����_ujT��������g�68B��f����p�f'{�U���"���}�
P1!/�^ZP�W��p
��L�_F0M�.��V�[k�:�N]����\N7kT��]�A���G1$������m
����[Ch�����D����������j�7/���3��l�7(�}(g�t������U&�7}��'7�����Q����mHBB;n��&L&�g������z���b.\��/���	�����3}��`���L�<�e���C=Dyy9��_;����s1����Q�HY2
�!���o��s�6P���������������tu�?�m4z���Gk�qx�������0k�z��hC��|z�}��e���j-T����EL���a|>��>1=�	�A��b*3������Q|0�K�z-7,��A���0y�XBt|�����]�EXb0o?��W���K���l��z-W/������_������@�f�������/��7&��
i7�q��7�-�_4�2s���0t3��������hr6\�N�����fH�}�HD������5�n��W��R��o�����+����F�������������2tz
ue������G�4 ���@��p���	0h����Z�|8I#����S��3%=��
�	���)kj3$��VQ),�0��J;�W'4Z��EitKb��G����t�lH%@�����nHh�����Sal�osObUs���I�����~�����
I�UT�9�	��}���OV�V1sQ,��V<|
�
�~���J'VT���Eq$$kY��)�j���c��h�**������m��!D��O�aVxhQ$q�j=\C}����|O���q�x=s����1�WJKK)//g��-��������K�!�����o�������;w..�����,��})))���$�7��L��r���h��|��!�������6�0�*.�����gqYm�N?[��.�8�7��Rw����!���jH�I��>��M�1��wO}@��c�2�U�E�~n�O�cw?�������w�6,�B������X���<m���`�M���i��8Z�9�(\��%|�� �����y���T���,��f
�+$�&��>q0+�VRu��3J�Q1��������q�����a*1�es.���+�_�����Pu���������4�9k'�������>1����L��Zo_^�X���#:%�������Z�Y
Q�\6m��!�����:k�2b8&���I.���9ioRv��[���
a��#T������J�����y%wv��2W�$���C�f�3tL�Y��O	��p���o��;��q��~��19�xf�q.�a���������n�>������*��G����D�tV3��t�����x
��4��������z���Y��x�I):�WHC���$<J���"�	��	f��gp���6�v�W�M�=7�c<���y��0=\Ci����35������x"��&���_\||<����y�b�@cc#6����0���DDx6������{��KQQ555���������Ff?le���P���^�$D�TRu����7��X)�����wTLfo,e���p*�BzE�O�RR�f��8,6�{F{C�>>�����_8�
��&�m�����%wn7$g���.93S��~�/!�W(a	�J�,��w�P�����K!I�I4�5x@a~!��"I��89��:���E�1�O�����G��������=���@*WR�c��}�����e��X��,��P�_����cu,��w���S_f���Wr��vC���v������������+��=�%��\9=
����
~��6�n7�f���������n'�q:j����qe�q�n�0#������q=�!!:^K���:����v������n|���@�
S�'��q�p�e�����w��s�q�apF@�m�K��v���e�^����Q�;��b��xsC�y;n��.7����'y��'Y�j�w ;;��Hmm-iiil�����:4
�?�8�w��n�SYY�k���e�]�����Eb�����U{��.$�
���{'����YM?��P����2O�Aqa-B����������;(�q�!��~	|6���+�!�������U������qz*|��0��=gfq���s��U��������/8.s�������;�?CB��Z�	I�T�9�E��@Q���������?�$ix"*�'8�>�u
?;y��������>"��I�/���q�����-o��� LV������~��;�g�}rN����
��r��$z��ofK�����k���d��������QG�AM�~A,���9��'	�Z�����i���o���&E��_�2���.:o5$&k�ovs��<��f�
��q��8��}�a��}dee����-���V�%77�+VPZZ�-7n���8����7�|����<y���CG(j8}�2�NO�T���k	So�r�$�;���3��U����F�V�������MV���S��)4AZ����h�6u$��J)�q��.���O.�g�Vk}7�����?�O�}��M?�b��Z_�<����s����|�M���)y�D�@
*���#���h5�>������o�r}�
T��M��p*�h�����J�x�jo������C��q�K��t�*R�CIL5P_iC��r5�d�brb<f��C#� 5��K-i��l�Oa��J�m������H�T�����!�_��M�q�YV�{��-�O���Cv��a=���W9������������}�QQQ,]��y�*0����}����97n�w��w�����)..&11���u�6�	�]��;Y����~.6��W�����	[�]��w���l�M�-W���)��+��X+=}tj�1����+���#����������n�m"0<�7�Gz^[��7���E��1l��)_�����k������H��icu�O��c���$w�o@��J>|�C��u'���4�{�o�{����/������}���2(�wX��ym�n^�+��!�C~s���u�$������������|��#u-�����V������&��x.�^w_2��5�����Y]]��~�C�-7��%~I]��>��;�Y����^��r�����nLb��2����2\E��99����������*��9��?�� Vl�����lz��K	��	f�J�y_������?��;���7�x��(@UU�v���)6zv����G��PVV��#�x�,���:��
�H�C�|]/dHuf���~F��D��������3U��Hpr�A!rH2��FL�-�����Vo���J�A:��QXj,���8�e�9_�%�+�LA�|pK�
k]��K)\�����a��owJ@8�����p#����!q4�Y�)h��
�����|�k7���s?"��J�)�isRy���Ep\s�j���o��s����+[�e���lT��ch��7��3G?)�HH���-����D'0D4�C�h��Q^����K
����n)�r��>C��}�>�����(��]���^�X���Pz�J@���h�9�c��|)�n.l�

b��n>�}����(5Q���\y��,)�i7��6 �J��6H�[,�}���B��ba��I,^��a�������p��	���x��������?3|�pRSS�����7oV����������$22�c!a�1�������(*�!��y�S��_�]nb��&��>�	����������y�7���Z�R������EQ)h����;q�<i�w�%��!�����@D����wn��4�����yC���MS�ky����Z���uj�B@����x�_����R(�WA��
�~d8�JAg�re�P�\���N���u�y+�3���y����l_�����G~��R�t\�w)��������A������Z�&�$��<}�7��.��U{<#9�Mz�{F�y�@
�Z��y�b�e<��Dg��������}���d�#{��������0n����o�
��;R=;�����-6SS��YQ�AC@��N����$�7Cn�\�*�WM���>2���������/��=xnp4���/��!�@���`5�
�
��=��sTv"�o�m������y}yG�g��(\;�U�V*
;�FE���qtv7�n��P��{L�4\rm�S���Qv���"�n^2�����T*�{^+
\���<'\�zY����2����m����67���p����?5��b;���l�AA�B��E�7es�
���WX�.��y���ckQ�O�dPW����y������
��o����)S�0e��a��
���U��8q"*�
��Lff&���?x��g?~<���h4RSSy�������o�3�7=NB�;(Z
������5�f_M������w4�c�|����g�O�=����o�3��j����9o��������0��c��d��{�u����ss����1$�|2�_�O!0���j�i����k�5604�Bj�
|��G����6]��u����8��	����s����!���jn]{��w<�s����7������3�n6j���;�Gs�/��D���#[���9yw��\�z,��\M`x _���}�����a�k������pQu��7&��w_�/�������e&���=�}=���8���8��mc��1,���V����d��\��*^��!7��b�������<nb�����/���}j|�4���_��hfDv
�F{�znF{���L�4�Uuw���8�^1o������DC�'����Ja���M&���M��1�F+Wd'Pi��{��6��8hb�������V�G�Sq���'~���}��x���n3]�����
c�d�Pn��������V�O<�Ck/���I@�
����q��������5�����������pN�|������{hy|m"��������C�p�����<�"��+����������~����;!a���L�G�/�n����w�J�N>�j!sd 	=4,\������(���JO(�KTs���%�����v#|��n���o�RBUUj������V��3��(\V��s{��������2�����j���c;��n�(*��4�?�v?��S����7��:����xV@�����<�<�n���V����J�&8�@cu#vK�g9AQz�N�������~��3���a�z�Vg�}���4�l4����n�q��$��N�3<>������������:��s��V)D%�hr`�k��=C������2%�s-��E�P]�~_��b����:WAL���EC]�����RNt�c�qwOI8�����QQQ~������������y)��R_j>/��P��0��;�7����U��Ze]��kp�����2�-m�������h���������s�����8�`%] �B		B!��� �B		B!��� �B		B!��� �B		B!��� �B		B!��� �B		B!����)�B�V�_��d(��t}N��q�����.]�]�u�*��t������"��3�s�����.]�����H������=���]���H5��.��r�K�y���A�t��n=����;����\nB!��!�BHHB!��!�BHHB!��!�BHHB!��!�BHHB!��!�BHHB!��!�BHHB!��� �B�����S�MMM,^��Z��9s|��l6�/_N~~>����t�Mdgg{���f�z�)����h4�=�i�����v��o���M�x��P�:��T:
=f�BDV\V��?�t�G-��Er�-������8���<�f�2��l�Q��k�������/9�4��y
�Y���)��
�8m{]���3�!:#g���m�rt���."&�?wL���=�%�
M���jF�
��t�����m����|�PR��[�|��_o<tV�:���������n�Sq���\��������|�����������^�����_ujT�����	�U���n�Mj�3O�8Fc���.@ab^,.����j�m�A��wcH�zP���IDAT����L�����}V�;�:'�E�r�Y����'��EYz�7;�����Z�2��`��%��w��ruN�S�Bq:��um����?�aY8���F6�2�p@�@-������y3�17��w���<-N',Yp�u<<B��35��l���9Y�������o�W��[�L���)}yy�t��m�����3a�p0�a�6X�8rs[����� !�o���#''��B\\\��p�������2w�\,>� f��{����n�	������ihh��������z�QZZ����)//g���g.\}?�zr|��Q�I]rjC �����s�6P��P��7�7����^������M���O�@�'��������'> ���B��q��[�8�z{���~?���o���64���'�'�=��`��P���w#�D��|1u�_u&��p�����k�/��y`��*�D�������.�
:��/V8�y�������2tz
ue������G�4 ���@��p���	0h����Z�*|�'
� c|O�O���:��3wC_�*���m����6�:�~W�O���F��a�T�}�����d�**����oN����'O�V��E�tK����K�j~����
��������!D����B�"wQ7b5,{�w9��kx��x���ydJ����~�:�o�&H�PQ�l7$�ms7�C�y�C����"�M�����j�|�����\7��cj�_uJW�v�� ���2�iC�J�|@U���W8��Vxb���
�>����x�U�����p��CBz:l�z=���T*��C���+ :-��dx�a���]�|?3p �S��HB���aK�.��/�������f4Y�~=�&55�s0v8x������{)--����-[���gOL&K�.�		S�L���n������M�����6�Q#�FM���l�E�{��ZQ����4Gr���j#�G7����3{!�c��^�So����B�!)�>/���9�-��8��[
	�Q�O�����+����1�����
��j�<���������'��V��|/���[�>�GF}��:m���.���Ei��8Z��X5*�y�oH������9�yu�ze�0pLb�gI.���9ioRv�s�Ukn|l�W����'�i����}=����n�����X���#f��1&����5���R���=�gr�f�oo|}N$+f�?���1�m�����M�7�H�	�L�&gV7oH8�����rBY<��A�d�	>m��x
��4L��H�	��`Q1iVT�����8�}��;��)5��c`���3t\>&������DwS1��
�'�:�0+�E�PZ����L��vj��;����4Y�3w�h�=���*��>m�^)
Lg�T����(�2M�"$<�V���8����s����Y� #��i�mJ�g�`�8��w����i�<!���{�����3�`���c���=	��-c����N��kqqq���������)))!>>����{��b!<<��z����L&�O�~���e^HSY�7 ��KP�8���l��7��4Q����&��&{�5y�Gb5V��1��i,��������A��������Fp���!��p�������_��b�`�N�����O9��d���3�1����x~1���M>�y��Wr��������C]Y�7 �/'�W0�	��������`����|6��=�j:����'�dq��
���/�-��m���,�s������Wa�u�������rvn3������M��{Bk5�2%C���?S�i5>�[�g�;�����������W��m=��L�����
f����k��m���cn.n���8�����5ECp�����wZ_��z.t��c���?l����@�f�t�X<#����H��(��VVVFLL���S\�wZBB����'O���O�j�*��y�������,��tq��+j}�e������JZ�T�5�����=gC#�O^F�����q�!��~=�n�R��/(.k�������;�R�[������_`�����q�!��~	�Oz���f`����d������<I	��c����g*3{���4tx^�T�aqA�*|O����jK��
�����>9�uv�m�A��s{��q����S|���g��`ZQ�����3!Y�fG���2�����h&d�DQ)��F��d
����i-�Wz����aLWy^��P���&����Lwg7���
��Y�UYVT����#"`�$��23�g��5��`�\������z���t�V�Y���n�M����#++���\n���n7�&M��G%%%���Z���.~z�hO����^��P!5;��<(��B��b,?�

 $��!��U����"u�n�R���N�����E��SGQ{��S;�����V�r�n�?�>����l�j��u�������})=T������v��xN��G�y��oz/�����r>�T�%�*-=����Y���m2�����g�_*)���%����cS~k����&K����p���/w�����@�}}RUTVBP��\�N����9�����c`��^��T|����S��!������?�t�iSfx8���;��j��|dd���w�}���l�/_�]w����>Kmm-#G�����zn�:r�III��������4���(��!��R}�a����(\����sx����#�v����p�����qN��������Z���m�"=57U�>�����kx-����[o�w���[�?N����9���������n���{�����e�OK�
}��7Fz^��}����>|��P���������%����kCybcO��4����.�O��6�%�Y8�����n�/��p_n����#���^}u�2�1���i���
�����ef
�^l�6��s�_i:o}YV�fJ�g����4lz+���8YCX����.R�Tt�������b����sJK=�2�w��$%��w��+Wv���_SH<x0'O���������{	�wo�����w��o��
'N���rq���s�m�q���{���	|����~��	L�E�B���Qg������>5��A)Tl�����^q8�����x�UP��������E���E��E
����SAy����b��[��t�u�����{��qD�N����|���� "9���@�{�C�a�k�����Y��&:��!�9(�Ec�����o\j(�E�wKa������{���[*�[
���//������!�
=�_���7����Z���$���Df?���v����9��@V����+Nz�jI�c���s��C���=O��������R����SA�������K���]����.?w���Ca�<��>��s�bll�{��0hl�r������������f��r�h��������t�O<��%Khlld���L�8�J��ba��I,^��a��y?�d���9v�\p_}�U��P8mH�W@��z=2����z���d��]n����Qo�bk��la�b�i�V�{0��sM���k3�|�K����z�����	�
��_��G�������1 �Z
�����cW��/�Vo�h�^*�GD���0�{�;��d���sLfol5f������u-���
E����mf;n7��k����P�����[�@�aT�0�����jo^g+��EA�S�:�K�{c���wk���)�_��G���_����B��o�����\c����FA
j��;
*{.�X�N���
s���[��m�S_���T��������*�:�_���7�]��pmv$�z'�n�#P���u=�y�|���m`ipuh~�T�7d��P���-,X���
����q�����G��!�[.>���(�	�A����9��������l
�.>��H�^a��(������&o[��7.��QW�����i��`�\*��<�����['h0��yg��
f��Rp��kw�����J������h^{�Q8�CY[[��������oP_[����		��������Bq1�,�gfBM
��KH�t�����5'����lQQIII���+�r�-���a����o��?��}�v
�2e
S�L��oEE���~�w����(Iu�Q�*����9/4���>!!01��J�v��������:H��le��'��#k�m�1j�t��[�J����|=�
����X��m�������k�t�$lu���t8�Ml��O���7=��O� 0��2������k�3��}!����Z�K����Mc�_7�V����������l�(OPX���s�	���:5F3#�S�6Z���sC�s�mg��Q����V����yc��>�O4�����,�!�yw���Rn�����c�06yCB[m+���"1�:*Kl�Z����|I�i0���-��v��������[��xd0q=t�[��yk}���"� ���v�w�>-�CHX��k��i�Q��Qft06;�SF;������8�X�{��5��_l?��8����L�>����R���e(5:�`k#�#I��a��(��}
���"�+=�+6Q������Xq�a�����3��������=!���.��hc�
-+Vj��Nwq���~�TR\?��l����{w0=!�h����a�D�o$�\�	�������NL���{��Kq��n~�JKK	$""�S���2�cg�����6�5�����[8�T�'%��D��{��Lj��(>�����c�2vEQ)��!�q�{���N_����V'�5���k�Xh��$��N�3<>�������:�]\����������H������=���]���H5��.��r�K�y���A����RA|���D��g`v�Q�����T���	u�p_�/y�U���s�������J;��^��,��g6�����K�/5�W�����!�0l��������h���S�OB!��� �B		B!��� �B		B!��� �B		B!��� �B		B!��� �B		B!��� �B�_�_�_��%����F�JG!�8g�� *JB�B!�!�� �B		B!��� �B		B!��� �B		B!��� �B		B!��� �B		B!��� �B		B!��� �B!!A!��B!!A!��B!!A!��B����S���;�!�IEND�B`�
hash-joins-bloom-1-10.pngimage/png; name=hash-joins-bloom-1-10.pngDownload
�PNG


IHDR�Iz�O�bKGD�������	pHYsaa�?�itIME�	%�V�� IDATx���wxTU��?S3%��B	���A	MTl��AV��eYA���X~�)���tW)"D�X���F���$S�����1�$�2�����yr�y��{���|�y���B �H$���Rv�D"�H$��%�D"�H��H$�D"�_"�H$�4~�D"�H$��%�D"�H��H$�D"�_"�H$�4~�D���������TWW����(��/�H��)--�u��=z�k4UUU1g�^z��F�WWW��+�0d����U��+������!O�?
�/{%���j�����B���Z���3f���������z��=�?��3��M������{�^x�Gy���111�Q�F1d�yr����5k�,�
��ZR]]�|@�-P�T,[���m��i�&>��crss���G�PP]]}���������W������?M�6u��e����Y3�{�=�J%QQQz����c�=Fhh(��g���������L����_~I�>}���#���$''3i�����ba���j��5k���'�PTTD|||�~\�~=J����P��:��;����v�b���|��w(�J"##��ao��6Z��VK�-�I�?�L�K$�kNee%'N$++�����7n_}�j��I�&1}�t�:��{�9���Z��j�r��7�v�Zl6'Nd����������z,X��A����b�{��!,,�6m���������'���������1b���G����9sf�~�����={���g��������S�}d6�4hK�, //���


(,,�'��:B"�H�1����E���_v���7Ot��U!�����
�B��������������u��3g����O�����.�:u����������/������.[�b����UUU��u�Va4EEE�B���R����W_}%N�:%T*���w�}W���	��!��d2��7����\�K$��o�������(..�W���{Q������|�r�/_N~~>����������/���J��(;�m��j�����m�6����0`���^�zQZZJVV�G���	`����[����pn��&���0�Lt���#>77���\y���P�.�H$��N�s��P(��s����l��j���<�'M���nwo���^�}��������#((�F��}��6m�{{������q��������
��J��?����^��#F��G1f�
f������YRRBDD�<��K$�111��v������O�z��z��t�����OS\\�6����D��-k��}���}��u���Uy^^M�4�������������};���������SUU�����4k�L�D0d�_"��W��W/"""X�`��l���<��C�n������r���q:����S^^���v�X|������3���?p:�TTT0o�<���Ry�����K��V�\I�.]j5��;��M&M�D���i��9={�$44�=p:�����<???4
f�Y�Pr�/�H$��V�e����7����V��j��X���mDFFz��y3<{�l�W�����������1�L�l6\�
t1�t�B�N���l��f6m�t��|�g�}������t:�1���c��%�����U+���C�����z�j6l� O��a�?��H$�3����p8��Zrrr��t��/g9p��[�&//���04�e�YXX�^��q���������%r�/�H$������~E�����"��/5)
		�'�y�_"�H�u�V*i���\�K�(2�/�H$�\�K$�D"��/�H$�D�D"�H$i��D"�H��K$�D"��/�H$�D�D"�H$i��D"�H��K$�D"��/�H$�D�D"�H$��%�D"�H��H$�D"�_"�H$�4~�D"�H$��%��TWW�p8dGH$��%�������g����H�j���j`�X���9r$6l���ct������������g��4i�<@PP6l`���������[dgJ$r�/�H������1b���G����9s&O?�4O<�
��o���������E^^PXX(;R"��(�Bv�D"�������9s�>}:+W���'���~�u��<x�v����#�p�m�1|�pX�jC��)�\ad�_"�\U���W�^������������������H�2�/�H�*����^�wgt:���D�D"�_#77��{^^qqq`�X�u�����$i������K����_�r%]�ta�������p�B
<x0;v�@��`6�e�I$��%�]�t�S�N�i���>����{�V���~��o�MDD-Z���;�`���:��~�a����H�0��~�DrU8�T��h��5yyy�����h�1N�������k��/((�d2y�K$��#���H$W�5kV�\�TY�gBBBd�I$W���H$WgpQ*i���\�K$^�L�K$�D"W��D"�H��K$�D"���X�N'�����Z�D"�H�"^q�����t���u����7o*�����]^]]�k��Fjj*:��{������k�����7�x���T�j5�
���+j���t��k��w�^�F#�
b�����j���[6m����ky���Q*�^��S�Lq�����������/^���7of�������������$��`�������[h�Z�����^{�5����^���v������d��|��7h4&L���w�}�5^l�����[x���$~��G��cG��eK��O��q���n�A|�����?��w���o��V��� ��['V�Z%"##����7���p8D�n���A���-[���+Exx�[����y���E�&M l6�����P���O�E���o��U?��S$�-[&�l�":v�(�|�I���3g�x���E��c�=&BBB��b���LHH���������;D����������8p�������e�X�p�0�b��u�U�������^�d���-�����/��Rl����]^^./^,,�B����J��;W���b�������*�x�b���'^{�5�u����i�&�m��:5�o���T|��b��Yb���B!�m�&^|�E��������/��R���+���_����j�ry��g���.����q��={V(
q��w��+Dll�57�N�:��'O��-Z$Z�l�U:�;&z��!�f�����_m�������;�O=����{�N�V�q�z�y)��������sogdd��Uo<�Ba��E�����+�F���� �;�.[�x�������LKK����r���=[�����j��^�����d��{�.to�o�^������6�f��	!�����&�7o.,X ^|�Ea2������@2D�{���������/Y�DDEEy�������������?/�q�R��3�<#��'f��-L&���g�}VDGG�W_}U��9S�5k�\V[�����'��5kDxx�GlFFF��z�`���{w������M�����4.^�X�t�M���#��-:+++ >,���DQQ����YYY999���3"==]TUUy�����o��n���4���	�� �n��a��{��*����&���l��mB�R��>���i��^����}����w�w�s�N�x�	rrr�Z��n��������}�v����y��W��o��u�i����1�����R����#/��%%%���~�zf����;h��y�O'�z�_�~L�4	�m��q��q6l�����W_}�O<��'X�`��=]�v ""�3f0d�����,�Z�sss	

�(s�EDD\�{��O����_f��E^�����e��q��!�����U�HMM���O���^ 55��������$&&���III	qqq�\��k4�8q�Z��/����{��l���s�M7y��SQQArr2k�����������Ky��'���:t�e��y����X�f3YYY�������������M����������=�����k�.�l����n��~�����_�c�LZZ&��m�t��y
������;v,[�l!..�A;������i��t������\����ZMzz:��/g������s��a��������p�'G�9�m����������o_���>|�W��Z����q��QBBB�X,^�Q�C=��3h����s�FCRR���:999��#���^��j�b��i��-?��`��	�7�k��w�}�v����_?����O?���G�V�h��5����4����cG�}������o���%K��x�G���� ����p:�<x�m��1p�@n��fv��Aaa!���[n�l6c0<>{~�������3}�t4
���o����>
>>>5���V�IKKs����3i�$�v{���Z��\t�O�-[�0p�@������S�Vgxx8+W�d��]�9��C�b4�B�;��CII	����������?r�f��k�288�W_}��}����_|�#G�`���B���?#F�p��?�'N����u�%���x���^w������e��{�9f�������_�Jee�W����2d�W�&;;�W^y�ZMDD��������
J�+�Jn��6v��������?�APP<�[�n�w�����M~~>UUUn�������:��v�Z����������';v��;��ng���5�j��
t�����OS\\L`` ?��#&���-[^S-;v�����O>a��^�����g��������PXXHdd�Wh<u�N��?��O��Y1z�hf���5}YXX��c�������b������qqq��jrss�i���J�z�W]?G����~r�z�M����'�����B���X,^��:��3f�����G�n�����W����������,_�\�p�
�u����^�z��={�y��	!��X,"**J���k���F�-�������5_��2e�������u�9���?��.������/����3g����[�O�������dw�{��'�����Kyy�(++3f��z�eee���L8�N��kW1y�d�p8Dyy������SO=uMF������b��%nm���
:��'�R���~(��f����zJDFFzM_��&�{��t~��wB�R��������w�HHH��B���;��SX,a����>(z���U}��'�k�{������F#6o��.�5k����q?��
:���D��M��U��B>|X����e��]W������z�n��ggg@<��#���S��x��o�m�����"::Z8P�9s�^�o��D�^�Dbb�7~!����h���h���h������������o2�P��������#�c�����W����{���^�+����k����|!��
�B�j�*��I(�F�������4o�X��{����{O����������'�Jcaa����[��h&�I�x������^��B��K/�����(�����?Exx����111">>^�����t�Y�F���p������?�5^j������������B�z}�{��@II	����`����t:�;$u^��Ivv6~~~�L&�������K@@z��k�����JE@@����-���p:��'��Q��f���s��)�z���u�u{���VWW�������z��&�H$�#jow��1&L�p�z???�n�*��D"�H$�+~�D"�H$W����!�+d'H$���RY��+��I����3��Q�x��hq����Z���H����V��j�������hG��b>�*x��WE�{�F}���
���f���I�E�7^��k��x�/^?����_"�H$�4~�D"�H$��%�D"��/�H$�D�D"�H$i��D"�H��K$�D"��/�H$�D�D"�H$i��D"�H��K$�D"��/�H$�D�D"�H$i��D"���Q�.�?�6mb�������(���3)���A���Z�u�������>w��a�h�F�w~C����fs���1N~M�����/��r��`�7j�Z
~�'���F��
����X��%?��k �����H��o)��as�P��'M��ww��N���X���c��jh6y�};��VS�n7�Vm�g���fI#km��o��
�d���r��i�����"�oNk5���������i;�.�{��a�&����X�aw�
t�%��Qa�Q���*�M�OD�8�6������������mr�zDc��8��~^�-N��;��-����;�����{�X�s���J�������������c|���_��1h�������8m�.�����{����='vD��%c�Y���������G��)q:�_J�x�V���h��)6������U��o%�Oi��!��������{'��7�j��=�r�rU�G��w5�����}U�Y����m���L���+_���X�V���t��O����uE|�*�����G��)�8��KW,��_
�g��l�N�
���INN&L //�%K�4��M)�Pw��<�M=~�_@a4P��A�X�=w`Z��I/�<����i(��P��t���O�9�M{�����@��9�I/6j��R^F��-���Pt����h�<���M���	^:����<�O����lB�S3��>
-��Q��!��7)=����&%	c�X�$������GQ���l�����S��P��@���G_���1��2S�fJ��AK�����>d�l�5����Kf!?M[��_O����*���P(��6���2����?:��!&�����Q:oIIp�p�%oEc�p��ah�Z�����{����%|=m>�>�_x?�B�����7>��G�����Z�p�����4�����FX��'�Ac�0t~?�F
���Tk������Q�-y/�-���|8z���;����Kogc�N��Ur��~�61������%�	+oFkPS�[yI������lJNGkP3r��h��J9\����E&����AEqnU���DJGb:��:�8:������3��,�=�	c��N,M:D��*��m���)Ol���]��X��AIa����_W������``Er&:����7GoT�.�\�4�u��������:������j��4��&jf<�NqU�L=y���5j�����KT8��#���	������YI��_�T��&cY���#�"�����D���������������x�Q���
�8v8�q=4�f=sQ�H~����P�|
�#'�:��������8�]�2�����e�>Q�����}qc�=���U4�5���W��#��e
���{�%#����:�/CT�c��%n2eGs�;�^���CNh����(?���7��~�}�%}��ES���7#^�V��Bh��h���e��Q����q/S|4������k�_t a	1,O\E�q����_�0c����9�f[�8r�f�6P�����(�7E�q�����{�����sU�`����D�PZ
�fvd
�����
������?8�/���f�r�9�)�?����C�1����}�������2�{lk��}���f�>�=�+_����1��g�m��hr���(�������d�p]�j%�g�v����,�z�m�]f�y���]��r��P�z��=|I�#��c�Di<�	����G-���0�Y����1&�?{��=��������Y�����T�U�3y��,Y����2�����zv���w�P���}�b��F�6������`��U�4������:u��D�U�f`xS�9��?��]q��{h�J��:�Y
��uj�[c�������CU�~W}LNs������m��(������3���"���S��
Gr��F<~/�J+�V~~Y��%�gk,�f�����}D�A���Ge����)�TfP~<��	������[�(��=c��-s�>@v�	�c�1F�<b�E��+��o~a02��S����D���6}��oN��{*���5���,��m�'S��5�j��1�X�Un�8�M6Q�������W�<` IDAT��i|0�6f����N��d�s25��c��I{9�E����Jin������#$���C���ai�!~��~i��=)��r�>���"�����#:��}��LO�N�dZ9�Z���\�t�}_�4:�}O?�r�����ZFx���m�4�K:��_T\���`�S���������>}�^x���T��q�E�#��bp���L;���9�Z�������h����Q�Q<��w�E�W`�0���T����h@��CO7jUa�8�=����g{���-��n�4�i�	]�:F>F��}�O�Ei�C�#���U���
ep ������
���y�W�����kO���:b�%rp����o����K=�,�fw�%�����[�7!�n"�/��>��G���E��h$�����G��5{�j�NC�?��r����2����y�������E�����+�QKP|[reJO�c��i�<������(TJt�F*rJ/K�_����J����Jw�o
�����S�/�,W]p��*�`�-L8�N��EtB8*�c���#7qrwf��S�3#�f�,��Qf�u�)L_g}Iv�U��Ci~�GYqn������a�yfk�$��(�����8�����e]�AaZ��=�}*�ue���4dW_���������P��B�T\u_�+�K,�C=��3h���e��
�{����s�����Z��H���q �K?"`�L�S<����S���D������q;�R!�zi��N���v������X�/��/p���Xw|C��S0����c�}x��]1����\|e���T�r�����o
��������){�������E��������4ti�_�p�JQ��bQ�8��:C:E`+�Rr���c���B��R�r8��C�=�6#�����tx�g����4�45����q������#����.$<��-C�S�T+�;R���>���+���gF-����)����m�FYg�����a���F�V�D�V�y��I�v�x�]|��,�,��5��JE��<�O��/�3��,�Es
8{�vm�������;�PRRB���9|�0'N�R�G��l6��
gI)���J��"������J����.�|�_�Z���C��
c����H��w(q�ON����e�gm�A����i��:+�lv����1���"��:����*�)%S_��������u�g�W��m+*�����"����]��K*�x�d}��������	�h�4�]w����9��Z~xr7,����s!k�S��1o���,�|��~�C����&U%t��cuA.��"�UeXB�������~����9;�����F�6�& ��.�����y�+��S7��;k��,%U�|<3A.��E�Z?�t�:~��A��������q��TY�*u�XZs�����0a���&cJeI5��I�1���EUu�_+*Jl�x&���\�[Y���R�J:u��[Z[�?KX��:���J�xNb����}���X �J����E��f-\��V����X�L�_�S�N�t:�������]����G3{�l�
V�Y�D�2����5Y�t��0�b�8�{�8���[������XQ�6C���,��J��<�B�C��������B��Q��=NsY
����
�U'��Va�s�AH�)�R��������*����i�:�{���}���n����]�g�m�a�����__V}C)I?�!&m���b�=��������g�|���[�������y��Z|B��	�$����}����/�
��������3?=�� |
T���I�H��V��m�b��.�b)�p��|��^�>�H��jV{�\xp��)��!G���r���O`�?�@�b�y��	Vs��O �V;[��qo�r#�?���v�w����_��}+@cp
�6����)�����b����e�1]������(����d���dz)Mb��j(/v]�-���0����D��J���P��:6>��V[^1~O��i��@5e�������r������Lds
J%,�(�uNj]���F�/���+������?���4���
�������z�>�-� ��C�N�JF�S�r�p:�'��n� �Y��a�d~��s��U*|�<�m��8�J����������\0���q���q6��W�i��N���'���<J�������x/�a��W���|�iv�[���G���#��Z
���1���u"�m��3S�hU��Gy�q��3��� (���:�M��V����i�m�sa��3{q����������v�����O��R���C�)C9�b��Wsbo"rXw��g�1���������8]@��B��v��p?1v��B�����a�*��L�e��O�"?=�����P*��t�r����p
�o��0�-���g�1���������Sz����%��*&f�H�h�>�mB�g�����M�����N����=Q(h��O��w+���{b;�k�J�jU���(�F�t��
��3��vQ�+�QZ�O����}\i��Sn�����f���Q����V�B���W������k{%����h��q6����;���j�����WG8E���AgT��U��*Q*A��F��vk�I�0���'�J9�^����P(��*�Oi��������7���8�
Z����SZrxOI�W�:�
����S���V(���P��W���
��W0nz�k�*FO���y�~?^oTb�U��*P*����>��CM�W�����qo��������7~���b�r��(�(�kf>
U������/wf�
��R�cS	��=������v�M��8E��I,y���^����x�_w�(��k���3h4X?�����]X�&��=3�WJ�����|�Qi��������T�(~bA)/0��^_�~��15��k_��y3
�����r�����&������p��t|"C����A�U9|;�M��}���e(5*r>K������'��2���
�S�q��c���%�`3W��kqTX�f�� �g�;���>�no�G�USq2���^k�1�l�
�Z���_F�Qq��_����nc/�,����1g���r��QT�����Ul���Q���'>�����4>z~x�+-����\5jc���'Qi���$[�Ou�wK���Y��
8�|��v������7��a����_���c�x����.x��I��b>���:d�Bo�����A�m����
z&��8���
gxw�N[;���mQi��,�?�'�U�����������v�5�NA����dZ������7����;k���4J��,���_x����~f����g� vA��r��Nk���Y7�k����V��������P�3�H�PTgl^f5/�:J���|aN@�Q��g%����Fk����#
�]Y[����q�e��h�\��m�u�_kB��Q�("��^	o
V�;�~���@p8p���D��I(��7�"\dsFSg�*�	�ZU/�u�Th�(���_C��hq�����w���8�����5�`|��+��j���W�8�6w����NP*k}UO�T���Vf�f�����_��x�^����jw��/���/
�������Qah��~��.��yV��Y��:c�����w�����F�oS#�EVl����`=���RR�}�WE�_�s�n�fu�S�
��8����U�'�(6_q�A�>T[��������t*J�6�M�.�(���ctp��j�����_���+~�z�9$��������g��S����������]J����?.FuN��oKN�d��]��7��w��4
y��2�������~��JS�S�w�6'��KO+-���0�T6��ZQ�s��GYa��_��9���Z"��K$�D"�_"�H$�4~�D"�H$��%�D"�H��H$�D"�_"�H$�4~�D"�H$��%�D"�H��H$�D"�_"�H$�4~�D"�H$��%�D"��!��O"�H$�?������I�����Q�V^���8�v���}�}
,��*��^�3Q|��������*^����^O^I<�X��
A:R
�s�b�W��,���b�Wk�'n$Vq��m��h~����~�D"�H�@H��H$�D�D"�H$i��D"�H��K$�D"��/�H$�D�D"�H$i��D"�H��K$�D"��/�H$�D�D"�H$i��D"�H��K$�D"�_"�H$��,�ky������^{�}�����4h'ND�n@�i�0y2��V+�[�.�5�w�'��/��	s�����3���]m�����h���F��j0M���ow����u[)[���������	��<1gye��k�LU�&z�pL};��V���krWm���1�����q���8�-�|��<�q8-U}�Y�� ��Fkl7y0M���a�qv���\���O��&&�GK�jr�8���;k�9�+1�o����N�(�*��&�#�o,v����~���j��4��t3����98�t������������������c|�����k�'u'�w$N���K����1��jA����j��y�/���as6~0�Q1dJ<N�`�K?_<N�d��v��������������z��;���M�&8�����f���8���5>J�Oi��!X�R���G�������H���������,���j����Us`g!k�f`�5^��G��S�q:�^�iTlC�j��G��p:o�dnt���������W���V��k�"})��2���;���"99���R�|�I�?��
��������`���]��R3��{`�RHJ�s�\���	<���~�:����_vM����H�:�Q�����P��
����SQ
��|T#�YR�uOZ�����;��hp{
!.��b9��!*���?���#+e�G�����_jL�������@����5���i���7�v��[Er,��FiLHO@�(~N^���C���P}8��������Befi�����s��1��j��I������k��������K���	�m)�	�����hn�?�QKz����n��G������������t�C�j�Sn#�C����1h:�Z��oS~�5~��{P�����������N>��m��i�����1i'e�*�kn?|�X���F����#+��cPQ�k����OI �C�����b������H9�3�nF��a�����5�+��VO��Q[t�'ieg|*�s��4�'S:�������1��0?�Q�g)g�uOS&-����_(9W�Cs�h����5Jg�.f�l����0�vI��+�!m5��.Z^[���$?�Q���?�s����TD�9S��D������_k��9���{Y�j�Z�����f��9�7��(;�����_{]
�f�n���._�������p����}7�:�*���g�m������{g�a;�Zy(�*gM����gs(}�7��R��
�^BX��^}��
%|� ��{�����vcg��a����d���BFC����oq,�]��jt�M�Oh���c�w�b���obg$6��
QA���
qS(=�����t�u_��o�&$�%�Qv����g�S��{.y�S��C�S�}n�E��0�;K��S|4�����A5�:�s�[�n���K��Ix���?����)����g^���-v�jj�f����#:��j`4�#S(�.w�@ny>�m�����y�n�/wMX��������;�=�=-z�������E�;�%S�6�{���W������c���o��������kt~�z�]����1�,}��������
��q��(�������=�����$�e���l[��3�T�����sLo>{��=������������K���t����w��lr s��v����8b�I���gy��a08u�d��������H����{��RS!6����G������Y3��	23]��?�;_0}peJJ����]p���M�����(�M��ODTZ([��i���g;�r���P��3��0|"�/=�z�n�U���
���Ge��M/L,�����oT_��l�%��6}����������_UT�����!+��L��~������q���W���CEn���2SOa�
�7��#�?&�*��m�Y��&�{$*��Am5h�3���
���L�"(�T�Y��c5W�M��7�Duo�J��?�������A@3?�;�R�Y����F��?����u�&[���kq�>���<Bc}	��S�c�������cPQQbk��%I��������8��m�S�ik (BGP���x_�n�#����N~dZ9�Z�h�o&�a��+���BrR���\���*Z�k�����fj�:i��t�]���y�\�____�.]��O>I�~�������C,[������A���$7�B]v�orq-\��g����h $F����kc������Q��
���i4��w�=;��3G���i�qn�W��K�
���9���-r�Ue��F��������2G��_&�J��OR��'TF��=4�Q}�3a�/��>����,�������	��q���:����)>�oz�BV &�������sP(W��6��Q�_�QV�[������O�c��i�<�5��F�R�66��e%��T�Wz���V��~k�E'��L>�"}1g���[�T)0�na�iw2hf/��Qi�C������3�����bMaz��=��\���8��Bb��{��uo���h����0���e��U�:�A��.�����M@�Q�����?rpw�5�YW��:�����������&��K�
��x|d>�w_��+�:��������U�V�n���BZZZ\U����=����n��s�8r�u��]�����K�.�L���vm�vR�B8��jTh.=7���T���e��+���P��5�=�}�v#J�/g(������GY%��YT�B����K�Fu��4*5�Z?�)[�����(;��Z�!�K��
*��l"����D�;�k��t�Zu������������������=�#ZC�j���R���}_�45����q������#����.$<��=��uj�j%yG�y����q{�����w\����}:���}�������l�!��=sM��K�Tkht*Tj�G*x�[*�u��K�2yy'i
�G�@�Vp���!����c6����������������EH�� ����a��1b�C����@@�gYP��K����K]�Ys����a�4�|Y��$����V����O
���e�gJV���(�t��o��������w)�%��<S�� ?W]��W��cn#��u���vD'� 5�l.M�����9���
Ge�ei�.�D�y^h�\���*j��$�$>i0�D>EU�+S���Q�o���5{i�P?4F��������[��aTdc3W^���>��uA.����m~:�}nH���:St8�]S�0���X�*�V}��T���gl��2
E����]G���ty�-y���<u7��~*��T����Ok������[�%xd	�&�%���� �vE��s�����uU>��=��g\������o��=��*eE6�
6u���_����Z��0����}]���nYsa|X�~OL3�"7�q���4�Kp��I�������b��������IOw�����4o��`6C��.���]����&~ra�58p |��?|������_��D�4�,v��O�x��2l_ih����G��mW��:/��t1MQ�a/v��o����X2�k���M��Z����r}l��
��XN�����	1�8sy����3cB��.v]�A]c��+)�8W#�76[��m��'�Q�����al�B���G��&PZ�%����H�27\�+s�������c-v�[M�FPe�R�Q����j��9�s�)�9�C�jG���/�������a)vId�&X�Uf��\��jg���r#�?���v�w����_��m����l�5S��c������J��D��������a<�A����8����3����$F�o���b��-��Sa���Q��W��.�q��������8�y4���6vAh���\���������Kp��7b6���e��l��U��������e IDATY��5���2���A�t��7e
�XN'$&��aV��|�g���*�+v�Wv�`�e�\e���^�;����~�*�0����QO���P���.��_���������g�G^a�����2(O� v�hJ*���)����;�a��2���3�����Q��i����6	�3�]�x+����������NS�~����F�T�6�?e+R�c�5���O�1������eb*NPq������]��v{��:����6}���l����9�VJ�������NA|b7Zk�JAkU�5{�F�4�
��3�H_�M���l�O�#;=�[��D�T�5j�?���8�n�{b;�k���B��t����A�{�;�.r����V��'��}vW�_�`��9�'���z�k�jt�j�Z%J%�|]��_���K�aQ�N+�Lz1wO��B����f��xRWd ��A�_���_S~���Bw;:����tFz_�[����}^���H��v=�V���2FMo�B�@gTq���l_��p
*K�|�I.�����)Q�?{�U������)�����"RH���Q��%Rv�U]P(b��-*�?A��E�! �(��P&��:�I&�L��1�dg����z^���p�|���=�|����=7#��7�=Gv��V�Q�����P�$d2������eEp���V����R��$�z*M���,=7���������Om�|&�������~�U���}Y�M����C�,_��)S�`0���E���z�j���9c�z��[,����6��9���,����������'�@Y�w����-8����K�����(�w.�sc!v��X�!)�6}G���V�Yw�4��Y�UC�I���F���w��:�9���,���
�7�H��e~�]g,�l�W��	�Mn���/����fi6NK
r�
W���0�A����Mk��}�w��
�6��o�'~�n3V`\�3��vN����)8,6���:��^|�v&��
cWq���ay�RN��#|?g�w�����B�����]l}x-Cs�a����C5�}u�~�S��+����kF���/��2�l*��9�}����`1Z9�>W���}�+������	U�����W�>���>�3e�q;���d�������{���,�������0��CV*F?�7�����u�M�k��R"oS���NN�CD;S��g���~���kY�%���p:C����z+����hgpV<eF;��{�����5�Xm�B)���R��ixL���_y��^|\v.���c5,�/���X�����7�[koF$�q[V%�z��7�h[b�o��R�U�D��a�|����^�d�dtrW��b����m��rz9o|��e�p9=s��������s�G��#����v����m�[9	�������V������zN(<���-�������|)�@���u���+�������q��� ��CA&��!�l�����g��@�+��P\v�/����,:I&Qk
���<����V���Bp��4���J9�=�
�#�s����{�g����������|)�f��R�>F���~A?�<.7�����%O6H+�|L	�����|)��V��A����p��6�3<NM���K��7�*�.O�^9��������z�����T��or��.T�[^�xR���r�I�/��F���&��*.���w������V�����-����K�~�6�)n�u�V��M�u�T����9�X��Om������{ZCEq��#ky=�����}E�#���@�;B�@ B��@ ��@ �_ �~�@ B��@ ��@ �_ �~�@ B��@ ��@�_���w��u�6`���U���^���R����n�������}��5��~�������<+X(=~U��D�\�sL�����|���I�\�>j���_~�J[�j?���������O��W���{�_�wE�_ ��B��@ �/�@�@ !��@ ���@ �/�@�@ !��@ ���@ �/�@�@ !��@ ��@���������_|�\��9s��6n���%K���f���<��c(���W�J��Yt���iw����Wk�V�U0$;��7��r����0����5�j���AJ�h�k]�r�K�v��I�$r�xt�=q���Z�5���j�6�['"�'4YV����6�a!D���_7�5�To�I��O�8]��TU
:�����kp����������U���0���v�U[O��_8��K?dj%�r���rsl����M�t�5���4\vg�������W�j�f�mD�m�����-�r|��M�U������\���	�O�JN�Y7����������\�K�u�U�'�&nH��p����;�>��~9���������T2���A��8vW��s>~n�������\0~�No9��%���Z���t�.���p��4bV�3�p�]�Y[��+O��ua*F�J�c��j���b��%'q9=m�����./(h�����L��P��nv�-�����v�sOvJ��{����V�*�����.���d[�N��G��������XY�vY���J-���P�.o-0l?h���S���e���N�B3N����~`��}�?��Fll����]����'���/�c�=FII	���z���@����y�^TZw-��N�����l�m�R-c���Dv00i���?n�o�zx���j���MP��1�o$�����wT	�O��#%�� ��(�NCE��F�.�����&�1����,�d�n]�����W?DF��GQ&�cz������;����865r��kMD��T��l���j����E�����������`�H���G�k���*�L���N"�k"��G�U�{�X:5�r��!����X����Q�h��x<�c����� �����S��;��������������*��v�:�rw7��g�D�j?�����\5�
������xF��R���T�f�����u�������G�S�}��&��p;
������!�W
��q_���/��Si����}�3��h����������Pk��M�f�j�u���g�����Z��N���|$���[`-�c����T���=�L�������CF0[�� ��
S}���HnR���x�I�Z9S����1�H����]?��nzn����g�
��HF��(39���l_]��6X�{��C�����x����xQ@>v�P���h4Z�R��E�o���;u��,�����s���p"�e<��r!���+V��K/���?�y�f���s���/0q�DoG������w��D=�&��L�G��6�L!c��>��?�G$�'0'a9���ajn�����
o�'�_���Rz�t_������. �W&�6a��GQw����r��MoR�gMT��IC�@.����0e/�c�C������g����v�����k#h7a_����X����yc	��]a�����5'�����6���1>�O?����'�o1�z�I_�&��aB&�������c�yw5)��vD�����w���Z�_���O��H��_:�S��E�_��gp��nz�$�e*����e���	t�8�w���TUy'za��3�'�]��������D���mR��c�����bg������t���V����9��������O����>��G���d���]D��R�����cV�=��w-[s��i���������r��P3������Y2�(���nXd����A�2!�)��1�y3:
��u`c����v6�s�!�%�x}w?��>J�=�������:���}��0,��m#���G+x���N�{�C��	��������r��
b�0M��������r>���'Nu/�l�'��/��2C�6L���8t�#G�����������D233[}���1T�l�� {1�!�u��B��ZK�o�8��D��Q(T2j*���9�H	���������U��8Me>��������Q-~?|���mv*Wl�������'���H����������}��������?9������M�n�J��Qkl�A���>%[��i_����Z��'�%���O�B�������}J�@��3`3V��u�2epG���&~��oG���'����0�����@C�����}�P��4���������)�r�M��bb <9�Q���<w�����}��bj��S��&�O��n/%:UGX���j����}��� �&{�>��}��[Z������JS�O�n�$6UCD�����I��\l]Q���d��k��e���8�}�V�jv����r��R�&�1�r:vQ��qI
���0������B��I�������(
�~�iv���������O>��o��U���R]���U&���?��+����B��QB��%tAX�m���
c���m��u
b���������8K+�>;/���HE��9�4D���������a!�M���.����������:6��R����d������Ym���o�}�T��B�S�%�_&��#O�??�
�^jm�GM�������j;?L^J���)�v�N��K;'-i�
$G����l�|I&�����`jK���d�����[
*P�N�Z��<�C8�\�&BKu�����!V������9���NI\�����b�Rhl�R������QY��_]��A�RH�b �8��v_1�b�XJ��>�0��������N��s�����6i����bl��U<���?d��>�d��^������#���R",R�_��c���G�����v;N����;���?s��&O��K�����n���?�+����@9G�.d�g��kLG���
S��u�����JOX(9nA������G.���O��?����
������Ij��m|� 5�����Rp�U"��/��2e����{2Nk-5'��>^�\�"$����D^��a��pZk��8G��s�5*�3����r��S���:�O��]�_D�,=`����������N���}J��5w�������������{L����\�(~������Pz��R� 1#���)��wU����0���T��������'�������T(�'���%q�p
�U^�cy�
�o����K���|U����+$Nu0�W!�u3��2+�>��l�+��V�!������}�=�����?���BZ<G��m����@[E���;#72$;���u���J�=�1[���~1��`n�T�y�{rG1���������9/�>]f+��`��7x�*,���������,s�rv�\"��G���N������t�kP���xU�z�+�W�a����}'_$<H}�w�Z��0����h�\����g�T��&}���id��]�ocM�#��yW��;�1h�LN����nB�����1���k���:�Rc��a�]���l'(4��3M���cmE����#?�O�M\s_w���������d���;o�����{�������Y��.���������?�;L<������b�1;��>�{\S��'+���9���:�#9n���
8��+2�U���C��!8��&������-��X����v��=��+�yyV!�?�������.>_�0>�~������$(8W���R3����P(0�L>�����F�i�9�y��'�
Sc��vb�(j-���W5��M���T9=9�s�z7�!���}�����R�@D��K{VY�wUr��\�^�4=�qY����pZL��LP�4���oZ���B���(y�������#BQ�D�8}i���
�$G��������g{��b?[mj�*�O�l���*2��3����T��A��*LG}�7��{&�����o�;Y�����'����5*����S"�d7~<��bTyC6s�C�{�3���$?K��	I#(L���+�1=����1�7~��;���W��~98�s!���'DM�NR����������M�Odjp��)/�
8~.��yf�����T�TzS�)=��Y��kh�;�^��X�L�������"4FM�i��N�Y�IB����+�{ScqR��01LL���=���\�cx��z��0�����������#\NQ�r��k���J]���\S�������������vS]]Muu5����s�=<��S��v\./��"���'<<�u���2�y�{�:$��J������^~��C��4��J���T2�/�@�qi���s(�g�����{J�T\{{rC��J������������P�w��'�22����I�������f� d�@q��We��Y���A�S�������BN���8
Kp�)�d?-�
��+����dr]s�����}��'e
 vT_�{��0����w� �5��Rj�z�/�uA(�A^1��P���H���b�*�����;�d
��ks���|����Y7�8��Wx��Di��p{�9R��@��2j�V��o��_O��}3�U6^��K}��}E��s���dJ��~9�u�^<n�f���(�c&�J����t�}�!�s}ff����|�S�T��*�*���������������~��k�Q_]6?}�u���������A���z{�6��NA�^�B%C�I����o���d���}fN�����.H2	�N���t�[~
������=O]K��>��L�@Ea-eg� ��^�B%C&��{|��!Yq\?��^��g%?��?>��{?:9�sR�ry����H�Ju�sI}�����^�R%!��V�=�$���Q�V�ie<�~;^�)����L�\��:	�^�JE�������Q�V�WW���i
3�	�������P~�U�����X�			X,
)��`o��������[�3���H
iii�Z�������-L]s+��)��2n:��9�}O�����O��w�����sr��������<v}p������b�W�[:���FA]������Y������W���I���i;�9
�B�F�4��Z�mC�I�ir����q���j�o�AR)�/(�����P���/�g�c�n��R��M?sh�J?q�5�cZ�#�Lx������ ��q���3�E����������`K�d�����c�d����f�ER*(���/sV�	��X�q��X�K�1�]�_:�zK-
�gM��~��>@����;�d���i�J'7��9��"�����h���C��]|��:�����E���W�s�������9�

�fZ������-�����_��5Cy�2�Q������/~��;�?_���?��U,��5�����}n^W�d��-W�;�#����r��LO�@�����)7����"^��Ykn��]��2�m*��98s���~d��=y��^(T2J
jx����Q�t��!�u���Qf�38+�2���{c���y<�&���F����������������-�Rx-zC�����K:��Y����n��E�N�5��S���I�ci��5E�����S�;�	64L X���?$��dtrGV0&����m��jz�?����\N��w��(��s�G��#���#��	

mT6Cz�U�0�iq�]�����+e�h�U�/��18Z�$�|���CG
/z���{�3��(<�:_�?�|�e|nk
.K�+�n�����l��%.���K�7��6�LF�)��Gr�����P���%.���K��xO�!H2�Z�%`?��`��x�l�q�8�N_���������c����9��������.��f�s9��-�C�'}��cJX\�v�/��70�$�����:�YZ�km������ViK�����������PzJ������A��or��9n��*s�+�|��oT+�V�9,��K����-���^��t���o����e��^�z�+��&}����v�K�~?��[�����
h�~%b����������jy�������u���+�yS<���w�~�@ ���@ �/�@�@ !��@ ���@ �/�@�@ !��@ ���@ �/���'��
��|m����W��oxf0Sz����U���/����Q�]�g IDAT����z?k��W���zV3[z������W<3�*-���\���]����G]�����1D�����+�`�J�j�\K�Tx���FO�%W���@ �!�_ !��@ ���@ �/�@�@ !��@ ���@ �/�@�@ !��@ ���@ �/�~�@ �g?�TVV��+��{�nt:C�e���(
jjjx�����};
���C���C�P����*9Cf��}f<N�����Yy�I[�V���Ro���p���C�_W�+���<+����8j��r�K�v���J��Y�h�������'�i�����
f����k�A~]�@\�He�j�{�>�
u���|U�e��������.��U2���L��(v{��}�)_�.L��Y���/��'����zI>.�'���JA��Dd^��^O��=�Y�����#m���v�U[��-y�\���{:5�ND�5x�.�m�#��-��@�|����f&���8��8{Wn�G�����I�!����e�rp�	?�k�����n��*��=�7��p>H������������U��eV7:f���;�e�iv�<���@��]9�p�<�Yp�YG��H��p��nv�-���g}�^�C���;GvV���Sm����v�\���S-���YIt����f��R��4����
������!����iK�?*���9��\�dAi����{Cx��B��wKTj��9z\.X���}H��?�������Z����GKjp:��_�n77�|3�����9���2{�1N�>�/���w���j���;���<��c��/����$�k8���E�Up��P�l�m����6G���y�^�:�0q�-|0�K����<���
sw�b�����h�������!�u����?��*��FT:%;s4i?e�(�r���#�<�j�������5�qj���>�[c��dZ`������Pi�M�f�Jn������Pk��[��Z����H2��[a-���W����{��������W��1tM����PhUt[4�N���/���q�\j���:�c!Zz.~]�8�g/���9(�5y�Q����0MB8_�����Bl�H����V��E7��)�!w#���D���u�n":�2n�����O�����1�neC��X����&��Z��5��N��`����
,������L������_Pi���j���r����RI�0������r�&{���Pn����f�Q�Z9u%H'��\�����V)<Z��N�������z_��VN���E�������zV�?E�V��u$H'�_����as��:����6D�_���Q����M��3�x~EAZe&g�b�Z��8�.�'<Z�SS������%��"�V���nQ�[�_�9�b���s����xn����
������<y�B����			������~�Gy�����[GJJ
V���^z��������t�M_E�1�w����}^�F���#�����M�K�7��ajn�����
kLJ���������ky���u	h��>��|�rJ�U�|�u��M
|�(:
Nb^����� n���_��c>ke�;
�!�K<��~�eo�il
{��V��G���wA��D-7MH%;}#����{�g^7��=AL{n���F�������G�����	�&1��	�"�����r�����k�E����^���w�t���\�����^NP\�h;�XH�)�����6{T@�oH��	��b�{~m>t�
��?�G����\���}�r��~>��m~&��=x�t��
B������;�z�nR�F�uXb��a�:�������9w�2��Q�z�]���a��v|0�W:�
�����E$j4��o��X�����w�O��%�l����m:��2>�wf� �o}�E4k��f��8&���x���s��T��[Ht� ����Y?Px����{�,<����������WC�0}��>�4�M��0��mR������l}U�}B;9=���K�9N����K^���'�/������w�����w�D�d2K\\yyy>���l����~%�?�*��'�����H
�����`j-�>18��DR�h�*9�
;�6'�)
���T[
$���j��	���EM�x�O�����S;�H��\%od�9���=+�^+�a�S�v��G`1��D���2�Su��k0����~_�D 46����;a7�}�P����h4�a���+�q����4�EP\��r���|�c�O�Zs��y��B�S
�;,9���'����!�zb�DphC>�I��u��l��`{a���:{���<��GSe��D��v�����k[,���oKI�v���a6�}�ph{1�Z���Pi�(T2lAz�0e��u�d��-������
S�O�l���!"^���A��EL������(5����l;�T���=S�������6��g�-|���M��njm�R���8�F�����TVV����s��!v�����+��>}������~���
��R]Z��Y���+�O�,/�BcP���\��<���\B��Rlc�����FNl+B�S�%�'�Nm�G��{��X�����2�1$��z�.�C(2��."���{�N�-s�����m�N�Vf�Bc��*�4���WVY���.L��I�$t1��od�
����P�J��>����>ul�E��8g���&�M��R��0
���.����V���&G���w��C��gp���R[��28V�'��f�;������\O�~q��2t�V����H{b5XK�M�yH���rs����KKi������fhl�����+�#21]���j�g�^N��bu�j�g���WV^T���G���4�o3���H����I��X���6>Y���D�@f�6\�z<mg_S�a��J�]��muhu��(�5�m3>b��v��}��q��1"##����}�����Ivv6��{o��+�ex\�;I�.o/�+����@9��62����5�#7���
S��u�����JOX(=nF�Q����_����8��Y�lc������S�6��o���s�+��VxE�S&�|���=)��$g������F��uy�X�l�����8����(��x1r�������������r�����j��9���y��2N|}�	��A�1�����M��koE��BF��J^��!/u[��e�2��aW��%���6o�����
����f��'xo�&�mf\������}���#~J�#�����:):a�x��FN����fL�$x���y�����Z��������	'��i$��P^��������c�����[�9��HPP��9YYY���+L�8���[k�C��CW�=��h��yg�F�dg���N�;R�����/FRSQGJ��dg07�������&����_V���vi��k�u��?w��{�mM����\������/��#����L���F�}�_��7�]���1;���������A�\\�[��"z��N�l�����q�/-�Vo���<�
����+�$��u"-{$�D]���D����a�cW�����#�����������������~�\�/��������3%G*�������{�U������u��*{�;��s��e	.7����yME]��W�_�B�t}��'k�ky=���W�����Gx���D��8w����Ymv�����p�qU��k��0&;�1	;��y�����s������l��|L;=��P9{��!5]M\;o��vVa2:����>������zz'��(�N��������ku-�6O�_�w/�{��e���<��S��
Dyy9���#??�x�O?��A�]����OF��V�\{FQk��,���
����g������?���w�Bm��'��M�+5
t���X/���J���3���I���������9�a��W}C0E���=��N^�v=�g&*Y�.LEM�W�Sz�a�88�_Mj�pz
���g6X�����b�(;}i�%���(Ta:�+������b�&���]j4��Z���
�!��PGc;SG������/�p�K�~�k��OQ^)a�!h�������yy��������g��r�����Hn���X��"��zYG�������
"��~��]�j-���W��)�-������A����+��{�Y��k�P�I��]
���g��k��P����Dp�k��
;�����(������T�|�`*�E��a�TRr����%2,���)T��f*�J���J�f����v�r�U���)p����Qx��w��W�T<��3|��G�����w�!!!���H&M���/�H�>}�����k-�}e��1����d*���sz�{�<n}�:�mT�7�����h"}���9��3{��������4����;��4*N[1���N\�����Rny����!9��q�a<�~����t��j��������@t�0������w�����VYGu����K�S�W�P��� H�=>���J���N���t�����I&��)�����x���n�~�+���.�
���u�����3���2�;�%��O��$�P��t��������e����u�{N�4h��������	��Rlg��k�\���|H��(�A�	����J�����6���������;������OM���k�����4�7?����������qn}����\bPNN�*�`��b�[�W�P����W��+}��?�#=Fy����r��U0��_���������=-�B�N����Lj�/d%�wT,�,�U1���^;���r:���3x��S�<��F������������T��Q���bG�������Xn�}lxb_5�y�d=������d�Xn���ptO:��~�7���9+�s����
�O�N�V/C����@��K��
e���V����s��������3���d����I�����:���|]���e���V���� � 1���{�4O�(:{y&P�����;g��U��5��A}}=���,[����2���wJKK���������?:-�)k���\)����|��������US���}�����q��������<6�mXi]w'�z9���FA}��'~��=��(~�3���k,�Jc������+e�t��Y���������.��j���+i=�����!8�\hB�|���l�����7����������j�W=�r���fm���Akh��kF�z*�6��y��Z���#qi��\��R���2�6�F�.�j�+��q�<�JO�J
����r'�H�����^�a��~�H�/h�G�5���F#S�1m���^�Y�]e��y.6c{�x7�&��I�������kT8k��3�M*�� ��^dn�{�����_��?���������eTZ�������M|��9�5�n����'S����4�������^������<��H����v�)=V��q�Sv�����x�3������n���j�yN��Tkxt�0*�5,���w��f��5C�L
F��q`��eY�������X���]������&����/(7����(7����_�O����/1�Z�J?o:�kY?a����LMa�]p��b}tW%oN��s�@����,��!��7��7����8�;6i��:^��A���KS��6&�i���+��J�7�� �������0��N�X��52�5.N<��=��|�LW�`�u������x?���c<�4�sF��]�l���PX��*>?���C����_=��(5�'��9�`C�us�$�F�6GPdt��)�����~
O�l���!H#a��0sb%y{.�7��I�(n����"���1�����<�8-���f�r�������&�%Z�$�|;�[�%�?OH���������bh��_
�qv�/��2��x
v�����(�������p��})�W��$��{ Z#��������o���1:lv���J���rSkn���F�/��b����Z�����p�]���_�����k��V��[#��JD��z����o_�*d��]������i��_."���RS�m����}��y�d$&&^�kX�['�.�����	���������~^
��/\W��
���\�^|q����X~��im��n,��S�������[�����������C�������yA7��#h�J�W�:�u>�@ ~O]Q�@ ��@ �_ �~�@ B��@ ��@ �_ �~�@ B��@ ��@ �_ �_���w��u�6`���U�����<*��U��k�G-���}�+��z'wH��j?�yFq�������x�"����<�I&A*��}�	w�sy�U?���N�t�������Z��q�������T�@ �#���@ �_ �~�@ B��@ ��@ �_ �~�@ B��@ ��@ �_ �~�@ B��@ �/���,�gy����Y�d	���8��{�R�g����5k���{�!��~��P�<+��q8�N�����cM���
�dg���X\7;�f��_�&T��Y=H�M}���[��c�!�Nw@�/W�4�'�3�q�]X��O+�\�^�U0(�)7��v���� �� �[$��{5��O���jG@�*�2��������G������&3�z��=k���L���G����D�z�'<nO��I��qwNG�.�o��1�]2��������oW}�_��!Z���#;+����m�����./(h��{f%�53�z���kK�je1����������|�0����|T�%����r��,�l��M����&�����T{�sz������/�6$T��g�����^���-u|���3���"���r,:_?�1�vyZl��l�0vj0Z��]��yg��#�W�!;G��4��u:���r��)�t��[<������aa��,9}�I����-n�-q��B��a���L�<��_~���{�1JJJx���}6���L�<����.]zQ��@����y�^TZw-��N�����l�m�R-c���Dv00i���?n�/��<����sw�b����h�����}�������{Pi�Zt#*��������a
��-�����������Xw�Zs�w���u����N�������_V�A��Si�kV�������>��V��E�P�|�{��.,.���]�!Z�;S~�����a`���>[���=H�����PiLZ��N������v|��H���(>Qp�����Vt#H+��T���?�����z>��V��Ei��l�5Rmvrx�����M�Mcby}���|������h��&W�"�������]�����M��1:��*���%��E��(1����l?�N�����U�Cd<��@jG9OgW����C��Xt�
�����%��wjY�,�����s���0"�e��k`��#C��
�Z0�Z�5k��%^|��^�IH������`�V%�e��U7����v�sw]����;�^x��'��sg����l�L����c�&�!4QO�	�<��%���2����(�zD�yps�c)���05�����u�����/�yY[)=���_������.�`M��gB����X���a��7)�	="�48�$,����9}8��$��Vv���=�\b�������=��<`|2+f��c�p2��^�."Q��	)<��������Bb��.�������������m���O�����7�^�����H�0xB�����X�����u�	���`������M�����Y2�(���nX��"��eB<S��c<f�����l�5Rz���w��������n�Q�������c��J2��0L�}�Y'���6d���vw��+���=^�3�����b�0�%�&��������J8u���[�Z5�>��_�8�[�Ew��3v%=��[l��lg�c������['�:��\����xl��>}%�k~'-q�NN�����`�9[���]���f�����M!���d�M�������8t�#G�����������D233}6K�.�j�2c���_�����d�@�-� IDAT�b"RC0���E YO���h'w�h�;
�JFME�6')��rC���:�:H���T�}������ ,9��������$��A��7���������n��y�m9��]���Mv���^Ft�����b��T4�
6���f}��������U����a6�}�px{91�Z���Pi�(T2lAz�0e���n�Q�n)o����*Mu>�8����T
��En��$�l.��(
����+�~K�e�?#�Z��OW�=y:�����lk�pSk����G�qr���	���C��X0?���m��mL��N]�|��F\����*��.~�n���l[��nRk*�p]�O�4Z	���"����~����z3	���������(
�~�iv���������O>��o����O��SO�}�v���_���j�.���U&���?������"4A����yT�dr	]D�b+'���7r|[1j���.�|8�����)�&���cu~>�TdPcH�c)�zd�����{�N���}x��m�^�V.�Bc��*�\�&o�����,�%*Y�}�\���� ��6�S��X<��������+Mu����
f��ED�]���#V^��T]?����T�++/j�� ��������yW�./�^��xx���F�]q?������=��s�
��V�V'��E��I�6���C��X��u��^��������O�R	a�rf�)e���+�/��v�9����������Ir��"���������_���n��t:���3?��3`���L�8����I�x��'i����U�\����%���J��/:P������m���3�r��.~-�{v���J�[Pi�$eD�	.�G��e��,�?N�1������S�6��
��J������<>�2�����J_�CNbG���aQA�� J]�c�`/XE�]u��C�Yg�Dt�Q�	����9;����3@�����z�������Ou=����Ha����>�����Y=�{N��h�����zT�,�g��=���w&Dn����?�7Ei��z�����
��E������k������O����=�����j�����j�#�����lQ�<��������R�YAoP8|�������w�,���e1����
�n3��B]�?����
=����b�����=�����|��x��{�������7����a���?�k��8���j���;�F��<g���G�*�t��i={><��wt'<���_�����p�eP�d���Q�e��lxv�>�9�]��z��7��,M�l�Q�s�����������Fx��f���OmE����/��U��}��9�E4,�Q�z��h�����E���I�z��U��L��5��nu�:=��Y]����{��M������O ����Tk��X��b�h��
��j��hz����	l]U����1m�YU����7���l�U��5��l5�r1Q8��6�S���5����J�
��^���U�%]
�'������t�}��g���`���nJ�U���������_?0b6_�Z~�S��z��`0PRRBRR��!�iS`%%%��~���Nm�m��7'L��������l��y�D��b���R���:Q�j�d��S����s�:=�����7ex�D����j����dJ�h1`�1Sq��������F��������x�>�>gg��59W���_��/t��H��n�kOG�\tJ�b�4Q[����~��<���rm�N����h���W
��������v�� ����H#5�Z�v�N��Cq~��&{�8���t�E�_o���K�����K17��{�Pj]^��OOwN���'�/��v�m>5�H�>&6���p�]����J�����=V��lQ���Qx������q�b�Em)��W�S���B���Vm�q���Z���:��m��1^�����m�+n�c������OT�#b��m�Z��?,�1c���SO�v���|���<�W_}�������u�����Z���2y���5E�`��������U2�����E�3�x��nNH �g�����E{8��K���G�^?#+����T?�
�0�$�ye\7+#P����\�}����^\��������.���z�3����g���wtO]e5�um7}g3`�0�t�t`�k�OM{������ur$����z��Bln��������U�~l7������3l	:��6}�FE��Q����ddjw$��(��b��4��M�m9����8�_%������0��8��[���TO�����t��>����XQ���~��I@s������Y]5��I���EM���^�#����,ml��m�)��
F��N6���T_��ecD�����6���S^�k�:M&���c�,\�in�m�.a�
�G�>��e�q�G������q��Xr���S�c���c������s�d��6����5U~6�_�������&��������4�l`�x_�]�9�����qc��V+��T��9^��������%<����wi�
����B���.�������d��q���`0HKKc��Um��o���}��g�kz�����������Q��uG�6�y����s�0n]�K�&�����e�TyY��w��7���j�h1�P�����b���7r��Q�wMAo����#|�����z�t��g�a|�>V?�)w,���`�����e����l�'��*j�=��*�d*���[����rG=��J��Q�W��xy����
WW�F�n,�����������5����Q�����z�eu���f�:�����f������F_o,����; ��v�h�nY��_��+y��������Wa?=���F��J���Y��9�|�N�;���y�Z���\�1vm,c��M�}���������	
?}|���~�������,���oU{��$'���6�o
������m�I>A���mYV�>6�s7��h�����d���T��0[�jU�mlE��xs�PG��&�s�Z�[�������������n,��]���Rp���'AgA����������(]�=:T����p�����#��7�4���M_'�S#{�S���^^|Y�+�0��H�����A���(�����GV^^�^�'""�'���[�.<����L�����#4�J]�����_�kA�)�+s[��:�G��hy$����m�����S�������6_��	f����PG�voW�����R���L�7�P�N�Z�����Ck������6�1*!�F���5�T���DF�h���)$)E���1��LLiI�G�qQ�)Oi�X��q�B�E��SIU��{_FF������r_�]Q��F�j�UZs	Y�j�#��}a�Hu�.�}���V�^���?��-�����u�j���
2P����s
Gk���=���U���5��P�h��p�#=B!����B!�/�B	~!�BH�!�B�_!��B!���B!��B!$��B!�/�B	~!�B����B����|m�A��_�k�<����k|I��x��]c�����1�����u~��� ��-y0�U��n��]g���d���k����<�(��C�Y�FbU:�_��S-(J���`�e�_!����B!$��B!�/�B	~!�BH�!�B�_!��B!���B!��B!$��B!�/�B	~!�B�_!��o�l�,oCC/��z��������Z^y��m���`����c��)�N'/��;w��b�p�u�q�}�a0����&=�<���C�����)`��gmk��&;��_&����r�>v�-,�D�0��t�d����������O��{�A����g���I������5�|���s�7Y
���.�L����c����o�������7!v#�>u���]�<����1D�M9���������_n���������~�Z����G�m�&F?����p����������U���19���T��w�������GS�lH�n?�������&m�����.�b������~>��m����O�/�
��q��)\1$�F��/�����bR{����������S_��FS���9�}*���������/�]��O�,~��&}i
Q����������j������C��;O>XImMpu����9f|>xi����V���GB<����l������~L}���!�*��xxwec���!!�h��^��=g;�
|��/���za�f?Z�
����`k�����k����<C����7��E���o��o�{����g����L�8���:�����[n����jf��IMM
��(,,d����9���;3w�\���x���8t�.l����x�WD�i����n]�KBl�-�{F�����g�����-�{V�`��������p:j������L�}u(�������G�_C�1l����H��_c��r�������`��e���E���VN����t��%��6�3jN�r����k�oT�]�#��b0!V=�w����$_�����d5���/!6[���fmFuY�_>HhL��C�+��;�������tB�z*KZ��&��P��{�U��.�l��q�1�����aI�>�'���K	�
a��{���[z(�����������������r����=L�U�}�0���_��������&�S{�:.����/�/K7���X,V��%�����#n�1I'�e�Sv����"&V���U���F^Y���PZ�o6��k[������&�{�6r�8+3'7�N��h�-��-��56��
/?��fWx�y	I:��Q�K�m\z�����c�*�^`�jSX��!�:���X�����p�Dm6��YBh(,x��������$�'gxZ��|����`�BII���f
���s����?II0cF�v		�d	����I�AY�b/��";w�d��MM�SZZ���k��E;j�����_d��������+W��{wy���������lg�����k��AHoP�L����7����y"i��Zm�;2�����k��$�.��x6�#N��O^���'�����r��Z�����:F>3������=�'�L���*�	�y����5�W|8c��i���@%a�������]X9=��Q��p�vQ���;�G{m��`u��o�
�,�'��
�W���_P_�
��&FL�t����%���gF8�G�6�6���k����^�Rx�6������s{�l�~�,s�8PKT�9���vb"�~����l�#�NdR�m8���7�tc�b'��Y���@{�^�?w�����n��ub(�M/�O���FZ�n?}n$f���2�;q����D}�}9f��9�]�g�6�|�m���x����3qz�`G,s��4��;�?������2C�5#����K��c��5;��C{�����<;����:���DF�*�j3:��K��?a����=��1b���M|�Bl,�����G�@��L7��O���1q"L�0rd�m� ��f8rD{.4T��
�7����ox�a�����Q��;w�e�$��������:"""����j�r���@���s�V�w��8�J��������0�m���J	�������_�p���Mz�*�4�y����+�����'ep�%���(�VHTj8a��@����������/����_�7���X��,��&"9kd'�WR~���|;;U��Q���18WI} ��o+#6�Fd���C5��Q��x3�w�5.����B�����IeIC ��m� .��K.�����$[�Gq����p]�u�W��V�y��p*K��w[%���C(/j:�g>�LC��-+���q^v9�
}2�A��K���2PGB���H��=?�	��9�NT�3Lm��������^����]����-���(����UM��X\N-@6PZ��>��m^RRu�'�():���Td4	ZI�JF���=��@�--Fv6���-).��}9���L^M�������P��m�=�s�=��E����,Y���z��C�R[[��}�X�ti�_/,�J���&�U����8�������H��,�����N�`��U\���me�����gE�lF.����n
�B�mg�X]R��_�����9<��$;���&u���Dw
���s���I����cf�����0�Z�Vn��f�N6��]%��e�E���"M�m*�/���h^����M�	�Jd|�uV�4��X���*w=���A��
a1&������W�K���!�N6=w[Q�X���7����DW�}l^�l���v����yU~:��A!�
�1zw�]���������z"��c�/J_6���f�����]q�
e'����5�������$E�����9�����))0s&L�������kt�p��\��#���2���ln��vv��Mhh(��w�G�������������t�����5zc��/����[����?�;C��/']�����'w����\�����b�szLp_�����+������_o"}\C���I�u�zt�*Y�z�`��=����v[�:���}&�YO���B�*k�d���wN�W����o��4Lfz���@-���9����K�3mY�v�Q���l��d�}_�w�Uv��;���7(>����������K�Y��S���&�9����5\�:z����-���Y���''�C�to�?z��j�O^�^��a�6X�V�>u`
K���9p�p;�;��
60|�p������x��c.d��
<��c<�������L�2����M��;�D�4y��=��8s�~���������Ax���3����S[�@�Aq\����Q�e��lxv�>�9�]��z��7g���M��U��Hh�Mk���a���IX���3>���SW��]�
y�����^����do��Y�l�a:k��T�>zu����<3t+��=�c�hn���uz�G4]w�Q����
uU��M��+,�����w��dn�k��fk������Cn�5U�����N����V5�]��%u����'Z�����Z��QF�n
e����2��X�r��G4
��(-N��v���Qz6m51�I/������e�(���|��?�����~
�zA����={Bx����gs;_s�n��o~���}���������s��:55���z������KZ|���2�R���u�Z�w���zW#e�g����}l��U���9�9��I|�>�S����PSvz,/��h1`���x���>Q�I"S��D����^;�_,nW�Yk<U��9;�����M)�F��+�{�����N��x��g�;���S�[���J-�S�EP��p"���WF�ot"��>}���OJ�7�Dx������RgA^�)����J-D������8��]������P[7!Vm����}�\�U�bnRc�~������>E�9�Jj�P�\[�!����|^�N�zNj�C�U��z���k��K�������0t��7��q��>���v�'�Gr���Hg�v�����*�JA~�����:�z���c��O�?yy{>�~���O����.]�����E{l�����U��S�n����QUm-555466���������UU�������-/��,���a����\.6l�x��+W���Brrr����[Fa^#g
@�)�lF�������Q�*�z�;3U�>3��Wt'��3�������=Z��*�n��Q)����J��h5�����?��')�;�u�25�����P��F}e��\��-P�3E�s��^�����i���"�jxwU#����f����N�pu�@�n/>�Bk����&�N�l������Y)\����\'G���6�2�B���M9����T�������.�Wwi}�7(������z���f�>P�N�5^�����8-Ts�8�W��Y���c�s{NW>^�@���Uy���b�f�a2�����tc�v�G��S����i�k���J���x~n5�y5�5�k���9�|��(���58��J���6�v�6�]���
�V��]��[��\�imU��*?���e��Hm�_��D������R�6�]	����=>U�mYVFd�����IDATZZ���`�J?e��6�K�]�hR�����L��i������9�|��hk�k�����'���Yf��m
�������oA���[�N�i�k?�wf�����Z��x��'r<|��hg���bK����S���5deAf��:�.������3�x�1����S�7`��	}EUU��{�GDD�r�y�z��qv��������{'O����>";;���p�����l,[����=�������E0i�H�S��u��x�eY[h����_5I�
�w{7�\<O�k���/����/8pgn]8����@c���������?�zM}�G�����SZ$������p�F�o<����4�j�r���p9�yg�v%|��{0v��x|X"B����a��hr���wG�28��O�A'�&l�����%u��w��o9o�~��HS�?��Q��MWQ��c��]$��2m���M��7���X�kY�i���^�LHa�K���:&��,��N�<�Es!v���p����m�q^�-����{�?���f���n�s�����fc��+�O��7��zc)/f������g�����#�yU���`B.E?�{�Cu4�+�����:����	��1���)s�yy����������Z0vm,����5�����		����.=��^M7��'6s�]
?���W��(qxY�)�����N��}D��W��#}��W����iJ9���w����$+�f?�>g�Y�7#��b����b(v�xlRe�m����\s��V�ex��=�	D)�����3���3��_�����g�&;E?O�c�(#��?{B�����L�[����m���0�l��oY����;R*�H�J��%N�Y����f��F�:���G�����������]�����^g�j�������O�''���6i��4I��_���S'(+k�\����`4��?4Lr�,��-���������?cYK��8�x��������:B������&4���Sw����?%,����L�[�-����R�l����y��%X��}�)�&�N!2����C���#�����J���L�����M�}*����lM�_����;�����T9[><mM�_l�	�%.AG�[
L�7�5���&�;�`�[���Rlll���*n]H�<~���f�T�^�������������}������}��U*u�;VQ���Quyc����
g��6N��������B	~!�BH�!�B�_!��B!���B!��B!$��B!�/�B	~!�BH�!�B�_!��������r7�h�t�B�vS^���B!�h�L�!��B!���B!��B!$��B!�/�B	~!�BH�!�B�_!��B!���B!��B!�/�B	~!�BH�!�B�_!��B!�����mr��`��IEND�B`�
hash-joins-bloom.odsapplication/vnd.oasis.opendocument.spreadsheet; name=hash-joins-bloom.odsDownload
PKl�)H�l9�..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKl�)H�����_�_Thumbnails/thumbnail.png�PNG


IHDR��+%@_�IDATx��]w\G����g��`W�wl��bW���b%�^bbo�D���bL��Qc��
�a�BDADT@����aOv�a���]a����l;s��9�9;%���ALY�d�d6�M&SJJ
+G��@��%��=�Nv��*;�_g��:�w"e��U�	�V�`���(���>0�(_���J�H�J2R�������7j��J������YI>�PLLLrr2�x��f1������A�N�c%%v*��s�<���iPPP���s����i��A7�AG��U�R�j�yb����������a}�%*���a��H�$#�������D���?.R��OF]5K����Q;�*H����2��R{ ���O�<��O>��?�R�d�����sY��|���;v����(!)a����������9~����S�r�d�F��mA�uT�z2H�q��)3g��]�6OO1���Jp=�'jk��US�lFFF�[��h��P6x���W�6mJLL�%�+W����2�-{#;e�����H��n��L�����,Yr���G�=w�\�
�>}����W�^�B�
D����T)O��2b^�|9}�����W�Ti��!�m��]�	C��������.\���+g����Re�~��GBs��I��|�����������x��5��_�~�W�.Q��8�{�n��-Z�w����80
�jA���7g��}������7i��Y�fhz\��'|HH��i�r��A�U6K�r�|�r4�����S���Q�v����
�h����_����C����
_K��)F����-[� =7n�����o,@�/T���-[�X�|��mR�S�"���y�:::���-���N����K�.u���{�����a��	`8g���GU���T������}}}Qw��^�z��������/��AIC������_�;w�N�:�mB��� �g��6l���_�p�����N�:c���#G:th��m���P���%���#���p����;vl���0  _�re�3(=�
H���0#�>�y��	��~���^�:P��g��Q`��
L�1�zx2x��~���C��j�
��s'%%��w\*V������D�uqq�� 9FG����)S�f����V�Z(��@���[p	MF���L-��'�?w��q�m���]�R�J�5�o������N�:�D����|266�{���
�R�(�f�5<�0v��*;2j���mhh(��hTv��C��n�B�'��02O�*�)���${�'�������{��ta����u �P��lH �Z�^k��+IE��C��=�����7o�����X�b������#F�X�l��a��s��U�@^�z��Cs�qG��!�'**
r�K�x�R0������O2�H���r3i���{���W��h���x�AA���!������SUYQ^U
� ">!���������9r�j����;�WL&�<��S�d(d����?���@\�kh�����={�@��r��#�k�����8q�D�eY�f
��\1k�,�	��C��M�����P��Z �������y����,����������dr�y�J����S}��QVr�c�j�����-�
cd��p��)�� `���1[�vge1���+��M�``5dL������'�j�.]��,���T��uk���p���� �F��)|�������u�����)C����@�
�?��o��C�|�*��^3�W�����'X�@L�������IJ���b�����K�2vzD��7]t��ad
~�p�OG��3��4����2�$a&.�+������D
�d�RS�������$�Mcm p2N�,:\�Q���{��Y
e	R@��Y��Yj&d&)��4��1��H���u�(�!&�8�I�Mf�k�
Lb���"��$��2����/���"���`h���.%#@6	�j��R���?`���_�v
�j�&M p�((p\b���I�AY�=��N)[G�=J���U�K�He{��?~�x�"E`�p����~5�7(�TfdG�	��^����C�!�w�R���*�Ld��N�8�r���}�
<�KX�d��9s��n�q###�u�����O��������[�����;�������ce�7US�Y��:��G��M���Fn��H���m�>�`3|����#""��.@�A�@� 7�7���P�}}}!F��������:G�
'�a��2��g��0xd�Z�41���o�_����j���C��}�<���D^��f���G��Cg���g����[k��y�������o_��5
t���-[��S```�����B����[�)��	�d��������<|����f5)�A�3�Z��X���:���U~��8�HU2]�;��W�^�#�17o���4�AH�J =			7�rV�`A<^�bEoo���'''��R�Gyh%%Z���N��8WU��q	G8.o��9v��~b$.����B;!��~wwwe��v������G�_�iprr�����������cGA�]A>��AR�R�pZ�ti<R�dIX�#G��-[-Z�$&%�����J��C0`�+U��)T�P�Z��	I+�����0tN����];43��R�U��D�yP�J���Mb\�,,�0Gggg���w��E���-g���6�&PJ��~�������k1M��f��B�g����~��7t���Z���v���]E��i�3Q���0z�7���y�Q���q�
]b��������%�<����Sv�c��xY�f��E"��
c�����1�F�Ehx���B�!N���k���:U�)T-�b�V{�X��J�k�,*:}[�4C���h��w��)P�@�L�(�����B}��N������!&&���+���/\�0n��
#L#�)*>j��?��4U��j�}�N��C��,�)�*C�W��'����g��i�;v,�dO�����S�zzz:t���m����m���K�������)�����NPi�G��?�=s$R����D������:������
�������O�����^�:��#���_�%������9�����������W���-Z���C��u��u�V�)������7��Z(�����$��?��*HW
��@\���)@��-`�6YiC��g��z��y�"E����j��������W�^A�L�8q���&�0y��a��-_���#���_B3A�\\\(���u+����[�Z��4U&���W�u�u��E�F�)�hp*��o(|�s��)t)�K�F��G=�B�D���t��`�WX:���~��NQ������

JJJ�>Fe��7h���O��U�l���a�D��u___�r��A,,X���qC�<y 4&��&1���_?�{��A���i�ZfAK3e�`h\����v�EGN��U�B��p���E�!�&��AV��Z4�����NNN.D��Q�R�
��l�2�#��G������B�suu


�\�2�I��y}�X���j�}�N!)q�7n�A�SG����#�<��(��������g�S��3�X������(�?� ���FV	��F���w3�<_�����<~�L���f)�G�7��a��R�X$���� :��qM�QCy8/H
����L��y�������������=�/	�����n��Rm�l��3
���G2���3�>����]�,�v���������p�4�d��T}����w|C����;wn71P��!?~:v������C�#F�*���[�&WP����/�;�:R��<yr�&M����~:�^V�o�fH����>x��2$$���}���E���PG����������u����'On��u����HR��E�o����x�{W�^MHH����@9�^~�����k����kh����nUK�u
��*%Y�^�pa��=�Q���p�W��_���)����6�e�������� �N��q�v��f��-c��Y�d�7�|�c��#���?�Z*88��O>�1c\����^�z��Sf�S�Rll,���2�g$.f	�X�Y�:�J]�O?# _�|���8����z����5GG���C�a��6mZ�N�\����s��{�n����V777������	�5k���)��^�o@
Y��O��^����w���a+��C����t�R``���3���kH��YLLL��l =@�8/^�����+L&�77{��������i"�@�|)g��
�X����q�}����.~CX���[�1)�:
0@>>>'N�X���'����C!^��7/]�t���,�!���+W��9�������Q���K�	9~CNbm1�,Yr;n��)�����������tk1�Hb���9������Y�N�^L���HK������!���b��7#�OM^��/�gg��^�� $�'�B�/����fA�f�D���8!�<��*~2��C���X�fi�� ���r&�[$Ul�1{��T�+���Te���G���(��?%H��Rg��)p?  �D�lq�\����T%���#HB'�t���x/\���Q#\��s'��e���a��X(I���R!�HU���{�^��<�]N�h/A�H4g��+V4X�P�>~�8� �����8Q��"����3f��{9x��q���L�6m���p��i�M\\��iRR\'�pBBBDDD�j���y�r���unU���o�(�	wss�0a���Q�&tn8,heP>��	�Ui�#!��
6�����������;|�������{�����W_����?��N�j%N �:u*�R��s����������������6���B�L��cB�
���
Q~�v��@����1����.����2���c7o�|��!���I�o�^�jT������k��:v���qc��4����}���^gxx8�=#�O�*��"��-���;U�R}P�f�%��3a4A�
�
Q6������4y1u�b���s��y�S4{P�P��L�V���P���	�����+W��"C
���QnZzRKgZcP�#�|��y4��#G:t� ��:�R�X$��>>>dkh`�f��
���K����% 1E���1���?������/_��??���I<o�T��O:�No�j��T�L������\��w����$:������<���oH@����k�'O��!���-I�W?��#���@�Z�h\o���&.^��+���o� 2[�2�r�=�A�M�J�	Gx k���;�G/h�<N�������4��~qE��k��'��S���|BI��>��&O)�����DD��
2Y���K���j�}�N�����o�zh�����������eu0�;J�������H2t����U��$�>}�Z�j���W��P��/SZ?����a�)����+T�����S~~~�&M���1b�H���.\�0a���6�B�
���[�h�0�q���u~;������j)C'��P�6m���3&��p�g,�5�f��	5�\�X�n�����V�Y5c�H!m���@�5  %3f��:u������;w�888�\��t��!!!@��N�*U���g��L��y�f�����?z���Z�l����~�������k1M��&16������4,n��p�T�re8��_�����^���H$����*U`��2e�$''CJ�U���/��_���9s6m���O?���35d�($<��7o�G-\]]��x�.�~�auzU�����d
U\�r%>>�l�#[S['��,F�����P9����(�}�'O���`Qo�X�":L0Y��9�G�����1�n�*�(�Hk0�c���Bz
�f]H���c����3�������)��p[����	����o��P6k����!+�.A��`���qww�v���U�]bb"��)����60���}���Iu&��S��@��~��I���f�Y�f��E"eyFx{{�(�o��r<x�`h�,\�TA���}�v��9[�l�/X��|���Z��u�V����RG���*�����S��1���������E��){�?��7?<��{
_k`[A�|�;��)"&��6�,!&�S��l�.�5��a��f)Bk�n��g�����R}��'���|{�8Q�������s&��!#��8J�C��.���Zz_h��e�D�f�3�)��3��7V�O-�NUOI;?�fHm����<K�-�x����)�C[� ��U-�/�)����������j�*8��[�fk��������%`M���;t��o�>��:u�����~����m�/+����gr�EO��S����%���;���������������J�)�1�+W��f��@�\����T%���c�#�����e����W��9�h����5�����jll,td���{���:-Z���������/���w����Vk���T��Wm,��+;�j��i/�!w��]�d����i�������&�x����h�F%������������w���G�a�����...�����5{���>����'O�

�T}��������k���?<,,�L_f&}��HNN>v���I�h:�`���D��������% ))	m���r��A��t����wo�&M��kw����BG>}��S��O�|���)�=�����A&7o��1
�w����H[[#CF�n�C}B�x��d���~�������Oq)!!��.��3>>���(�0�B?�<�/����q�v}�&��
4���D����S��X\Y>q��[v��)�GHI��p1L���g!�H��#6m����A�#�)S���
Z�v����G@�n���?~���(��y��+��NVk��
�w!74���x1��&&�6>��*��E"�<�����R�B2��&-��ZLt����q�Q�G����_�R��:����ZLSe�YL�~E}�z����b���eN���T3�T��'�-Y���o��~�'��	+IU�_?��:����ZL�a�I��B�M���1��%���Qc:��,S��3+�~��b&����Rf���cez�����:��iJ��
�e�X���������a<~�"R�X1 �7n�����xie$�i� �R��lL\hJ����o������h��~��o�2��'O�������U~���.�4i��A��
�;l��y����e&1�'���"�I1b�Q�
"1����L�o�jfq	������������iJ6F��G��D=�B�
  {��������7n��Y��(�{��?������;`���������O����!I5k����f�/�h�*�:��x��?�L�����v
�.�JNN�`���������FO�<)Q�(�����n����E����5k��_�~��]�i��
2d��%x�'�|�p����K��[w���Lv�`
T2�)zWDD��1?��~J��k*�����B+q� ��Z�*��S�V-�8^�,���`�<��4J�~���s������7�b����k~8�]T���W���8Q??�h�������e�9?������l!��_~������n����q��w��/^���������q&��I���}�n�:T�`��i���2���)�	d��+�k��$��3f����+W^�~�F�d����Z(���_�����-['�U�V����Uc���~�,�v���Q�)Zk�~����g/1����|V�J
��ShrZ;������$k�OLt��5C��i�%s�)�#C�*������{Ofi~�I�Bf���q��j��.J�GK��H�C
���>�u?�2J�9�,Re�:mfi�����_k�o����B�:e�w����O�=AAA0�l�$&�f��
��A���mMz�����:��K��NN�+��O��qc��)���d;c����)"�1y�d������=�.}��g0O��a��>�6��d(S&�?E������
�f�$��[����>������=J�"��{i�O��x
W�\����?�=����}��M������N�:����-3f���[������8��;�l�2��������[�Z��4��"�9t�����L���x1�������0Y=H���,��p�|HH���#J�T�r��}�p����e����g��?�����k_�~��������-�������3gN�R����6mJ
�>��'�7���'M��*�����Xd���@��.]:00��/_�)T��V�bE�mP'�{hhh�\�������o���o����O����fE������80u�H�o�f�HHkAd�������z��J���s��%p���[NNN��O��<U<��Y�)��]"�� vj��Q����v�����h-;)�GpJyh���[��w9�>{��T��5O���TF��uT���r�*�K�H�K���(Cb6n�{
��f~���~F�%!�`�7��0
�%h�YC)���(#U�t-�b���m]���+W����K�.���=3f���%���]�6i�zy��:u�@{_�z���h�36�TF����I�����N��8A�T{������Z�uh�]#��l��D%�7k��A%8V��jQ�h��f1>I!J�5j�cu1����N��o���~R5
���������?U��F%l)�y��LV�<�	���+T���lb����Z�9Gv�7�4N��'*�G��S"��m&.f)2���������-V�v�H����_j��cag?�@7��
H��q�.�'GPFWo��
��E�m����{V��4�,M�E���[�dI0����D�����-[�w�n�!� ����'<�E���5��������h�^xaaa/^� @�DL��CBB�yu���TDDD�<y*W�l��k�I�(�4G�9}�t`�T��1��%�<�Q��L���:�&~�p+����H$�'��k��}��E�
4
$���S�k���y���C������u��I����/:��Y��/.\��3[�/Z�~tX��B�r-��2����]��
�GH0v=Q"L�+�����T3��=e��G����$�R�p���N(jxX�����l��
����w�B�����F��r�p�h���&q}���P�m�$�	R����l��Y�������{����__�~�!��Z�-&�����������v@E��?|�pRR?/��b*/P����c�����S����(0=88����w�������
9�G����4�����*5m��K�����z�\�r���0�#@�P0����T�R��5�+U��q�
A~QS'��Vu>`k}c�kWv��E���+m�o��o��s�������?JQAE@/�2�L�1�8OO��7l�2�����0~�$���x�U���	%�:��q���Lb$	=��<$Q6�
���
a#��n�mZLVM�V���P��5��O3?\U���m�o� �Pp���A�ITN`��W�3�;�X���
�l`$��o9������ H�\�v-��@-QQQ�����K�(�K���7�U�e
��M6q�J������7��^�����'#
4n�8��p[�"���g����������l>y�d�%P
0
w�~����*�3gN�P�2-���Gy���@�811�S�Nh�	&�n�N����`�;��~H�U��D�y��p�@����������������N���R����S��5�r���i�~��G�%��'OB������_?��:����ZL�j/R���oo��9�Amd�:��?,!v��N�0�-�����	�Q�@(�uBk��?~���G���
11b�W_}�-[6�b+W��s�R�Y�?t��Y\�,<<�n0��b��&���>��NU�TT�Y�2Z^�f��0��������4m*O�<f�78`[	7C��lhz������j�}�N�YJ���C�
|�����#S���g�7h0�����W�Z�6��G�>�����3P�����3gN����t��{�~ �4O*��80`��s��_����+F3���xB��7�P�8n�������I���Sg��&1|B�[)���(#U�t-����]{����8:v��l��t��e�PHq��>��o������E��^�n���I��}�$#U��UK���������b�
������i�ywD<p�b�{d�h�����Q���f1�#HQ`��I	BC�8SB��	e��
3��;��pJ�62x�fs�T����� �tD	�J6��1Tfx4�.�H�f8}��)�0/6I>����+�U���T%���c���t�7`��DFF�@���$3j�"��k��9�2Rybd$i%���Q}���U����r�F{��b?���Lhh����{��M[�����D�y���a �U�V=}�~����A	�+WWW~�>4�����H���-Ru��S�Z��4U&S������Y�����aC��c�I�K�?��T�"�>d;}C���_�xq��M��~���������;w�'�v��?"..�����i�����;�
��������5c�Byz2������3��_~��e�n����nl�7o~��m��Y�Y�>���*��H���s�,�Y�V-X%xX�!77�m�����J�������_��'O��^�z��PK<����9s&�5�%������������������:u�<y2��6m�������x��u����2�z� �����G�w�R���*���F,X���7(����b(��R�J�z����8��I��U����r�
���U�^j�C�@B4�R�6-&��w�Zz_�SH�
@������;::�#x;u��]p���G����g�S��w�S��/@���CA���g�^������� ,�H�������<L[����{j���:w��[K��Lv�.�~�(uD��Y7I��~���,z(����(24��n��:SHH���X�`���'��j���{��B���n�t������_�~�����5����y��-�3���><g��]�v����R�\#q1A�VbbU����!��������U$W�y����k�����8��9�BnB��7��?��c����������pAV�����������f���������vK�F`�Y�E���2i�y-lo��#;��&�z���T3�T>��g�#��G��e��_e�_��V�V��P�\�i:L6s�Y����?�.����@6p[�L[��"��E���x���2�K/�&�3�+��L���l~�r��)��*p��}xUpS�]��:z�(��O>����v��Xs�����g�~Ct&M����9k��E�C�����cccM���			QQQE�)T�<�����u���.����7V�N�=����o���������cJ�'���j�rY�f��E"�<!��M�6yhGG��={��u���#c����s'�	ND��q�^�z�):w��#$��_�s'��i+V���+��O���#��|�����r?��.������7Hm���,7x��u�\��3�����;O�<$�(!<W ����Y���7o�\�v-Jp�a���E���rvv�|��Ss�S>��"�3gN����K��(��Z��X[���@K��k�2��{�Y������C�QBQv�G*��f��?~<L-C�q�totX��B�r-��2�|It�~��u��
l�}�v�F���S)��l`.�:��S'���N��>q�lDX�f��07�K�������j�#P��J�*\�pqs�3g��H��)S%&)i}=#�)���7~���K�.T��S�`\LlS1��@�� m��1:����C��%Kpm��OLt��+�l�5k�L{���A �#��`���8�i6|}?����E�:^,�:��$�1@
o��m��G7
��)	��fS&�3�L��������|oF����2<�aj�<L�X������f8�a���N���~D�������g/X���V�W�f,){���GGGCV�i~����r(�
�S�V-x����������e��~���"U�j:���ZL�j/�����=j���@�@}�"��9i�$///��4N�n�������'N�����l�����q����8h8���� :���A� m���&U����I��u�o����%c�
�*[�l��}��������!�����~���@@�g�����!C��@�*T���];�#""�O��y�f��A��^��W�o���R�����J�P������$&9j�>B���C7Ege��[���B@���&Y���Hx������2J�_���I�[�n-_�|��
;v���+$�[�h�8p������W�^�e���q�� �������O�:N8��"�)�?���V�NNN�Y@ZO�<�Q8(��N,��Kcq`����l8�#F�����}@��l�H�,^�x���nnn��w��L����`���/�k�6m�Oh��O���B����/_������mf1v,�����z��q��H������C�}Y�N�:���744��b����3�1�)S� ������AI��p� J.6�kM�Z�
���F�*�TK��Uq�_�~]�vE�C���U�Vw���Q��u�����D����uB�������F��)�Y�.��&U%���,���6h�����a����/�[:s$�4����6n�p�h�(
��3.�o�GLY��?��?\�F<���?<�	
%��� *��������A'������.���;U�R}P�f������'����$�?0���������-]��nUK�u
Y6qCf?}
�?/�m�������?E
�h����7����o��F�b����/��03*C�l�\e��F�	����7m�|���6~_�k�����-Z����x��R�X$RP A��_�*U
d�������N����/z��9
���DA����Hs�qs�����?��3b��Zd���aaa.�������S���|�����l�����ccc�mv��	��A 4<�a��/^tuu��a������������a___8Ps�����/�����{��=s�Lx�������_U����
�s<}����������c��������
�hte�oy�-�J5c�H���8M�S� 
(3�c<h�ph����}��5k��E�{��E���;wxx8�z��U�^��d�8Q�M?��:����ZL�i�S�N5h��i��[�nE�)[����QP#���?}����&�W6����J��>���������ZA�L�0�.%''������A>�������cBB��'N��x��$�����nUK�u
YO�F}�������Z����o�������h�s������3�Gz����.=~�x��������5�w����gO�D
�V�h��
@�����C����S[�`A7/��)��@6[�lY�v��i��4��	?v{�l,�+u�����bbWa�)�7`����pl!&�g��a8�a�W�o�_�R���:����ZL�j/�8�z��ITn�@������l�;��"�,�^H���U��m��v~8?���g=���d��j�6������N^�@R��2�K1%�'����R����������	��}L��B����	���~:�^V�o�fH�Q��8���+^��Y
�+�b�f))�����D����s��	�l�B�����?�D�Y��������������������aaa���������a�xS�N2d��1c�~�����'{zz�x{{�l�^��e�J�(a"��c~�ep��?���+Y�$����E�H����!1�'�Q�F}��w���@;E��Z�j��������D�y��	� "���+�DDD@�>����5k�	���� ����������T�T)))�����G�vqqQ�BI�~���cbb`
:t�p��*1�N�����j7;E�tLd�<�-
	.R�8�����������}�����2e���C���r��!C��i������]�v�2�Z�v�Z�d	2�+>�q�9r� �n�8QP�zu__��������^��G�
"w�@!����&&&��+�����8JM�K.]�*�s��]�t�~�������(�v��0�}w�V����Xc�T)���f)�o�9s4@��+�B����q
|�g�[��#�;o�����

�U6���g}�X���j�}�>0��B�~����K]�B��b�h�*U����<ZE6?\�,�S������2��%���+��;%���m���s����}��Z���#������`�����`w��9::25������f�c�={V�F
���q��K�f%vV�&12t�Jp��'Js��Z�IV	���(O|�4�����8�bbbRe�MJ����P�[�b�"�$�"-�,��l�(+Q'�|0�b�r��c�8Qh����-[6�.k;|c����RH4�N������/_>^�xg���6��+���oL��(���S����(EZ�6�&M4h��!C�xl�`�7i���3�*���lT9]"�]�������5m��<y��~��v��r�U�q��l"��yc�D��������7�/^]k������Q���������
|c�6YiC��g��Y�f�\�t)66����7n���������a���z�S�Np�H�&L��e�����w���n����[~iU�����[�Z��4U&S�������/u��G�??�f��%K�LLLLI�;�z467�;�U�T	y��i?������;r�����!%����?����#,X���9o�< k�E���!�>��r�v�����/!�w��Q���Z�� �j��_kC��D*[���������(�6��S�D	7,Q���~r���<((�:5�Sy����[�Z��4U&������Ht�����L�[������x��
Z���va���t2�h����ooo�m��=x�`��a������K<��S�?y��}��w��!��S%�<=����������Ds��-#_�w��j��q!A����gO�@�^����3+V��A�g���Y�p!������=s�����?|�����He��{���2}��h����ZO�>��.R�H�q���>�T�^eFv�~YOL�\�q�W,bd%�:���u��n�6��
�y@B� &������d/����L�V���P�aJ�\�B5~�����&��3sI���_
����"qg�f.������@���#d M�Z���(t����I��7�{����a�����!1�/�G�@�H���y��A��7�����u+ 9`����i�CWWW\��ys�6mh~8%&l!���SY�'1��s�N�9��U������~^PSO�\�����������d�o,ba+1��l��]����o/X�`���y���rtt���j��
���h���j��u�.����jXXX��S~�p���b:�No�j��T�L����.�6m���C>����Z�L�Y`�#l:u����[�f��E"�<8:t����.]�_�~��u���!���
6>��/����O�;'����p�W�Z5d��'N�n�z��9����7�,Y��R����I���-T-�b�N{���={�&�4����X����=%&&�)�?�|�?����"d�h�]B���Wp���$l�!y�p�?������{���
6���7���o����Z
:����������c����
&�A�DGG�7���e������}K�/���"���
...;v�x����k�<==qFk�B#�6�S�a�J�,	�k���9r$!!!�=p�4k���7m��~R�X1��
z'�exx8�����+��5oV�X$��S`��� 
�(}��Y�t)�p��mq�:x��I����+C8 %�W�V
Z�h��}P3�n@<&it_U����o���;w.L�g�}6h� ��c�/&������KVh%s�K"�`u��Y�TE�~�4)��nb�K3g�D���Yt��q� ��,W�|��`|CW�!BZ�+��0���;�@�g���fi�J�)������e&|C�(�Bo������C����W,�,%�:��o�i�a��$$DX����LX����-]��������2�XA%���C������y��1���� A��z>N���a���;w���O1>2����&i0��~-�X���j�}�N!k#T
�Bdd$
�7��&N����5|�p;�����A���
6n��2e�<y�d��������D;���|�v��� �3�j#8��~�-<������7���w�LZzRKgZcPd
d�7C���d��U3���D@��xi�-���5k�������$����Y��x����:t�p��)�!OS�L��y3�rWWW�nj��-��P���tX��B�r-�i��D����S����q� �]�l4�r~��Y���J�d�h�
F�*Uh������e�&''C�<~�W���������1��i���[�Q��C;B!�N���QK�.]�B�R#���aq1�����������5���BR��h�W-[k
Q5�Z��-b+��>�����R�JP9��g���E�7o^�1�dC-���l��.\����x*""�������(g��"D�O����P�\�i�L&��d�t��^�z6h���}/]�t��Y���
��n![�"���+g�����III�}�����c����"�������qWQ�+W.�k�N����2M�6=x�`tt4�
Tr���B
b�
n�Im!;��,�&���c��E���X�O>��v�\�`��K��wo�h#��
!d�Z�����S�Nd���4�����������>}�a�r{�����$����w2��:�PR����G]�jU��6m�R��|���C�p?M��g�Y�������<(����������R]�K5�$H�4���l��I
�����2KU��&n�.�Q��bSe��d\;���y������Q5HT��pFC�<�����)B;0�b���,[�J��(��d$���^:�����9s���H�e���!�r��}��{w��e������L�8~{�-�Z�s�I��S�'C�###�����8p����(�����Gfih��-W}�*
�5R>����� m��}���G����+\n����[i�
pq@@-����_}��!����5k��y���i-�X���j�}�N�Y���g
��t�RWWW����G>Z�)����7&1���I����`�~8��s�[�n;v�(\������l��m��+V�x���o��4i����8�f����U���L_f}Ch�s��&L=z4�X��?*:5�/i��SY���*?J+3�<&+����H����C�2��_IIIy��E9��Q�J�������E�;
�N���7����u% x�x���k}�J��Oj�
�*�zI����6o���W/ww��c���}�0~>�'�

upp�W���J�t��=�����o��>|xHH���'�~��������(������(Ai��������T-�*��I���-T-�b�������PMZ]������@64��j���D��a��%��/���j�� ��r����x�v���������a�`^���!@P?����J=V���������r�����Q��r}[�j�t����yn��7�|BI��>gG��EL����b64���{��D���CM�${9�3��cez�������ILl�$��0?\[��$���n�����FF)��F������Q�}�n�_��{m����oH�A�L�����{�7$���G�J�\�4������,�V��r�����P����h��`�C��j=���gu>�����"�@�9r��V�Zw���������f?����|'�hN�c��?s�)����/��n��-Z���~��������G���q���7f<v���y�@@�R��O�>j�(8S 	�$�>m�����X�^�D���(��2�Y��
��f�)���
��={�>|x��!C���{wV~�e��w-��F1�� �U�V��v��)�:�J]�E?�**�q�4@��;w�z�*�	r���?{zz.^��{�������u���=z�����w��U�F
???�
���U-�L�������k1M���)�;wn���%KR�6x�� ����QL���?���B������'OHJ�����;�����#a����W�J�����#]�~=)V����[.��g����g����h�/\��?�W�^A���.HxS/�[�*NNN�]�����}�6M!���h���K�mm�<����c�hf���~4Q�7n���wo�������G�(�`8/_��<�����u"�
�s��%����+�#3f��T����P���\�r`�BP�H��=<<N�>������#f����K��
4S��m���k��p�������dI���}�����i"��S�N@Z�s
i��E����o���*_�|9����8�A	F�J��Q���v���/_�9f>~c|C��T��7������@��u 4�c��2��H���v9��*+�(����wf
�f�?e������&n3w��R�X$R��	�@�S9�R�|!���U�i��X�g�H��PM��� %,,������&<<�R����,�W�S��*`/�h�9��4Q������F��3w��upp��M�8G�fc�3�H�kv
2��O?���V�Y5c�H>�"������q�-[�,]�rL�
��:�X{|||�|���=���G����4q?T��_~���s'z��e����w���9s���t�*U�|���`�`5g�W"�
�	�����Q3f��Y����?t�����*Th���U�V�s��uk8P4�k�����=��)�
N���#�3��g��}���;w����?j��������S�K�������5�!��z��)L()V�	n���BCC��[�~�����p�����K�,��8�H��A�-Z������3�1�����)��DDD�-�v������b�p�n�����9`�`��&JF�<u���Y�e��{�u������C0�g���]R��q�n@���A�����r�4ib�>��}7���l�8�����9�2�e4��*�����/	�A��L�:�l�9
� v%&&����/22�$n�������xzd��O�	~�U�)����^�D���_�qa��t�������
*��];�x?%�Pu�N�)<������>��s��}7��&#@�U<U<��Ye�B�8R�r�h��Y�r��7�W�N"Ba��5qs�~�z��Af 
�U�V�����H�
<=2��'���Q}���y��l/U"�5BO��q#z��Y�f!!!������J�-[��stU�,�W}C����m�%8�S�paA�Vy�D��U�WX�d�NW�(�&���y�=I%��X�����h}��O��P�_�;��D�i�����+����QV"�4:���a|�����Z�<g��� �������}����(���e?2���Oh=�J3�����=/_���$�N��������S���iKd~�����:�&�4�3��7������i�i�n�x�{�7t����S��u����������������'��������L�S�	����xT��&�o��}��W�}����u�=zT�~}�<���5��������q����V���)OO*{V�v(��!�`
<Lx
�6m?~<@$�T�R������NJJ��w�����X��p��=
!cbb!m����>BJ0n�����l��h��e{�I���p�����<�����?�6m���?]5x��f�6m<x��#d7;�����!�?<�z���^�|�A�F���_������~���E�-\�0<<�Chf��	?���m��e������d��s���s��)H���W!F��������o���}K���*	���@pL�\���H��P�B`_���]]]������6n�����.:���G���(Q���3��a�4j���7p�G�-n��4x�P�h��M+���+��E"���������8p��-0�P6S�N�
���g�=��z��������W���O%K��������*G�~�������k1MI$�����a�6lx��5�,t�<y���p4$�����@���G.�	��6A\80j�(p
7xxx�_Opj���`^���@��}`�p
Se�f.��~�&p����:�)����5k�b��)�r1��e�f�Z��T�}"�<�nm�����Pr(����<��f�#��������0��K��tX��B�r-����U�R�j�z��A7d������H�+���&�O����Sf1����S���[(a�3�����pFs�L���!6�`��O�,���-
�~�V�eFy$�i<�[��j}BI�N��u	�G��6����|��I�e����`�T���Zz_�Z�:M���T�b�(Zx�4�������[�n����l�����[74hu��=�5rpp�**����1d�F���YB��������%�
����@!��'ON�>}��A����]@����Z�PR��w0'�:uj��i���^^^c����8q���K!.��
�
�Bo��*X� t$\�'O��AE!��O��i����nUK��<MT���~Z�d��]�P��+W����Z���/�>�q�u��<x0�.����>���Z�j
2z����t����o<x^���Gs��=e�ggg8��mp��X!Y��uk�"EJ�(���H��	�6mjg�i���t�����Kh����Wwttl��E�a�d`�#%���&%I:D

+N Es		�:���CIDDDbbbLLdb��
����F��_�b@b��������%K�j��Y�f�"-B4�������k1MF$�+*K�;EFF�E����/���o�%#�#Q�����K9s�DI�5�N�xhu��O��!Q��
�?�l/Y�W<x�<�L`�X���~�2e 40�w�~��A�L�
A0���3���U��m�V3u^���H$��o�����O��q����7o�����Y�q��5!�y����!����?>�<�"d��|+��W~=c����_~�����;v�SdS�f����oLb��,[�y b����+��7$�P349"��];�'8!��AQX�^=\�������C����e���fZF�$F��i�(�F���ys�_�`8�,-�i������_��P>��������J��I����@��H �*��q4N)�A��tm=�o;��M
�9f�Pq?'*�K���'�/�g2b�pF�L���`oe
����RR��X5�'�6KJJ�ILL)�b;%H���H�G�]`����������+��b�,���cJx6S�n�f���D��X�=z���v�=c}�"��	�v��!^^^�����{�7)���p�0t�PP��|���0FO�>uppP����?������+����z��}���m��K,X���������p���}{�5#W�![���a�^�p����?���}����a��������W<>>~����7o~��|@�?�o���x&�7&��.
�B���;����_BB�o��"��BKC�*s��)����#m7��+��\�r��(�o��{�n������G���s����^�~=x�`�?�L�2~M�X��S&1v�:�O�T���AbP}h���E02~�E�H�B��9��E"���2�8����� ��+��h4��1E�E����������C������j���zQ���'V��P�\�i<�� "�;lB�:u��K�7n��7P�P�<w�$�q��u��5s�V��:�PRhQ�"A��R�/_��������&]
"a�@LT����;u��`.�#�{&�S-|||PG)gg����C��2��<�O��{zz����(�o7}#��
�=@� .���7��?����F'�m�AP34�W�^�24T���������PNw���L�o�hV�b�r�g�,���u�����?��ZSL��t��O@
�36%�_Ab
$��!�0Z����U2�3������<����Y3���!�
�E���4��z��=�od���H`���5��	i'��{�9�FH�446�f:�w�����v��Y��S����Lu3ybf����,�%��Y�����Y(_>?�@|C�������%���(#�:�R�X$Ry	l���^�z�[�>~�����4hk���y����7K�����L�OQE�6m����st|����-[�j��`|C$��9q�����^sv#��)a���R�Jk��]�l�p���DT�R@�766��
`�a�������w��B�$���3V�/y�������s���Q�F�>}����`|C8��k~~������@{C���_�s��Y�G�	�i��I�:z����W'N�8o�<�`���PK�
?�t�R��'|�����
���������c��U��6x]H�2���}S�+W.���!��D��#����?���q�����>>>{����;���/!���p������X���7@6�f���������Y���d��;d���i�ndLF����_�z�����}��g�`��
�{P� UP$0F`"J���y�2e�`�:uJ�*u�����8~���sF�?E��_�[P��u�>z��X�b��e�a���A�<|�ptt4�P�]�v��~�gu>��P?���)���O��aaa�>�V��F!�[�h%nWS�jU
���c��=a����LPO�������2�[���B���3?��#pt�>}�-Z4t�P��`;EF����B�@sx;���,h��F��|�Z�p����������,*��������01Q	�e����f1:�BmV*��E%��,��{Y���~�������L���PH�b��XM�lF�#H�%�M���c}V�$���V�3���	iC$��<?�O���.����[�Z��4Y��X	��������E��7�<����q^�xQ�-��}�v���i��S�`�i{	'*H3>y^��'��bV�������	��r��};����~,�6q�D//�Q�F1�(#�FrC����xzz����\�~����*��~]ad���g�N1b�Zl�<*���t���,��cXP\�J�}���3?\�&:�]�6Uk�z���2�^�z�����j�"�|��4%J��sS53u��i��������7o�y��//[���{���o������'Op�����x����B�h����3���xq��
�6m������U���[7AR��G��P��<�&X�f��E"��
h�����.]j��%W�\qvv�~�:���
�o��#G�5k�@���@����������������b�/Z��uX��B�r-���	
�V�
OJJ�$���X�"u�p�
KZ��Z���Mh{???�
�������!F���y���A�p,P�@LL������
EU�\9��(����
��4N�
���=((J��}�/N�>
�e��)v�G����4?2����WC&h!�\��*�����P�W�^�y�U�? !�R4���&:%#U�:���z9OR��*������u���~B������P��5
�����I�"E���|�|�h��=i�%&���<�)��K��Nk	�<���y]�tBF�T��U�V-�u��V�?�3���V�B������s���1ch�����C���/�A�w�R��iT�F����D�#�-B�B��-BK�����4J�uhK�T�[���B��?���"������,
�d�@����0�r��<'�+p7N��v�!�����,JX$�,F���H#�
/.�?pV[�A����I�XiJ�����l�;e�e������?Y�)���\W(���IEND�B`�PKl�)Hsettings.xml��]s�8���W0��I14Ik&�1._m���;�V�6���d��+���v�I��L���s,=>r4:�0�piG����]+A���q]�G��������a-�~A"�8BV�%�������%��(���� �	�FcHV�j�k���W����
���4M��o�P6.W�(�KWU}J��xWS���MQJ��,�����qy�]+-�|�5U������7�����Q�7������&M�&�_{M����6.����dh��
�,�������y��9��(_�@���+������]���F���N��w�?�@|�H�0X����4o#���v���`�M.���D�Y�f�k~������	"�R�T�w�B+a��>�H�Ip�c�|�|��r�2�@���14��CRv@�C&�_������s�>��}�h��6 �-��'V��������+�����j�
A��G�F��kDg�.�����y���`3��T�tOq'�i��ut{�b��,���7\���iL��J1�P��w~�<�{*+\+\+\+\�
\��W��
�
�
�
��;�s���#���
�
�
�
���'��IN��Ia�>V�V�V�V���A�sj]�[�=�
�
�
�
�/�4j/���������K�t�i��o�7�;o�T�V�V�V�~��V�A����_������?Flll�?�j/�����K���fm(`+`+`+`�`o+���N��)#�C�<�d����9�3����Sd�{Ngp�.3�d���N��|w�-����dt�?~t��IEQ��M���3U�b���1�&T�z��Z=9�a\��.���$"6M��c�	!�;����D`D�3�<�����q��\�����p�/O�*��
���l!y�'���7o#9P�I�M��4���<����qgF��Q����
�'�m������x���B�@6��9������x���x,�	t�}!�������g:!`��� �!#&G����lXZ�a��c<r�>���%;�2�-��l`r���2a�f-�����7l�5B��wY��3p}1v?���?6�������OW�6���o��3����{�]������[��Z�)��D����&��O���y�G8	:���Y���m\I�mN|b�n��nE������O���Q{��>�
���qa���G�_��?^u:�#��]��=]�~�:nut��<uF���Q|[���g4�S7����$#������<������a4<t\=�Y��c�.���t�F�u���
�F�����v�-��F7:��^?(�.��-K��K&���5�33� `����b,?�?-�DP`?)F�y0h�%��$����~Q�WP
�K�`c�����,@|��7Rp�Z�b����T��b����G>�N��Eg���b�%�)x�V���C�;m]��8���h��PKP���\]PKl�)Hcontent.xml��m�9���~?���]2y�T���m�]`����X�����T�r;3��dW��_R�)��|(�1�czz�����#*�$��s���~{|x�q�������c��Y>��n����{����_���������������O����������i���&�~��4�������O���~����q��i{���y�4���X���X�+�����;�q������q��h��Y~������z���q��N=n~��6�m�pu���������o�O���������_���Jf�~
)����S�7�����a����^>,��6�`�z�>.�i|E{������kq�,���~���r�%���S�A�m^�_���������7�,���l'~y����T�������/_�}����7w���=�W�G����EW�����_sP�_�VS���p���Ek�z�������_�����H~sR~�x��z|��Z�e\g���c9����t��
�zx{on�����������|\��__�?m���C������o������z;u������)�_��_FGyw��_���*���u�H���>�/����>��Nt���
�^�tI��������t���t;``���o���}yk��k���O8>�Vg|���v�	/@�|���+��1����&���_=�t���}c������������?��o6�������}]��*��|c��h��o�4�
l������nq���]�<l�������o���������|��u���X<�+-�x�>�?����?-�W��D7������.�������_�7�����M����~w�]��/��o�??��H#	���v�xIL����~��/��������������D�������~�7�����{>�_��-f���Kg������*�h�o�v�3�����v7+���;��q������c�������\o���7w��~^/��y�/������'������{�51���]�G���
�]l�k�[����_?�,�r��Vy�����_���b>���?l�W���}>���[o��5q�S������n���{�x�����{��z^�_^���[|x�~�����0���<?,~�w����H-�o�W����W��?u���W�����~�B�f��|���#�f��i����x�������x{��~�����_9��+g���z��0���X����/���^��������~�z=}�����j�7����.���W���O/��)�^���m��=��*���%��_�h�+a������������������������r1-D��k�p
n�~�x����8���<Z�}��b�>�U��r�V�w�s���|J���������������y����<'h����\��o�e@_�g���yyN�]z���:�.w��n�����y�f�z��}�������(���<�\�H��W��c`�S:�Sz�>W8��~�1�?8���a�%*�1����%�	:L�k>���g�y�C�,��fZ�,�9���Y�KK��T�vJu��g�7~^��~x���^.n7�,��?�qX��s�<t��SY��7e�:�~��e)�E����W���+�On��j������aT����/y�)���u�Q���e����[�~}���s�O��?kzzZN�����Y�������}3>�~���A���?��?��z�������?���f�MX^���u�������[��q�Oy��!~X�*;���hz�2G0��^x�R������V�O�LyL��W��7����neG������Gt�0��/������'tdb��p�X'DM� 
e�C��r���x�vu����e�����e����U���5>�h]r���e��[�N�N�F�AYo�i| ��2���J=�(�|���c/��4�#
��&��!9�S$��A�U'M'M#����I�4l�k]�u�^�����(��4�#
W�&D��cHB���C��=����Y4���u�n+��J2���9@�v�qU�����>x/�D����iD'�m�E���($�^��\��0��x��i|i��m��E�QF�������i����iB����`/��^�<	�7�� M��&T�&y��<:"�����e�N�N=�Yo%���?e��Z� ����(��4qG�XA0����f +�ci�A�A�4Q��Q
4�&��2��B�����!�(�4i�T�|H���Q:�����V�I��NZ�aK&����J�$���p@����;�����%�����Qx���\455z��g����`�/�<��-4�b�+�C&$�F�,��6P��pBPi�Q�#�FvU��4vc��8�u�(V����G:����g�`�J�0xo}�c�l���s��h�����cMs���&��A���;#�����f�C�G8X�1yN�{�@������iD���<
q���X�' ��87F����f0	C�K8�R��<J�������kZ��	��$\����X`�
�#����f�	C�Q�)�#IQ�bMGM+���	���,����J�@�&��z{�,���P�N�S��S�$����G��5�5z�i�v�A�-��b%��9����(��5�U*��eD��0z���{�;k���W�B?�^�
�`��	��YX3����-.9���}��r�����jZ�����H�f�J���\	��A<j�0T��=�A
2��{)�a���!jZ�]����Q�4�D�{$F����0���a ��� '��K�����f.������A�6{�l�������g��`�J��'$[���>:+�:l~d��E�VD��!�</����Z�@��f���}V�:�p������q�n���i�����|�i��A����QF�Q<k�0V��1A�99��l��U���Y��5�m��l�c���(V
��d?�(��6�m�l�����C���l�Gi�i�i��6�����f��6�b%�����G�,���Xkf��=�����s���)m�{�LR�� V
=�������f�c�w8��<0�(�����M�M;�47���	}��J�I�C�Q<l�0V��#����X\��/w�4�Mk�0�3)�}��J�8p��=?�x��a��x�1� ,>Wu�t�4�Mk1� �
5��B��+��9�g��` �JqFK�t�wi�Y�Y��5�����n��XiB�e��pF7��`

b�t#�'�Ei���:lZ��{���d���<��BIy�I�hg����CL�b;��V���=�?:n����6��J,��={�V(�
����x�.b�t�T&R>�&0H���%�N���i�"�<0�d��Q�
4�eg�(��6����|��G����x����:m:m�����=���Q�J��@v���Yh3����G\R�B����/�R6�`��F���)�X�����DC�ia/�6���*m��y�G��C�I�6_���i�i�I��6b�`������BAo��F�,�l�Ti#��b*��,K�6=-h�MS�4�s$2Nv���Z��7����v�b����0Y�����<����;i�����\�������B����C��B��CL�b������ ����^\������Mk�Cg	��{�R()��\Y({�,�<�T�!�e��<	q��a�6�M��� \&�J�I��qB��(�6<����D��"���4�Q�2�a�����D�a�Q�4���l���f0s��8���u	�	k��F}l�C����n��.��D�K.,<��b�P��$����Y`3���:1FG!b�	{��������.L�
	gR�X)��$�S�Q<m1���s��	+^uq�MS��7[�"�(V
%X�GN2_�(��6���+M��]�>Z*O����}����l�����Y�Y����������Q<l1�����l��A������w�MK�4��4^�h+�\0B��^;j1�8�K1�18��#��5}�Q�5�
��lH�"ok��R0V��f���D�5&���&��b��W�
t�t���Mc1��Hk6��J�q��[�p��^<l1�y�!D�0����:l�����b!s[�b�Pl��E�c�Q<l1�x��Cl
��OH��:l:l������}0 �XF��A�lx��HF��q���Uz��������(�����6�M}�=�.�5A���XkJ	�� ����Yp3x�]����d-'tAX=*7���~h�
��������8�!����X+�Xx�����fp�Zq&�s�	r=�w~�w�4�3����b�PJZ,�7G�,�|���G��c`�QXe�����i���Nb$���u�X)�PV���(��7����:�-��DL,�}��w�4�Ms/�GC�9�(V
�����K<�g���%v�^���8��jRR���M�MK�4w�`\����R(�%c��|{�,�����O X���F�L�[�:nZ��������!�^�5�Q\�e����Q�*�.�k������&
���;n�����8�7{�n\`�AX�a/�7����z�9$�l����������i�*f$4��I��Z�������x��bW���-.����0�ri�q�q�7�}��b1�����X	7.%�X6/�s���b_�+F��<SJ�M �Q�M�MS�_cgqy�bHx��b�u,�hX��j���Y�+��6"1�$v�&�:~����:�K�
��������U��s4m��i������M����������v�����^�?��{����r��n�����b�����C�OYE�W[�g_�KJ���!@���|���?��/�W��t���z��
N�����zy{����b���N�}��x|�tn�N���j���=.�A��X|���s��0*%��Q)��.�J�raTJ��/�J���Q)�D_�����Q)�k/��<����Qx�DM8E�*[�C��%L�����Ji�?9��!������������}p`���}��V8���s�/�]PZ����'o�]Q�o�v9YO�)ytD��J�@J�_p�#b���$�9���/�H���+��uN�1�/���Lr��Z8l�
���fUj�]t;�]�z��`���?lVh���jve[��X���}�Z����|���@��M����"�K11�4��6I�#�.������%r� ��1���vy��9p�	��FZ���r� c��}�z� ����%L�\�����c9_�V|{���]tG��P�g�U�b���c�����]�pL9�|K���c��,��D��cv�d���=�]FT����/�G��������������Z������\p�H��t.�*�c����6'�_��yI8���t@����0�L�8�|k�j�V��b�������������o)���Y���<;&����$!�/[J L.��2n�\�|�wb�9��	�����y\�9,�N���w�xk1�1�e)3����St�"Wd�$��.3q'���,N���k�{.	'B��!�4E�����T��������Qu���)�S;*��R
�A/g�_<��p��]�B	�K��P��"F�_���K}�D��X��B� ��'U�e�^�=�JY /��(d����2��n)�g��$�,�PJa��E���w�^M�]n1|�]0���M<������n�������U��/��SoN�l�����z��~y���]/7�wo�i���������u�g��+��o���Z_m�_���x�|���A��.:�����������G�{���;��������/}w�3���}����'��H�7�>l�}<���/���W�!�ex����\D5����J�����[���w���7=�y�.<�lC�|�{\l�3l��9���������_���|���v��:_��I�q�H�k/�	���/ze��Q\����;;�u%��"��1r`'�,Zu�t�4"N�2\��	��{�o3��K��x�5�J8r	9E�P+b[�������o�q�h��([��J=��&:��� �P����CfGB�������u����qWr���g)��b��:#5���9��/�PE�H���Jy��Q
�C���F�i\�����ZCG�������l��x��j*9dvD[�C��>�C���F�i\���Me���V���;��;����P������`���=z'\r?n�y�y��7��98�e1Sv�Z�@�l�����s�f��PW��lcBt>� ��15�87�p������
S#�b�P�������7C-��R�v�K����u�t�4�M�r�"a
��Xk^��q�PF�������s��)&��8�����u��ig�k\��������J�a�&	CF�,��9@]9(�e�]t ��25�S�8M�w6�S�h��1w����FcQ6��� g0C���%����<KsxZu�t�4bNk�1{*)�e���X	��D���(��9��*��`��������V�9�9����mb4^h��ZC��Y6���0g�C��8�u\R��<R�$	G��8�3�s���/��G�R(�D'��^<s�1T:��K�/��w�����3�s�[�c0��%�Q�����p��^<s�1����eS,Y���V�9�9����uL1.��b-�+��>�ga�`<�J��C!&��#��{����t��bNk�q��kW�����B�sC�	�x��c�t��s!�
���S�����F�i�>�
H��{�R(��a��n������d�y�3B���@�u�t�4BNkr`g�0�(V�c�+y�e��(�988����lcH1��^\ij���������-������X	:>%����x�.d�v!����������C�G�N����}�'|X4��BI%1�p��(�:���5>��4� �/���x�35����i��Fd�/��V'B�GQ��w�������6�3�\�y�$���o��9�������J��J=C4Q�;�g���C�J�����SI�!�Fq��S�S�u�;��3��V��X)�������0g�!c�����r�x��F��V�9�9�����������+1'��G!t��Y�38����)��g�>�+<Zu�t�4�Nk/2i��Q�
�R
O��~/��:�+��!��.yKl����Zu�t�4�Nk3�'o�p|1��B	>�B����@g0#c��sd�&a��F::�����\�2	
y�Xk��?��l�2�g��`G�����FW�- �����t:t�A��!9�5��={�t��&Z�De��T�BB�x�����:t:tz[���d�0)�(V
%Ek����� g�#S��c����.�8���'E���#|�@J�9�;rDY�b�P�a��Q<t;2U����P��!	��7����i��vdBt&��b�P��h��@g0$S�!��s�Bp�8X1t�F::�����L��q�M�X)Wr�D�������L5���"�m�+��>1t�F�����:�����P��j/V�!���DY�s���@gp$S�#��O@����Q��U�t���NcG2G���G�R(��p�7�g���H�JG���	QX_��U�N�N3��v$���Y�(�
%9����F�,��T�H.I*�m�2�G\����F�9�9�����L�T��t�b�P�
y�&5$�Y�3������GvA\�|j��w���NkC�g2$\��JC>(	�Iv���Y�3�����F�}���9j�gW:�����l��p�Z%�x_V<�����@vd��#�s���.����Q��t�������������F��D3�Bw�(�;�%�+-����E'��u��c����0kTm�����_7'F
H���J�$K&�%y�������3k�h�y������3�3�s�;��<E�{�V Tr�dG�,���\�Gf��r ��?n�����9���^\�n+��\�|D!���Y�3������1$�,z//y56����i��~d�)+\��J���IW���Y�3�����\��%r�,�?/u�t�4cNk7�E6^��o+�B1���{�,���\�F.O���1�q�w�g��F�����9����0��(Vb�+�b��2�ga��E�:/r����~����u�t�4�Nc32���qVv��b�PJi&*��@g0#s�c�%[xI���F}�g�N;��6#S�����(V
�N�(�������5fdk�	B
�#�������iF��n�]�N���(��!�3�]�{��q��U��C�-;��+:�F99
m�������R7�^��S$�u)��^<v7��s##a��G�$}b~h���#c�;Ak�c{?r01���;�R(�:��)��,�����������Y&�8n�����;�-�`M�xk�� ^���`g0%�ZSrr�F����36:=L��������`K�,b�b�P�i����(�;�-�U��}��T�b'��76����i�����`(�&	�X)���D/L����������	����'Yc���c�%v�{�
�0S�^�
��J,�&�,��������*@���_�u�t�4�NssrI�%��5h��S��N�'~/�:�5�UZ�����XX���o���i����d6^�Tg+��"/��>�g���Mv���d�,/x�^hx:j������:�������p��U�f�+.L����������$#1�OV�q��Q_���i	����|�&����J�	!��~��x���������-:o�2J�W�F::MM����#�kN�b��-���p��(�<�;�W��}><"��M�F��9~����>�K�
��������U��sDm�!j������M����������v�����^�?��{����r��n�����b��(��C�OYE�����y]}����*����7�����_~���������|���7������������O��27����w��B����+��������.���W�@��yaTJN��R2�]�������3_��s��RZ��0*����R��^L�y�������Y�0M�����������]iN������K�)�� {dR��Z<	]
�Rz{a���J+�H����.w�p�97R���w� E������V8�3����V�J+����y�|��	�0�Fj��|�,Q>-%P���	c���+�jmz����������-46�]tC���j�`p��S��'�W��J'Y�|�1_�AXNP�����`p���V�U�
�nK!�!��B7��%�����@)����?����|g������J��@�$��d3��[���a�{&�������;1$.�s��R��hmwK�!��<��^z���n)B�d�U���O%�j+�a��gU�V��C,�_ct)�A�k-���g&��;��[Y�X�z����BH�
�>	�[j�� eb����RO�����B�Kr)Jl�O�K+���P-�l��G�wy��B�����R5��S�&W������)�5=�J�X��I��y�=�u��|�ZJ'�|s��\O�|�������7�s����F�I\E\k� �y����>��,��Jo�)�E�L�H�; 80�2&�(G�0\����y��.�Wv��l��E�C5��'������Y�c�����U!������
�u����+�O�*T�w?9���Z8g7�r��[�Ho�yNI����������Q����J��v.��z�{�������MR��rN�9��Y���(gd��;w��W����v���Q���������oj���/F��:�-_yC?�f�t{��_=-������zs�f�X�_n����������z���{�O�����?����?�O_Q�K|{|����j���|�����v����#�C�
��x�t�������#��������Y��_���������9�_�>�_���on�;���J�7;������6|����.�V�y�����_x���h��|,�~��������6t�w���f��u5���a�����;���������B���{X������{ ���l�e��y�j�`%�d����P�>��9���)	a���y��9 .������iJ��U!��tT��fR��������s�g(QS��La����M����C�������i\����Hm��Z�/b�T��.�s�g�QSb�q���bY�#a%��V�=�=M���>�C k��Q��V���q�8'Ll8��`��DD{b�}����w�[u�t�4eO�"��&	�Nj�`�9�P6���s�g�QS(�����l��8���������=?z��p���h��Z�`Y�V=��s�g�QS.�Xy�/�N�t[��UgOgOS�4.���;���r�J����I��L�9�3T��,A6����(��oj������<��F�dg�� ��Oj%
��*�"�z��#�JG�y�W����<��������)z��f
��J�	1���p����=0�������Q���;��F>>�m���H�r��B��j�Q #�a���I=~�BP[H��`��%���}�F�����I���T6#�$�L<�u�A
&spO�Y�3������"��%+8���������)}�;�s�X*t6��J(����:���Y�3X���������
[i�/�������6����D��pT+�Et�/D����>��*��y�%�[�8yV��Um	�N�N��Z�fBL����J}�����Y�z��f��7c
��<�q��M�V�>�>M�����9E��~R+�!���Y����g08C����9Z6���<ju�;}:}������-D4y� �b�V�O�s���&�,�<�Pkr����cp$����?r��iK��&go����W<������&	�:N�Y�3�������<���!T�-�O���O�O[���9����2��Z	�d1O���[&�,���P�tf���O<s���u�t�4�Ok��������J�Ie�:
+�O�9�������Pv�r��P\Cij������j�����'�K�Zi���Da��I=~�3V:����T�H��&�����G�J���
�������	���Z)���	�kN�Y��O�\�u�'>��� ��t��?���i���ng���c�b�����������>�������_�����G���U�O�Oc�4v;@b�l�3����)/|7�g���v����%Dt�J
6qm��Q�O�Oc�4�;���$a"�Q��g#��:�g��`v�:�s�L��]%G*
������:}Z�����St��([m��J}���L��Y�3�����\�i'�>�0;�q�������i���-z���i&�R0!�
�}��Y�3������I��%.[�1	7�7����i���)���T����Z	���`
��z�ng�M��� ��wY����C�����i�wGy�"4�Nj%�z�%�����z�~g��;���30k07����i����g&@�iu&�~�
`��M�&�����L���w�8`]b���q�N�N��������(��Z�j���s.+��0�g��`y�������)� �3����?`�+
E�Bc�3���!��V
(zC�u�I=�3Uz�#2P��&���G�����=����):C�
��Z�/<�h����w�Y4������#��'� ��sh�	�	��@���y~��	qb�A�'g�DO�^=��3U:�m�MY����!�Q�����=�{��CB#-,�+�X6����g�>S��y�����?�F??�����L�� ��<��P�L���a���@������l.��@�b8n���@��l�E��B'�R0)��I(��L�Y48����@��+�		]���:�:������] ����&��h0_�l������@���<���3�0u�q����j�����
�l�wRk���N�	cT���Mu.h�!R������c����=����G��9��gT+������Q=�x�As��������e��F@@���
�)"�$��1�����SyM�Y4X���
M�E��8F��I���v���_l���.�7`�����7��W9��q�]|�������W�7�l��o�w��]�W/4K~{-�<?�������^��Z/�����v��W	��1���Jd��>������"`��_}������o�W��t���\z��
������zy{����b�������������W�v��-��������.��W�@��}aTJ6��R��]������S_�����RZ��0*�U��R��^L�y�����������������8�2-w��Y�J+�x�e����M(4��Vj�$�>����D��zi�O�a��z:����^��D��)��#\�*�L��I��
�;�����h��K� �R����L�sH-��s�����FZ�
�+u1�i�Z�FE8>�96f &��+�&��[J��d������b�NzK��	_n%} �����m^S�����3�}�&'��[)����R0�h���o������*�
������sd��?)ap�qN�q�+~�8uf�n���Y�|���]�S��r^������<���U��y^#5,�U�Di4u~���9'���H��\�j����Q��9+W������ij�s^&��n��<G??+��=��z���v�+�7;w�5��O���r�����Y^s�p�s�j�s�M�w�����T�O�Y=��o�WO�����Yl7�����.����������jq{�^n6�����y����,�;����W5������Z_m�_���x�|���I��n:�����������G�{���;��_�����/}w�3]��}����'��H�D������}�w�j�����E���%������w��|�;`y���<����y��;��b����Zs��V�o���#^�j�W��l��'�!^�+�uD4���e�������	�����`&�9�����aLv<�����G����w�Z��S`t!P����C�������j�6O�!_��l�Z�U	�/n6�F�&��$�����>D�P�M����U�^�Y��U���@6�]8�X'���0i���$�$UM�Yk�q��[����������)�'�u!�<�fu��J�@I�$�u2�5Q�N��&!m�0����y��<n�Y�Y��U���zK���2���	�Xc���Z�T�$�j2�Z��G���0�t������:����q�Z���a���&�R0� "a��Q���p�UuIn-�b�N�d8>n�I�I��T���z����tL5��B���B?����T<���\����<D^����QUUSP5���I>OB:�j%h��+�k�NjMT������!y�@!����q�������j�1�3�3A�a�VBU��+|9�5Q�$��.�n������<P��7����j�m�]��	��R�Zi�I��	 c��V���U]6^���A���(LVs����G�U�|K�pv��o�2����	���.��le}R����c�,��b����!Ay*�}�nY��jK���ur���I�D���$-�;�Uiu����ur����bZ���{�U[Z�6�{��A+�_�j����d�p�1�Uiu����uy2���@���������)�Z;�c*�)���V
��F�blR����u*���%K�Xq^�C�N�N���j�]��H��Oj-tz�	��{�*�N������!�-x���(v�������-�Z��)zg��$�Z������!��V��i�:������E�$,�p������)�Z���94 |8���I���$�ZU��Pga�)����@��m:�:�������a&M��Z�����e��I����v�������}�(u�5����j
��vl4V�HR+�<GC fRk�
O{����N��3�!��������:�Z�B[{�#%.	H�{��j%\�|!i5�I����v���p�,'�(�qq����G�U����r��9���u'�R0@�oIv�����J��:{t�"�@�Ih=j��W�W�y���N��h�p6���q�!a�I����>v���'�>r�e^	S���^�����j�d���xn��J�$G`��R� V��i;���K���w\�V�9j�a�a�V����LV���J�������&�*�N�����2��<��$\�:n�y�y��W�����uc�oF�R0�B0�	�jU^�6�c��=���l����A�c��������j�fw�b2��#�Q���%���q��V��i7;V��#{v����Q������5�Z;��"�(�s<���I��x)�F�*�N;��2);q��8�RI����:�:�������&��':�����!'[I����:mj�JS{��2�s�b\M�:�:��������&J�0�j-t��#��tRk��N�����N'������D�FWW�}����>F'��>������ 5�����:ml�Jc{�<�c���pk�Q�>�����pP����G'/,<���g�a�lT�����j���C
.�c��}���:�����=Fk�����V
&2��~/V��ik;UZ��-�
 t������j����v���&���J�$O�Hw�LjUb���S��=Z��dP��yj�y�y��W������an�I����
�0�Q�����v���g��]*�l�5p�u`u`5Vc�;��l���J��<�0I��|R����������!��{[���������w\��Uc�;3����J�&������V�i�;��1M���*X�v��MO+�y��W��\�� ��I����m��i��Z�W��T�p�����!�ReP�Ztj�����X�=��b2	/�Q�4�$��xBZ�g�V��i�;�9��3p� :n�q�q�W�=���x��3�����@������w�����	����t����O;�������5 L�5����'>�xan�I����.w�s�S����<�� ]s�ZF�_y��.�u���\�y�����N���3��><>�"�� ��|��[|x��b�z�Y��k����yO^�����z��\l��=�zH�O�YE�W"[�g��K����"@��_}��xzz��������>�J�7[��r���\/o�>�:_������{�����N��A��n�������{\>������
���/�J�|aTJ���R��\����RzNwaTJ��F���vaTJ3��):�����^4�>�T��X�)0�Re��4}tn�4�&`d�!���,������h90X`k}���Jx��R��Z$M��[)�����WDp	�1	7�V���
�%$!%Db����@d��Z�K#�pB��B�W�8}��4�P.3���G^�c}�"{I8��;H�!:��s�,�R�"�0�1�L8$� F�2�m- {Bt�����J�Jj`�(a�"����J)�D�9p�d�y��&�[J�[��JV�I���2��[
�!��|��
��+�Il��i-��h=-8����Ouf_�p������Q�g:�����,�F����u�yE>�n)�&��z�wn�n5����W-���l�A��$zj���)���{�w�����=j�<3;��]����j`8ok�R��s����|��1F-��l�j��gk�
�L��Z8gRjW��O�Y=��o�WO���b�Yl7�����.����������jq{�^n6��~���+{w�����j���=�a�����._}�j��]����2��6t������������x��ww6�)��>|���^>��ng�x��\��O���:����r/�7��|�/�N�W�>����s������Ur���"��|,�~��g����2��|�{\l�0��������v���������-�C�sWF��g��Q�����4ik�hl�O}2�����	����l�5��1����>BLe\&���o��.eoY!�e���N��r��S�S�!�'��g��H���N(�;B���V���T]�^�|�l9�`�����^�������T���#���&�N8�{�tUvR+��O��&?oqW���A�M,}fqh�I�I��T�s���h��&y�k��l���(�����r�XU������Q*���b����w������BU������$�mLr�1���	>�Q�O��&/o�W����B�q�������j��(x�&���k���8��� WdU8�����e�!G����A��ej�W�;�Z��q:^(�b)�^�ev�B��C������U���z-Gy2'L�~���K���C!�q^`���[��Q��K�y��p�j�+�*�BU]
^�1F@�~��FUU
Q�8�.p"����I�N�����Z�\U`O�
���B��������`�FVVM-����s����&�R81�q�}��\WpWu�w ���J�jj���?8��Vj�P����.VMj�����I��	�ZT'M�P�R���y"C�BR��k��T-I����eg��V�)"���E�S���:iT�:�z����1D�1J��ZuRuR5$Uk�����	��*�\�AC(�	I���d�I�:������}��|�Q��UgUgUCV�6�C�
J��Mr���%������k���[*���yP����L})��V}�i��V���!�3����&�<���4N�$���I�:�9����"gVQ�^�e�������!��;���?R��(�
����BZMrMZ���C�g�;!��@���U�U�UCZ�������tk�=&#���jMN���C�o�9�������l�uLuL��Ts�z(�T�	�'�R8�b`#.�3�5au����u�����t����������JV����|"�@x�Lr�p�����A�$W��t�c�s��a�g��	^Z�bj�Y�Y��	���^���-��\)�Dd�|K�$���I�:V�K�\_&��,{��:�~l\5/�������sTk=M!���5�'�&�N�W���2A�a����Q������-���"�x(3���	��fu����:i^�:�zt�����ca���V�U�UMY����E���,pR+�h���I�����u�3�'o��(PUI�G�z������jl_���3�ex��Z��K�X���&�&�NZ�����C��'t.�dY�$�������)�{�c)O`�IaF��SQf����ZT']�X�Z/f��|p��p{�����A�A�
��������F������������:iY��z�xL)�
H�|�G�:�:�����g9�I�'!&�R8���D��\W'��X�\�R�:LB���Q
�q�W������I���J�8��I���\W'��X�]�D%�g����F�A`�U[\�v�S��	�r�p|"�&Z�t�+��N�������pIM����c������~��vv�`�0G�A�N$����3�5�u��N�vK�U
	���G�:�~l`����Unma'p%�����W+=K��$������I;�Z�K���K(�����Q������5����9��YMj%tB���-�OjMZ�4�S���yyz����
7c��w���5����H2@Lj�` 8k��.�I�I��6v���s���d�� ;��[uZuZ5�Us#���x���j�`���!:'�&�N������O�����Q7]uX��Us+;D0,L�7���r�lHh����:if�Z3�K�,���*��Q_c��j
��vvDc���4��~�H�L�V�����:ih�ZC{��������K5����j����v��P�~�I�"D4^�9e�k�����,�h����J�����Q*���X�M�������\)���tS8W����:ij�:S;R�2���V�e�����1�Z���'�F�j�Z�J.��
�[������v�3�@�1x�� M�~h�q�q��#������I�t�5���q�l21J�
�rMd���s���x�zk9�S���Q����W^t��l}�7Wo��?�r���m���n���O�Ho2�/�.����^h���Z�y8~��������ts�^>/���`���!�}z�*���?�_R�WO_����E��^|��"�������Vp���>.��������>�v�����of���z>�[�n�u�������@�e0��:�.�J�|aTJv��R��\�����RzPwaTJ��F���vaTJ3��):����^2��u�j[�b ���T��&��-,"��;,���`���r#��	T��\��$���[)����(���S�mCi�L��DlL.Z�$�/^[JYOr�)bLZ���R���m�!��-�skM�
�����H��g��Z8!�_���qH�e��H+���)e����5�b\tOi\f��i��m�S�
;��R�8���!��Q
���4U��>YZyB��
.w
����L����m$9GC1
%s+%L�}D�E��c
Gl����s.*G�K��j�T�����y5zo*����n*����_#P-���������~�0u^=5.���_S�d�V����yW-��2k�A���yj��yy�4vA_�������i{���&�������^��r��Z���9����y�������j��em����k]S�,[J���SoVO����������p���7�h������j�xz��Z���������YsF����g��k��o�xX��6���W_�Z>m�����L�C�
��x�t�������#��������3��_����������.^�>�_���on�f����������h<�_���ex�"�������Jg����[�l>����Mx�a�����S��q���`}�9���������_�������m��;�+
C�"���.�x����	&D��;F�9���<�GC��t�d����������R�:�!JmS�^
�S�%���-R�|"��?�u��)E4 tMjER�)R���
6y�-�C�} �.L�:�:���q�^ )K�p�q�k�.��d,	�LrEV�)V�e�
!�@����Uc��:���%�g�
��I����ZSQ�"�BtNrEV�S����[���-�@hY�Q�ZuVuV5dU�����5,|J8����)�3���������HU������#�H�Y��xj�I�I��T�����v�f���]4 �f�V$U8E����;�xF��x��������j	��yy��:%���0���q�6V��i�VU<����eo9�'k���F}��A�T���ryP"Mq�k��R0 RMrET�S������F���
+'7����j����x���Aa���\)��R��!�$WD�S���\�CdCbd����Q�U�US�g�<��9�,��I�N�dXj������������Ls��| ��>5����q�_W��,5���@�F�wR+������,�I�	��nu���G�g���^�'|l�V�T-I���y���R'�(Wgd.{I���G�&�N�������/	��<H��ZuVuV5dUk�:��lX���ZcL��Y(�"w�k���c�,�1���,1����3G�N�":�:�ti�������MB<Lr����1������$���I�:T���K�{�>O�����V}�M�UKZ�6�S�)_A��>���z)ry�'|89�5iu��������YJD�4�S��j�i��V����]4��3�V8���	����:�]�J�zYiy@�8?�Q�^H���%����C�Lt�5�I����!�R_H�����:i`�Z;�R����8���Q�U�UCX�v�;D�/w+��Or�pB�!�I�L��\V'-�P�a/��m�U��F}�M�UKX5��;�d���>����D��tV:�Q�'�X�`�\��t��=~h�vT���6w�G������$W
'y�h����$���I;V:�K	H�S�<��jj��?8��ul�a�M:�'��
�K��~����:�q���^�j��)���M�:�:������=Q��%+{�6������J����Z�U'=�X�aOJ�u�����ZuVuV5eUc{�|�6I�`R+��a�V�I����v�s���T����b=G�:�:��������%6(,�|�k����I�_� ���I;�x�K)fg	\p��a��Q�U�US\56��`�(,�>��`�+��6�I�	��v����L�Y�Y�P�|=4��;�������b@k@�l��J�@���t�7�5au���5��_rBG�>�P�=~������)�Z[�	��A�s�I�e��>�!i��I����v���G��:b� D�Q�������jmb'
Di��Q��G�8����\W'M�XibO�y���=4���;�������-��s;i��Q�N ��D�3�qE'��Tgd�cS&p��l���u\u\�v����s���I$��<�����|2^���k����*��2�c��N��Q��
,�(�2�P+��f�2�d���Jky�T'D�]��ZV'��Tmfw��O)�ly��'���jM��vvt���1�(V'�	O����Z�U'��Tkf�b��+���[��UgUkV5��#�y�+�R:�x/����d�I3;���!X�<�C�\b��:�:������&Fc��7'�����NrMb���S��=��^=r�PK���F}WsVk`�6������F4�Z����c��w&�&�N��������e��MWS�������joi�I��Mr�p �0�F�Q�����v���G����(�95���N���j�i�����4�J��q�'f�&�Nz�����6QL)O�����;j�����X�]��p����$W
���h��?�$��IW;�����t�0J+t�����j����vB�Qy���(W����
���G�"������l�����u,/%qh������%�����nb��J��<f*�*�6��ZX'm�\gk'��!�c�to�Q�J`����=0@��[��z�|�q���m��gl[=|x|zEz�1��vy������x�B����������><��\������y��.o��W	��cVq���������2�z�P��W�</��^~��"�������Vp���>.��������>�v���f���k��s;u��_W����q�xB>9�|
tv\��
�������d��4,�G������������/
Ki�����&���t�a�yw+�d�']�TZ���J��c"�4et��XO��3',��e�$s��,����qL��^��(��X���`�0�[n��lP��$G�g���w���^���h�MK#������bO��|BK-�Z9M>i��@1�o�����"�#KM���~�b��C���t~��������w{[3�2�(� ,��[��Sz��yD������m>�,1��QzO���W1���(�@����{�N�gg)��QdI��O����*O�rej��|��1p��0���Y%��j&�[�W��rVY�����<	��U�0ufe0=L�W�G
SgU����Y����9/C�Z8ge��J zn�ME���AO��������{�w����=�w��Rt��U����wW9g�����D�wW9g�����<�����W�{���5�p�s�T�T�O�Y=��o�WO�����Yl7�����.����������jq{�^n6��~���,{������I���=�a�����._}�j��]����2,�6t������������x��ww6�)�>|���^>��ng�x��\��O��y�ST��W����O���r�����/.n7�,����?�n?��vu��1��|�m����PK7�Z<U�,PKl�)Hmeta.xml���n�0E��
��V�C���Yt�"��29q���AQ����$�u/�����w�T}w���
\��Y!��V*�[�_�oq���/�}zR�������|����Z��n�Nu��{����,~I��h��2�+����c<C2��u;L���SwA�8s����������4�xa���jd/#Yk�F#>���!��z����l�C�������+�N�_,��f�����0�A�14��<&4&�����fIZ9ei�j|EQK�?IKNR�n��2�*J�/��
R�p����tV�c�V�o��'�O��2�.4t
+��O�������yP[���8��	�yP�?n~��&��`sp���YJn�{�e�������F;Bv^�h��v�!�7>����*@�����<��vt[���n	_�#�?PK�����OPKl�)H
styles.xml�Y[o�8~�_i�+m��ia��������+r'���#�s)�~��8�����t�����v����1oO��<_��Y�{$�xL�t���z<��7���$�Y�<�e$W�T7�H�s���k'����U�3"W*Z����hUG��Rv�8�jn�ukE�j���6l����
�n|�j���i�<�S���	"�X��#�����U�X!t8f��)�/�Kdf+�Q�+v�T!��^L��l�6#
O���uJ�.�&b�4X�NTA$@�qu^NsT�i��>��]�t@�h���<3�f����S�$��fXm����I���W�y%��kilC�H�b�cZt��s^Q���
�E�"���>���*"j�haU���O4�� ��)��B?����H��UI�7;PgQ��Vel�T����"�{�@�A�B�{J��l\�%2�z�5��Hc�yo��H�� ��<�eg� ����03f���z�0~��R��(U)OT�vWo���6���R����mu	�m.�	b1�9�-���gMn�����[��!���8hF����\����A�k��� %9<-d�<P)�����j����=#���qZ5�J7R��!�^�-U�3��9N�fX����{�w�^`$�����6�� �A���
ee9n�c��b��+Oi�s��t� "��^`�S��mP�BQ8��)@�^1�
������VC]K];�s�6�b8Ow8�Y����]	�����v@��y;�
��q��[7S:t�]�z�g�8��mi�u5�����G���=
�'�F@�:���y�����I�.�)U:�Y����Fw�g��w�I'�Xyt���yh�8?C�����vO���Z����n��*�q8�o��W�uuU��0r�D����Q�ki��0��D���8���������@D�q�(�E��~��@h��m����K�Y�K�RX4����f�u���z��V	�O�@�����9��(�Z/�9(�`&k�Zo;Uo����`=���D��a���B�C���x����%��I��:�����|C�\}\�����.r}1){>��7A
�����+_F����f;r7����zN	��f��}{V6W.n&D���y�qB=$���b������k}]q�;�����0�H�u�(?��>�.n����4<
�����l������/�������@]��e�@� \�%��>�z@}�������'��B2,R�c$�3�AQ����\)��)������^��Y�t~S����lRB�XL��������"�����eO�O�����1���K0��;3}J�~w�����P��$�!hru���?GF�_E�;��`�*'2,+UO+����v�"z����93_L��rK�Eo����P{�)Z"���#��I:[���Z��~����m_0l�n��X��s�}���x��o���#�.:���@��������aqJ�hj������C��Z��p�t
�7����n�(��#;�V8�� \��0D�'K���s��}��OE�/}��~XNy�4o�6�eh��Q���jG�_}o�PK�})�!:PKl�)Hmanifest.rdf���n�0��<�e��@/r(��j��5�X/������VQ�������F3�����a�����T4c)%�Hh��+:�.���:���+��j���*�wn*9_��-7l���(x��<O�"��8qH���	�Bi��|9��	fWQt���y� =��:���
a�R��� ��@�	L��t��NK�3��Q9�����`����<`�+�������^����\��|�hz�czu����#�`�2�O��;y���.�����vDl@��g�����UG�PK��h��PKl�)HConfigurations2/toolpanel/PKl�)HConfigurations2/progressbar/PKl�)H'Configurations2/accelerator/current.xmlPKPKl�)HConfigurations2/floater/PKl�)HConfigurations2/images/Bitmaps/PKl�)HConfigurations2/toolbar/PKl�)HConfigurations2/menubar/PKl�)HConfigurations2/statusbar/PKl�)HConfigurations2/popupmenu/PKl�)HMETA-INF/manifest.xml�TKn� �����fU�8YT�	�P<v�`@�%�/��OU�������cXm�7{��"v�E>���������{�*6��*t����>�����QGC�4������hKd��^��.����X/�+��<��?��C��M�w�P�@���3-t����5\��{y,ouJJLO;j�����O4����)�w��`FPS~s�
�:�;�VSz���������A��?�sL�~��
�UO�9�"n,�AKe���Y����;��_�$����E��W��W��PKB�d� EPKl�)H�l9�..mimetypePKl�)H�����_�_TThumbnails/thumbnail.pngPKl�)HP���\]v`settings.xmlPKl�)H7�Z<U�,wfcontent.xmlPKl�)H�����O��meta.xmlPKl�)H�})�!:
��styles.xmlPKl�)H��h���manifest.rdfPKl�)HY�Configurations2/toolpanel/PKl�)H��Configurations2/progressbar/PKl�)H'��Configurations2/accelerator/current.xmlPKl�)H"�Configurations2/floater/PKl�)HX�Configurations2/images/Bitmaps/PKl�)H��Configurations2/toolbar/PKl�)H��Configurations2/menubar/PKl�)H�Configurations2/statusbar/PKl�)H9�Configurations2/popupmenu/PKl�)HB�d� Eq�META-INF/manifest.xmlPKp��
hash-scripts.tgzapplication/x-compressed-tar; name=hash-scripts.tgzDownload
#19Peter Geoghegan
pg@heroku.com
In reply to: Tomas Vondra (#18)
Re: WIP: bloom filter in Hash Joins with batches

On Sat, Jan 9, 2016 at 11:02 AM, Tomas Vondra
<tomas.vondra@2ndquadrant.com> wrote:

So, this seems to bring reasonable speedup, as long as the selectivity is
below 50%, and the data set is sufficiently large.

What about semijoins? Apparently they can use bloom filters
particularly effectively. Have you considered them as a special case?

Also, have you considered Hash join conditions with multiple
attributes as a special case? I'm thinking of cases like this:

regression=# set enable_mergejoin = off;
SET
regression=# explain analyze select * from tenk1 o join tenk2 t on
o.twenty = t.twenty and t.hundred = o.hundred;
QUERY PLAN
──────────────────────────────────────────────────────────────────────
Hash Join (cost=595.00..4103.00 rows=50000 width=488) (actual
time=12.086..1026.194 rows=1000000 loops=1)
Hash Cond: ((o.twenty = t.twenty) AND (o.hundred = t.hundred))
-> Seq Scan on tenk1 o (cost=0.00..458.00 rows=10000 width=244)
(actual time=0.017..4.212 rows=10000 loops=1)
-> Hash (cost=445.00..445.00 rows=10000 width=244) (actual
time=12.023..12.023 rows=10000 loops=1)
Buckets: 16384 Batches: 1 Memory Usage: 2824kB
-> Seq Scan on tenk2 t (cost=0.00..445.00 rows=10000
width=244) (actual time=0.006..3.453 rows=10000 loops=1)
Planning time: 0.567 ms
Execution time: 1116.094 ms
(8 rows)

(Note that while the optimizer has a slight preference for a merge
join in this case, the plan I show here is a bit faster on my
machine).

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#20Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#19)
Re: WIP: bloom filter in Hash Joins with batches

On Sat, Jan 9, 2016 at 4:08 PM, Peter Geoghegan <pg@heroku.com> wrote:

Also, have you considered Hash join conditions with multiple
attributes as a special case? I'm thinking of cases like this:

Sorry, accidentally fat-fingered my enter key before I was finished
drafting that mail. That example isn't useful, because there is no
early/cheap elimination of tuples while scanning the outer relation.

My point about bloom filters on only one attribute (or perhaps
multiple bloom filters on multiple attributes) is that you might be
able to make the bloom filter more effective, particularly relative to
the amount of memory available, by only building it for one attribute
where that distinction (one attribute vs multiple) happens to exist.

Simon said: "So the objective must be to get a Bloom Filter that is
small enough that it lives in a higher/faster level of cache than the
main Hash table". I agree that that's really important here, although
I did note that Tomas wasn't so sure, emphasizing the importance of
avoiding serialization and deserialization overhead -- and certainly,
that's why the patch helps some cases a lot. But Simon's point applies
more to the worst case than the best or average cases, and evidently
we have plenty of worrying about the worst case left to do here.

So, one attribute could have relatively low cardinality, and thus
fewer distinct items in the bloom filter's set, making it far slower
to degrade (i.e. have increased probability of false positives) as
compared to a composite of two or more attributes, and yet perhaps not
significantly less useful in terms of its ability to eliminate
(de)serialization overhead. Or, with two bloom filters (one per
attribute), one bloom filter could degrade far faster than the other
(due to having more distinct values), often very unpredictably, and
yet it wouldn't matter because we'd discard the bad one (maybe really
early, during the scan of the inner relation, using HLL).

I notice that all these example queries involve less-than operators
(inner relation tuples are thereby prevented from being entered into
the hash table). It might not be a terrible idea to hash abbreviated
keys (or even truncated abbreviated keys) for the bloom filter in
certain cases, in particular when there is a correlation in the inner
relation attributes (equi-joined attribute, and attribute that is
other part of qual). There might not be a correlation, of course, but
with some care hashing abbreviated keys may have virtually no
additional overhead, making it worth doing despite the general
uncertainty about any correlation existing. If you're going to accept
that the bloom filter can't be very large, which I think you must,
then hashing an entire value may be no better than hashing an
abbreviated key (those 8 bytes tend to have a lot of entropy). This
point is rather hand-wavy, though.

I suspect that BLOOM_ERROR_RATE isn't the most useful constraint here.
Is the degree to which it helps in sympathetic cases at all
commensurate with the degree to which it hurts in unsympathetic cases?
In your "low selectivity" cases (the sympathetic cases), there are
relatively few values represented in the main hash table, and
therefore in the bloom filter, and so a smaller bloom filter results
automatically anyway. But in the bad cases, the BLOOM_ERROR_RATE
constraint just wastes memory bandwidth for no gain, I think. If the
number of elements is so large that a reasonable fixed sized bloom
filter has a poor false positive rate anyway, we may have already
lost.

My sense is that we should try to make the bloom filter as cheap as
possible more so than trying to make sure it's useful before much work
has been done.

Is it okay that you don't treat MCV/skew values as special? Actually,
looking at this code, I think I notice something:

@@ -238,6 +238,15 @@ ExecHashJoin(HashJoinState *node)
hashvalue);
node->hj_CurTuple = NULL;

+               /* If still in the first batch, we check the bloom filter. */
+               if ((hashtable->curbatch == 0) &&
+                   (! ExecHashBloomCheckValue(hashtable, hashvalue)))
+               {
+                       /* no matches; check for possible outer-join fill */
+                       node->hj_JoinState = HJ_FILL_OUTER_TUPLE;
+                       continue;
+               }

Haven't we already established by now that the value of
"node->hj_CurSkewBucketNo" may not be INVALID_SKEW_BUCKET_NO, and so
the value certainly was found in the inner relation scan? Why bother
doing anything with the bloom filter in that common case? (Note that
I'm not suggesting that we don't establish "node->hj_CurSkewBucketNo"
first).

Also, are you aware of this?

http://www.nus.edu.sg/nurop/2010/Proceedings/SoC/NUROP_Congress_Cheng%20Bin.pdf

It talks about bloom filters for hash joins in PostgreSQL
specifically. Interestingly, they talk about specific TPC-H queries.

BTW, I think code like this needs better comments:

+static BloomFilter
+BloomFilterInit(double nrows, double error)
+{
+   /* perhaps we should round nbits to multiples of 8 ? */
+   int nbits = ceil((nrows * log(error)) / log(1.0 / (pow(2.0, log(2.0)))));
+   int nhashes = round(log(2.0) * nbits / nrows);
+
+   BloomFilter filter = palloc0(offsetof(BloomFilterData, data) +
((nbits + 7) / 8));
+
+   filter->nbits = nbits;
+   filter->nhashes = nhashes;

Have you experimentally verified that you get the expected probability
of false positives in practice?

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#21Peter Geoghegan
pg@heroku.com
In reply to: Tomas Vondra (#18)
Re: WIP: bloom filter in Hash Joins with batches

On Sat, Jan 9, 2016 at 11:02 AM, Tomas Vondra
<tomas.vondra@2ndquadrant.com> wrote:

Which means the "dim.r" column has 100 different values (0-99) with uniform
distribution. So e.g. "WHERE r < 15" matches 15%.

I think that the use of a uniform distribution to demonstrate this
patch is a bad idea, unless you want to have a conversation about the
worst case.

Look at the use cases for bloom filters in general. They're almost all
some variation on the same theme: checking a bloom filter
inexpensively, to avoid an expensive cache miss (of some fashion). The
Google Chrome web browser uses a bloom filter for malicious URLs. It
usually avoids consulting Google's servers about whether or not any
given URL that is visited is malicious by using the bloom filter. This
is effective in large part because the top 100 websites ranked by
popularity have a huge falloff in popularity as you go down the list.
It looks like a Zipfian distribution, and so I imagine they get pretty
far with a very small bloom filter, even though in theory the chances
of any given valid URL resulting in a cache miss is very high.

Generally, uniform distributions are rare in a non-canonical list of
things, like a hash join outer relation's attribute.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#22Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Peter Geoghegan (#19)
Re: WIP: bloom filter in Hash Joins with batches

Hi,

On 01/10/2016 01:08 AM, Peter Geoghegan wrote:

On Sat, Jan 9, 2016 at 11:02 AM, Tomas Vondra
<tomas.vondra@2ndquadrant.com> wrote:

So, this seems to bring reasonable speedup, as long as the selectivity is
below 50%, and the data set is sufficiently large.

What about semijoins? Apparently they can use bloom filters
particularly effectively. Have you considered them as a special case?

You mean to handle them in a special way in the code, or just to perform
benchmark semijoins (and not just regular joins)?

Also, have you considered Hash join conditions with multiple
attributes as a special case? I'm thinking of cases like this:

regression=# set enable_mergejoin = off;
SET
regression=# explain analyze select * from tenk1 o join tenk2 t on
o.twenty = t.twenty and t.hundred = o.hundred;
QUERY PLAN
──────────────────────────────────────────────────────────────────────
Hash Join (cost=595.00..4103.00 rows=50000 width=488) (actual
time=12.086..1026.194 rows=1000000 loops=1)
Hash Cond: ((o.twenty = t.twenty) AND (o.hundred = t.hundred))
-> Seq Scan on tenk1 o (cost=0.00..458.00 rows=10000 width=244)
(actual time=0.017..4.212 rows=10000 loops=1)
-> Hash (cost=445.00..445.00 rows=10000 width=244) (actual
time=12.023..12.023 rows=10000 loops=1)
Buckets: 16384 Batches: 1 Memory Usage: 2824kB
-> Seq Scan on tenk2 t (cost=0.00..445.00 rows=10000
width=244) (actual time=0.006..3.453 rows=10000 loops=1)
Planning time: 0.567 ms
Execution time: 1116.094 ms
(8 rows)

(Note that while the optimizer has a slight preference for a merge
join in this case, the plan I show here is a bit faster on my
machine).

The patch I posted actually does not build bloom filter on the values
directly, but on the hashvalue we already use. So it handles hashjoins
with arbitrary number of attributes just fine.

Or perhaps you're thinking about some special optimization that might
improve such cases (I can't think of any)?

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#23Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Peter Geoghegan (#20)
Re: WIP: bloom filter in Hash Joins with batches

Hi,

On 01/10/2016 04:03 AM, Peter Geoghegan wrote:

On Sat, Jan 9, 2016 at 4:08 PM, Peter Geoghegan <pg@heroku.com> wrote:

Also, have you considered Hash join conditions with multiple
attributes as a special case? I'm thinking of cases like this:

Sorry, accidentally fat-fingered my enter key before I was finished
drafting that mail. That example isn't useful, because there is no
early/cheap elimination of tuples while scanning the outer relation.

My point about bloom filters on only one attribute (or perhaps
multiple bloom filters on multiple attributes) is that you might be
able to make the bloom filter more effective, particularly relative
to the amount of memory available, by only building it for one
attribute where that distinction (one attribute vs multiple) happens
to exist.

I'm not sure what you mean. The patch builds bloom filter on hashvalue,
not the attribute values directly. I find this very efficient as we
don't have to hash the original values again and instead work with just
a short 32-bit hashvalue.

I really doubt doing some magic by only building the bloom filter on one
of the attributes is useful - it's way more complicated, requires
estimating the ndistinct for each attribute, and also somehow estimate
the impact on the accuracy of the bloom filter. That seems rather
complex and I don't have a good idea how to do that.

Simon said: "So the objective must be to get a Bloom Filter that is
small enough that it lives in a higher/faster level of cache than the
main Hash table". I agree that that's really important here, although
I did note that Tomas wasn't so sure, emphasizing the importance of
avoiding serialization and deserialization overhead -- and certainly,
that's why the patch helps some cases a lot.

I think the impact of the bloom filter size really depends on the size
of the hash join. I see three cases, as indicated in the benchmarks I posted

(a) single batch (1M:10M)

- fitting into CPU cache really important (otherwise almost no
improvement)

- impossible to speed up for very small hash tables (that fit into
L3 cache)

(b) multiple batches w. medium data set (10M:100M)

- important, but not as much as for (a), as we still eliminate the
(de)serialization overhead

(c) large data set (5M:250M)

- not important, it's mostly about eliminating (de)serialization
overhead and/or I/O overhead

But Simon's point applies more to the worst case than the best or
average cases, and evidently we have plenty of worrying about the
worst case left to do here.

So what do you consider to be the worst case?

So, one attribute could have relatively low cardinality, and thus
fewer distinct items in the bloom filter's set, making it far slower
to degrade (i.e. have increased probability of false positives) as
compared to a composite of two or more attributes, and yet perhaps
not significantly less useful in terms of its ability to eliminate
(de)serialization overhead. Or, with two bloom filters (one per
attribute), one bloom filter could degrade far faster than the other
(due to having more distinct values), often very unpredictably, and
yet it wouldn't matter because we'd discard the bad one (maybe
really early, during the scan of the inner relation, using HLL).

I don't think so.

Firstly, I don't know what you mean by "slower to degrade" as the false
positive rate of a bloom filter does not depend on the cardinality of
the column used to build the bloom filter, but rather on the "load
factor" of the bloom filter (i.e. number of items added to the filter
compared to the initial capacity). Not to mention that you still have to
estimate the cardinality of the columns, which is tricky (and one of the
main issues of the current patch, IMHO).

Secondly, by splitting the "composite" bloom filter into per-column
filters you make it impossible to track correlation between the columns.

For example let's say we have two attributes (a,b), 'a' having 1000
distinct values while 'b' only has 10. But let's assume that there's a
correlation between 'a' and 'b' so that (mod(a,10) = b). If you build
the bloom filter on the columns separately, it's going to be entirely
useless. Sure, this is a rather trivial (and perhaps naive) example, but
it shows how easy it's to break it.

I'd also like to point out that vast majority of joins is on a single
column, so perhaps we should try to solve those first, and then perhaps
improve the multi-column case if possible.

I notice that all these example queries involve less-than operators
(inner relation tuples are thereby prevented from being entered into
the hash table). It might not be a terrible idea to hash abbreviated
keys (or even truncated abbreviated keys) for the bloom filter in
certain cases, in particular when there is a correlation in the inner
relation attributes (equi-joined attribute, and attribute that is
other part of qual). There might not be a correlation, of course, but
with some care hashing abbreviated keys may have virtually no
additional overhead, making it worth doing despite the general
uncertainty about any correlation existing. If you're going to accept
that the bloom filter can't be very large, which I think you must,
then hashing an entire value may be no better than hashing an
abbreviated key (those 8 bytes tend to have a lot of entropy). This
point is rather hand-wavy, though.

I have to admit that I have zero idea on how to do that. Also, there's
nothing really special about the '<' operator - the reason why I used it
is that it makes it very simple to filter arbitrary fraction of the
table (i.e. specify how many tuples of the outer relation have a
matching tuple in the hash table).

I'm not saying we can't apply the abbreviated keys somehow, but at this
point it seems rather like a hammer looking for a nail.

I suspect that BLOOM_ERROR_RATE isn't the most useful constraint
here. Is the degree to which it helps in sympathetic cases at all
commensurate with the degree to which it hurts in unsympathetic
cases? In your "low selectivity" cases (the sympathetic cases), there
are relatively few values represented in the main hash table, and
therefore in the bloom filter, and so a smaller bloom filter results
automatically anyway. But in the bad cases, the BLOOM_ERROR_RATE
constraint just wastes memory bandwidth for no gain, I think. If the
number of elements is so large that a reasonable fixed sized bloom
filter has a poor false positive rate anyway, we may have already
lost.

I agree that having a fixed error rate is somewhat annoying. What I
imagined would be something like this:

(1) estimate the number of distinct values the bloom filter

(2) see what error rate would make the bloom filter "small enough"
(so that it fits into L3)

(3) see if the error rate makes the bloom filter efficient (some
simple costing, or perhaps hard-coded threshold)

This however requires knowledge of the L3 cache size for (2), or rather
how much of it is available for the process (which is tricky to get).
And then (3) requires some costing function, which seems tricky too.

My sense is that we should try to make the bloom filter as cheap as
possible more so than trying to make sure it's useful before much
work has been done.

Well, yeah. Fail fast. But how?

Is it okay that you don't treat MCV/skew values as special? Actually,
looking at this code, I think I notice something:

@@ -238,6 +238,15 @@ ExecHashJoin(HashJoinState *node)
hashvalue);
node->hj_CurTuple = NULL;

+               /* If still in the first batch, we check the bloom filter. */
+               if ((hashtable->curbatch == 0) &&
+                   (! ExecHashBloomCheckValue(hashtable, hashvalue)))
+               {
+                       /* no matches; check for possible outer-join fill */
+                       node->hj_JoinState = HJ_FILL_OUTER_TUPLE;
+                       continue;
+               }

Haven't we already established by now that the value of
"node->hj_CurSkewBucketNo" may not be INVALID_SKEW_BUCKET_NO, and so
the value certainly was found in the inner relation scan? Why bother
doing anything with the bloom filter in that common case? (Note that
I'm not suggesting that we don't establish "node->hj_CurSkewBucketNo"
first).

Hmmmm, maybe. The bloom filter should contain all values, including
those from skew buckets. So what the code could / should do is check the
bloom filter first, and only do ExecHashGetSkewBucket() if we still
think the tuple may be in the hash table. So something like this:

node->hj_CurHashValue = hashvalue;
node->hj_CurTuple = NULL;

/* If still in the first batch, we check the bloom filter. */
if ((hashtable->curbatch == 0) &&
ExecHashBloomCheckValue(hashtable, hashvalue)))
{
/* no matches; check for possible outer-join fill */
node->hj_JoinState = HJ_FILL_OUTER_TUPLE;
continue;
}

ExecHashGetBucketAndBatch(hashtable, hashvalue,
&node->hj_CurBucketNo, &batchno);
node->hj_CurSkewBucketNo = ExecHashGetSkewBucket(hashtable,
hashvalue);

Not sure how expensive those two functions (ExecHashGetBucketAndBatch
and ExecHashGetSkewBucket) are, but this seems like a good idea. Haven't
tried that, though, so maybe HJ_FILL_OUTER_TUPLE needs that info or
something like that.

Makes sense?

Also, are you aware of this?

http://www.nus.edu.sg/nurop/2010/Proceedings/SoC/NUROP_Congress_Cheng%20Bin.pdf

It talks about bloom filters for hash joins in PostgreSQL
specifically. Interestingly, they talk about specific TPC-H queries.

Interesting. The way that paper uses bloom filters is very different
from what I do in the patch. They build the bloom filters and then
propagate them into the scan nodes to eliminate the tuples early.

The problem is they'd be facing mostly the same problems with sizing the
bloom filter I'm facing in the patch. The only way they managed to get
around them is that they used a dataset with fixed size (1GB, which is a
bit small), and bloom 1kB or 8kB bloom filters.

I suspect they'd get much worse results with datasets of "reasonable"
size (say, 100GB or more) because the bloom fixed-size filters would
stop being effective.

BTW, I think code like this needs better comments:

Yeah.

+static BloomFilter
+BloomFilterInit(double nrows, double error)
+{
+   /* perhaps we should round nbits to multiples of 8 ? */
+   int nbits = ceil((nrows * log(error)) / log(1.0 / (pow(2.0, log(2.0)))));
+   int nhashes = round(log(2.0) * nbits / nrows);
+
+   BloomFilter filter = palloc0(offsetof(BloomFilterData, data) +
((nbits + 7) / 8));
+
+   filter->nbits = nbits;
+   filter->nhashes = nhashes;

Have you experimentally verified that you get the expected probability
of false positives in practice?

I have seen that when the bloom filter is properly sized, and the data
set is not somehow skewed, the bloom filters have about the right false
positive rate.

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#24Tomas Vondra
tomas.vondra@2ndquadrant.com
In reply to: Peter Geoghegan (#21)
Re: WIP: bloom filter in Hash Joins with batches

Hi,

On 01/10/2016 05:11 AM, Peter Geoghegan wrote:

On Sat, Jan 9, 2016 at 11:02 AM, Tomas Vondra
<tomas.vondra@2ndquadrant.com> wrote:

Which means the "dim.r" column has 100 different values (0-99) with uniform
distribution. So e.g. "WHERE r < 15" matches 15%.

I think that the use of a uniform distribution to demonstrate this
patch is a bad idea, unless you want to have a conversation about the
worst case.

Look at the use cases for bloom filters in general. They're almost
all some variation on the same theme: checking a bloom filter
inexpensively, to avoid an expensive cache miss (of some fashion).

Right.

The Google Chrome web browser uses a bloom filter for malicious URLs.

FWIW I don't think Chrome is using bloom filter for this purpose
anymore. Chromium certainly does not (it's using PrefixSet instead).

It usually avoids consulting Google's servers about whether or not
any given URL that is visited is malicious by using the bloom filter.
This is effective in large part because the top 100 websites ranked
by popularity have a huge falloff in popularity as you go down the
list. It looks like a Zipfian distribution, and so I imagine they get
pretty far with a very small bloom filter, even though in theory the
chances of any given valid URL resulting in a cache miss is very
high.

I'm not familiar with how Chrome used bloom filters, but I'd expect them
to be very careful about false positives (and also false negatives, as
the bloom filter can't contain all malicious URLs).

My assumptions is that they've been able to make that work because they
do have detailed stats about how frequently people visit those URLs, and
use that when building the bloom filter. But we don't have such
information in hashjoin.

Generally, uniform distributions are rare in a non-canonical list of
things, like a hash join outer relation's attribute.

Well, I'm not claiming testing uniform distribution is enough, but
surely it's one of the cases we should handle just fine.

The problem with non-uniform cases is that it really depends on the
outer side of the join.

For example let's say the hash table contains 1000 values, and the bloom
filter has 1% false positive rate. But let's assume that the outer side
has a value that triggers the false positive rate, and that it's
actually 99% of the outer table. Suddenly, you have 99% false positive
rate, rendering the bloom filter pointless.

I don't think this is fixable while creating the bloom filter. All we
can do is watch the bloom filter lookups and disable the bloom filter
once the false positive rate reaches some threshold.

regards

--
Tomas Vondra http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#25David Rowley
david.rowley@2ndquadrant.com
In reply to: Tomas Vondra (#23)
Re: WIP: bloom filter in Hash Joins with batches

On 11 January 2016 at 09:30, Tomas Vondra <tomas.vondra@2ndquadrant.com>
wrote:

Hi,

On 01/10/2016 04:03 AM, Peter Geoghegan wrote:

On Sat, Jan 9, 2016 at 4:08 PM, Peter Geoghegan <pg@heroku.com> wrote:

Also, are you aware of this?

http://www.nus.edu.sg/nurop/2010/Proceedings/SoC/NUROP_Congress_Cheng%20Bin.pdf

It talks about bloom filters for hash joins in PostgreSQL
specifically. Interestingly, they talk about specific TPC-H queries.

Interesting. The way that paper uses bloom filters is very different from
what I do in the patch. They build the bloom filters and then propagate
them into the scan nodes to eliminate the tuples early.

That does sound interesting, but unless I'm somehow mistaken, I guess to do
that you'd have to abandon the more efficient hashing of the hash value
that you're doing in the current patch, and hash the complete value in the
scan node, then hash them again if they make it into the hash join node.
That does not sound like it would be a win if hashing longer varlana values.

--
David Rowley http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

#26Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tomas Vondra (#1)
Re: WIP: bloom filter in Hash Joins with batches

I'm closing this as returned-with-feedback; AFAICS even the last version
submitted is still in research stage. Please resubmit once you make
further progress.

Thanks,

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers