Small memory fixes for pg_createsubcriber

Started by Ranier Vilela11 months ago32 messages
#1Ranier Vilela
ranier.vf@gmail.com
1 attachment(s)

Hi.

Per Coverity.

Coverity has some reports about pg_createsubcriber.

CID 1591322: (#1 of 1): Resource leak (RESOURCE_LEAK)
10. leaked_storage: Variable dbname going out of scope leaks the storage it
points to.

Additionally there are several calls that are out of the ordinary,
according to the Postgres API.

According to the documentation:
libpq-exec <https://www.postgresql.org/docs/current/libpq-exec.html&gt;

The correct function to free memory when using PQescapeLiteral and
PQescapeIdentifier would be PQfreemem.

Trivial fixes attached.

best regards,
Ranier Vilela

Attachments:

fix-resource-leak-and-api-misuse-pg_createsubcriber.patchapplication/octet-stream; name=fix-resource-leak-and-api-misuse-pg_createsubcriber.patchDownload
diff --git a/src/bin/pg_basebackup/pg_createsubscriber.c b/src/bin/pg_basebackup/pg_createsubscriber.c
index faf18ccf13..2d881d54f5 100644
--- a/src/bin/pg_basebackup/pg_createsubscriber.c
+++ b/src/bin/pg_basebackup/pg_createsubscriber.c
@@ -1130,6 +1130,7 @@ check_and_drop_existing_subscriptions(PGconn *conn,
 
 	PQclear(res);
 	destroyPQExpBuffer(query);
+	PQfreemem(dbname);
 }
 
 /*
@@ -1329,7 +1330,7 @@ create_logical_replication_slot(PGconn *conn, struct LogicalRepInfo *dbinfo)
 					  "SELECT lsn FROM pg_catalog.pg_create_logical_replication_slot(%s, 'pgoutput', false, false, false)",
 					  slot_name_esc);
 
-	pg_free(slot_name_esc);
+	PQfreemem(slot_name_esc);
 
 	pg_log_debug("command is: %s", str->data);
 
@@ -1375,7 +1376,7 @@ drop_replication_slot(PGconn *conn, struct LogicalRepInfo *dbinfo,
 
 	appendPQExpBuffer(str, "SELECT pg_catalog.pg_drop_replication_slot(%s)", slot_name_esc);
 
-	pg_free(slot_name_esc);
+	PQfreemem(slot_name_esc);
 
 	pg_log_debug("command is: %s", str->data);
 
@@ -1614,8 +1615,8 @@ create_publication(PGconn *conn, struct LogicalRepInfo *dbinfo)
 	/* For cleanup purposes */
 	dbinfo->made_publication = true;
 
-	pg_free(ipubname_esc);
-	pg_free(spubname_esc);
+	PQfreemem(ipubname_esc);
+	PQfreemem(spubname_esc);
 	destroyPQExpBuffer(str);
 }
 
@@ -1638,7 +1639,7 @@ drop_publication(PGconn *conn, struct LogicalRepInfo *dbinfo)
 
 	appendPQExpBuffer(str, "DROP PUBLICATION %s", pubname_esc);
 
-	pg_free(pubname_esc);
+	PQfreemem(pubname_esc);
 
 	pg_log_debug("command is: %s", str->data);
 
@@ -1702,10 +1703,10 @@ create_subscription(PGconn *conn, const struct LogicalRepInfo *dbinfo)
 					  "slot_name = %s, copy_data = false)",
 					  subname_esc, pubconninfo_esc, pubname_esc, replslotname_esc);
 
-	pg_free(pubname_esc);
-	pg_free(subname_esc);
-	pg_free(pubconninfo_esc);
-	pg_free(replslotname_esc);
+	PQfreemem(pubname_esc);
+	PQfreemem(subname_esc);
+	PQfreemem(pubconninfo_esc);
+	PQfreemem(replslotname_esc);
 
 	pg_log_debug("command is: %s", str->data);
 
@@ -1812,8 +1813,8 @@ set_replication_progress(PGconn *conn, const struct LogicalRepInfo *dbinfo, cons
 		PQclear(res);
 	}
 
-	pg_free(subname);
-	pg_free(dbname);
+	PQfreemem(subname);
+	PQfreemem(dbname);
 	pg_free(originname);
 	pg_free(lsnstr);
 	destroyPQExpBuffer(str);
@@ -1856,7 +1857,7 @@ enable_subscription(PGconn *conn, const struct LogicalRepInfo *dbinfo)
 		PQclear(res);
 	}
 
-	pg_free(subname);
+	PQfreemem(subname);
 	destroyPQExpBuffer(str);
 }
 
#2Euler Taveira
euler@eulerto.com
In reply to: Ranier Vilela (#1)
Re: Small memory fixes for pg_createsubcriber

On Mon, Feb 10, 2025, at 1:31 PM, Ranier Vilela wrote:

Coverity has some reports about pg_createsubcriber.

CID 1591322: (#1 of 1): Resource leak (RESOURCE_LEAK)
10. leaked_storage: Variable dbname going out of scope leaks the storage it points to.
Additionally there are several calls that are out of the ordinary, according to the Postgres API.

According to the documentation:
libpq-exec <https://www.postgresql.org/docs/current/libpq-exec.html&gt;

The correct function to free memory when using PQescapeLiteral and PQescapeIdentifier would be PQfreemem.

Hi,

From src/common/fe_memutils.c:

void
pg_free(void *ptr)
{
free(ptr);
}

From src/interfaces/libpq/fe-exec.c:

void
PQfreemem(void *ptr)
{
free(ptr);
}

There is no bug. They are the same behind the scenes. I'm fine changing it. It
is a new code and it wouldn't cause a lot of pain to backpatch patches in the
future.

@@ -1130,6 +1130,7 @@ check_and_drop_existing_subscriptions(PGconn *conn,

PQclear(res);
destroyPQExpBuffer(query);
+ PQfreemem(dbname);
}

Even if the pg_createsubscriber aims to run in a small amount of time, hence,
it is fine to leak memory, the initial commit cleaned up all variables but a
subsequent commit 4867f8a555c apparently didn't. Although it is just a low
impact improvement, it is better to be strict and shut up SASTs.

--
Euler Taveira
EDB https://www.enterprisedb.com/

#3Michael Paquier
michael@paquier.xyz
In reply to: Euler Taveira (#2)
Re: Small memory fixes for pg_createsubcriber

On Tue, Feb 11, 2025 at 01:32:32PM -0300, Euler Taveira wrote:

There is no bug. They are the same behind the scenes. I'm fine changing it. It
is a new code and it wouldn't cause a lot of pain to backpatch patches in the
future.

On consistency grounds, and as this is documented in fe-exec.c at the
top of PQfreemem(), I can get behind the switch.

Even if the pg_createsubscriber aims to run in a small amount of time, hence,
it is fine to leak memory, the initial commit cleaned up all variables but a
subsequent commit 4867f8a555c apparently didn't. Although it is just a low
impact improvement, it is better to be strict and shut up SASTs.

check_and_drop_existing_subscriptions() is called once per database in
setup_subscriber(), and we are not going to have millions of them in
this list. We don't usually care for such short-lived things, but as
the original commit did the effort in d44032d01463, I don't see why we
cannot do it here, either.
--
Michael

#4Ranier Vilela
ranier.vf@gmail.com
In reply to: Michael Paquier (#3)
Re: Small memory fixes for pg_createsubcriber

Em qua., 12 de fev. de 2025 às 00:54, Michael Paquier <michael@paquier.xyz>
escreveu:

On Tue, Feb 11, 2025 at 01:32:32PM -0300, Euler Taveira wrote:

There is no bug. They are the same behind the scenes. I'm fine changing

it. It

is a new code and it wouldn't cause a lot of pain to backpatch patches

in the

future.

On consistency grounds, and as this is documented in fe-exec.c at the
top of PQfreemem(), I can get behind the switch.

Even if the pg_createsubscriber aims to run in a small amount of time,

hence,

it is fine to leak memory, the initial commit cleaned up all variables

but a

subsequent commit 4867f8a555c apparently didn't. Although it is just a

low

impact improvement, it is better to be strict and shut up SASTs.

check_and_drop_existing_subscriptions() is called once per database in
setup_subscriber(), and we are not going to have millions of them in
this list. We don't usually care for such short-lived things, but as
the original commit did the effort in d44032d01463, I don't see why we
cannot do it here, either.

Thanks Michael.

best regards,
Ranier Vilela

#5Andres Freund
andres@anarazel.de
In reply to: Euler Taveira (#2)
Re: Small memory fixes for pg_createsubcriber

Hi,

On 2025-02-11 13:32:32 -0300, Euler Taveira wrote:

On Mon, Feb 10, 2025, at 1:31 PM, Ranier Vilela wrote:

Coverity has some reports about pg_createsubcriber.

CID 1591322: (#1 of 1): Resource leak (RESOURCE_LEAK)
10. leaked_storage: Variable dbname going out of scope leaks the storage it points to.
Additionally there are several calls that are out of the ordinary, according to the Postgres API.

According to the documentation:
libpq-exec <https://www.postgresql.org/docs/current/libpq-exec.html&gt;

The correct function to free memory when using PQescapeLiteral and PQescapeIdentifier would be PQfreemem.

Hi,

From src/common/fe_memutils.c:

void
pg_free(void *ptr)
{
free(ptr);
}

From src/interfaces/libpq/fe-exec.c:

void
PQfreemem(void *ptr)
{
free(ptr);
}

There is no bug. They are the same behind the scenes. I'm fine changing it. It
is a new code and it wouldn't cause a lot of pain to backpatch patches in the
future.

That *is* a bug. On windows the allocator that a shared library (i.e. libpq)
uses, may *not* be the same as the one that an executable
(i.e. pg_createsubscriber). It's not correct to free memory allocated in a
shared library just with free, it has to go through the library's free.

Greetings,

Andres Freund

#6Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andres Freund (#5)
Re: Small memory fixes for pg_createsubcriber

Andres Freund <andres@anarazel.de> writes:

On 2025-02-11 13:32:32 -0300, Euler Taveira wrote:

There is no bug. They are the same behind the scenes.

That *is* a bug. On windows the allocator that a shared library (i.e. libpq)
uses, may *not* be the same as the one that an executable
(i.e. pg_createsubscriber). It's not correct to free memory allocated in a
shared library just with free, it has to go through the library's free.

Indeed. This is particularly pernicious because it will work even on
Windows under common scenarios (which no doubt explains the lack of
field reports). From the last time we discussed this [1]/messages/by-id/20240709225934.746y5fg3kgxkyant@awork3.anarazel.de:

It seems to work fine as long as a debug-readline is paired with a
debug-psql or a release-readline is paired with a release-psql.

I wish we had some way to detect misuses automatically ...

This seems like the sort of bug that Coverity could detect if only it
knew to look, but I have no idea if it could be configured that way.
Maybe some weird lashup with a debugging malloc library would be
another way.

regards, tom lane

[1]: /messages/by-id/20240709225934.746y5fg3kgxkyant@awork3.anarazel.de

#7Ranier Vilela
ranier.vf@gmail.com
In reply to: Tom Lane (#6)
1 attachment(s)
Re: Small memory fixes for pg_createsubcriber

Hi.

Em qua., 12 de fev. de 2025 às 13:02, Tom Lane <tgl@sss.pgh.pa.us> escreveu:

Andres Freund <andres@anarazel.de> writes:

On 2025-02-11 13:32:32 -0300, Euler Taveira wrote:

There is no bug. They are the same behind the scenes.

That *is* a bug. On windows the allocator that a shared library (i.e.

libpq)

uses, may *not* be the same as the one that an executable
(i.e. pg_createsubscriber). It's not correct to free memory allocated

in a

shared library just with free, it has to go through the library's free.

Indeed. This is particularly pernicious because it will work even on
Windows under common scenarios (which no doubt explains the lack of
field reports). From the last time we discussed this [1]:

It seems to work fine as long as a debug-readline is paired with a
debug-psql or a release-readline is paired with a release-psql.

I wish we had some way to detect misuses automatically ...

Unfortunately, for now, there is only manual search.

In fact, after your post, I did a new search and found two other
occurrences.
(src/bin/pg_amcheck/pg_amcheck.c)

One fixed in the patch attached.
Another *dat->amcheck_schema* is it not worth the effort,
since the memory is not released at any point?

Trivial patch attached.

best regards,
Ranier Vilela

Attachments:

fix-api-misuse-pg_amcheck.patchapplication/octet-stream; name=fix-api-misuse-pg_amcheck.patchDownload
diff --git a/src/bin/pg_amcheck/pg_amcheck.c b/src/bin/pg_amcheck/pg_amcheck.c
index c5ec25be22..dda8b1b8ad 100644
--- a/src/bin/pg_amcheck/pg_amcheck.c
+++ b/src/bin/pg_amcheck/pg_amcheck.c
@@ -560,7 +560,7 @@ main(int argc, char *argv[])
 
 			executeCommand(conn, install_sql, opts.echo);
 			pfree(install_sql);
-			pfree(schema);
+			PQfreemem(schema);
 		}
 
 		/*
#8Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#6)
Re: Small memory fixes for pg_createsubcriber

Hi,

On 2025-02-12 11:02:04 -0500, Tom Lane wrote:

I wish we had some way to detect misuses automatically ...

This seems like the sort of bug that Coverity could detect if only it
knew to look, but I have no idea if it could be configured that way.
Maybe some weird lashup with a debugging malloc library would be
another way.

Recent gcc actually has a fairly good way to detect this kind of issue:
https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute
in particular, the variant of the attribute with "deallocator".

I'd started on a patch to add those, but ran out of cycles for 18.

I quickly checked out my branch and added the relevant attributes to
PQescapeLiteral(), PQescapeIdentifier() and that indeed finds the issue
pointed out in this thread:

../../../../../home/andres/src/postgresql/src/bin/pg_basebackup/pg_createsubscriber.c: In function 'create_logical_replication_slot':
../../../../../home/andres/src/postgresql/src/bin/pg_basebackup/pg_createsubscriber.c:1332:9: warning: 'pg_free' called on pointer returned from a mismatched allocation function [-Wmismatched-dealloc]
1332 | pg_free(slot_name_esc);
| ^~~~~~~~~~~~~~~~~~~~~~
../../../../../home/andres/src/postgresql/src/bin/pg_basebackup/pg_createsubscriber.c:1326:25: note: returned from 'PQescapeLiteral'
1326 | slot_name_esc = PQescapeLiteral(conn, slot_name, strlen(slot_name));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
...

but also finds one more:
[62/214 42 28%] Compiling C object src/bin/pg_amcheck/pg_amcheck.p/pg_amcheck.c.o
../../../../../home/andres/src/postgresql/src/bin/pg_amcheck/pg_amcheck.c: In function 'main':
../../../../../home/andres/src/postgresql/src/bin/pg_amcheck/pg_amcheck.c:563:25: warning: 'pfree' called on pointer returned from a mismatched allocation function [-Wmismatched-dealloc]
563 | pfree(schema);
| ^~~~~~~~~~~~~
../../../../../home/andres/src/postgresql/src/bin/pg_amcheck/pg_amcheck.c:556:34: note: returned from 'PQescapeIdentifier'
556 | schema = PQescapeIdentifier(conn, opts.install_schema,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
557 | strlen(opts.install_schema));
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Note that that doesn't just require adding the attributes to
PQescapeIdentifier() etc, but also to pg_malloc(), as the latter is how gcc
knows that pg_pfree() is a deallocating function.

Particularly for something like libpq it's not quitetrivial to add
attributes like this, of course. We can't even depend on pg_config.h.

One way would be to define them in libpq-fe.h, guarded by an #ifdef, that's
"armed" by a commandline -D flag, if the compiler is supported?

Greetings,

Andres Freund

In reply to: Andres Freund (#8)
Re: Small memory fixes for pg_createsubcriber

Andres Freund <andres@anarazel.de> writes:

Hi,

On 2025-02-12 11:02:04 -0500, Tom Lane wrote:

I wish we had some way to detect misuses automatically ...

This seems like the sort of bug that Coverity could detect if only it
knew to look, but I have no idea if it could be configured that way.
Maybe some weird lashup with a debugging malloc library would be
another way.

Recent gcc actually has a fairly good way to detect this kind of issue:
https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute
in particular, the variant of the attribute with "deallocator".

[...]

Note that that doesn't just require adding the attributes to
PQescapeIdentifier() etc, but also to pg_malloc(), as the latter is how gcc
knows that pg_pfree() is a deallocating function.

Particularly for something like libpq it's not quitetrivial to add
attributes like this, of course. We can't even depend on pg_config.h.

One way would be to define them in libpq-fe.h, guarded by an #ifdef, that's
"armed" by a commandline -D flag, if the compiler is supported?

Does it need a -D flag, wouldn't __has_attribute(malloc) (with the
fallback definition in c.h) be enough?

- ilmari

#10Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dagfinn Ilmari Mannsåker (#9)
Re: Small memory fixes for pg_createsubcriber

=?utf-8?Q?Dagfinn_Ilmari_Manns=C3=A5ker?= <ilmari@ilmari.org> writes:

Andres Freund <andres@anarazel.de> writes:

Particularly for something like libpq it's not quitetrivial to add
attributes like this, of course. We can't even depend on pg_config.h.
One way would be to define them in libpq-fe.h, guarded by an #ifdef, that's
"armed" by a commandline -D flag, if the compiler is supported?

Does it need a -D flag, wouldn't __has_attribute(malloc) (with the
fallback definition in c.h) be enough?

libpq-fe.h has to be compilable by application code that has never
heard of pg_config.h let alone c.h, so we'd have to tread carefully
about not breaking that property. But it seems like this would be
worth looking into.

regards, tom lane

In reply to: Tom Lane (#10)
Re: Small memory fixes for pg_createsubcriber

Tom Lane <tgl@sss.pgh.pa.us> writes:

=?utf-8?Q?Dagfinn_Ilmari_Manns=C3=A5ker?= <ilmari@ilmari.org> writes:

Andres Freund <andres@anarazel.de> writes:

Particularly for something like libpq it's not quitetrivial to add
attributes like this, of course. We can't even depend on pg_config.h.
One way would be to define them in libpq-fe.h, guarded by an #ifdef, that's
"armed" by a commandline -D flag, if the compiler is supported?

Does it need a -D flag, wouldn't __has_attribute(malloc) (with the
fallback definition in c.h) be enough?

libpq-fe.h has to be compilable by application code that has never
heard of pg_config.h let alone c.h, so we'd have to tread carefully
about not breaking that property. But it seems like this would be
worth looking into.

The fallback code isn't exactly complicated, so we could just duplicate
it in libpq-fe.h:

#ifndef __has_attribute
#define __has_attribute(attribute) 0
#endif

And then do something like this:

#if __has_attribute (malloc)
#define pg_attribute_malloc __attribute__((malloc))
#define pg_attribute_deallocator(...) __attribute__((malloc(__VA_ARGS__)))
#else
#define pg_attribute_malloc
#define pg_attribute_deallocator(...)
#endif

regards, tom lane

- ilmari

#12Tom Lane
tgl@sss.pgh.pa.us
In reply to: Dagfinn Ilmari Mannsåker (#11)
Re: Small memory fixes for pg_createsubcriber

=?utf-8?Q?Dagfinn_Ilmari_Manns=C3=A5ker?= <ilmari@ilmari.org> writes:

Tom Lane <tgl@sss.pgh.pa.us> writes:

libpq-fe.h has to be compilable by application code that has never
heard of pg_config.h let alone c.h, so we'd have to tread carefully
about not breaking that property. But it seems like this would be
worth looking into.

The fallback code isn't exactly complicated, so we could just duplicate
it in libpq-fe.h:

#ifndef __has_attribute
#define __has_attribute(attribute) 0
#endif

The problem with that approach is the likelihood of stomping on
symbols that a calling application will use later. I think we
really need a controlling #ifdef check on some PG_FOO symbol
that we can be sure no outside application will have defined.
Roughly speaking,

#ifdef PG_USE_ALLOCATOR_CHECKS
#define pg_attribute_malloc __attribute__((malloc))
...
#else
#define pg_attribute_malloc
...
#endif

and then we could make definition of PG_USE_ALLOCATOR_CHECKS
be conditional on having the right compiler behavior, rather
than trusting that a nest of #ifdef checks is sufficient to
detect that.

regards, tom lane

#13Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#12)
1 attachment(s)
Re: Small memory fixes for pg_createsubcriber

I experimented with the other approach: hack libpq.so to depend on
dmalloc, leaving the rest of the system alone, so that libpq's
allocations could not be freed elsewhere nor vice versa.

It could not even get through initdb, crashing here:

replace_guc_value(char **lines, const char *guc_name, const char *guc_value,
bool mark_as_comment)
{
PQExpBuffer newline = createPQExpBuffer();

...
free(newline); /* but don't free newline->data */

which upon investigation is expected, because createPQExpBuffer is
exported by libpq and therefore is returning space allocated within
the shlib. Diking out that particular free() call just allows it
to crash a bit later on, because initdb is totally full of direct
manipulations of PQExpBuffer contents.

This indicates to me that we have a *far* larger problem than
we thought, if we'd like to be totally clean on this point.

Realistically, it's not going to happen that way; it's just
not worth the trouble and notational mess. I think if we're
honest we should just document that such-and-such combinations
of libpq and our client programs will work on Windows.

For amusement's sake, totally dirty hack-and-slash patch attached.
(I tested this on macOS, with dmalloc from MacPorts; adjust SHLIB_LINK
to suit on other platforms.)

regards, tom lane

Attachments:

use-dmalloc-within-libpq-hack-hack-hack.patchtext/x-diff; charset=us-ascii; name=use-dmalloc-within-libpq-hack-hack-hack.patchDownload
diff --git a/src/interfaces/libpq/Makefile b/src/interfaces/libpq/Makefile
index 701810a272a..91dc2e14d99 100644
--- a/src/interfaces/libpq/Makefile
+++ b/src/interfaces/libpq/Makefile
@@ -81,7 +81,7 @@ endif
 # that are built correctly for use in a shlib.
 SHLIB_LINK_INTERNAL = -lpgcommon_shlib -lpgport_shlib
 ifneq ($(PORTNAME), win32)
-SHLIB_LINK += $(filter -lcrypt -ldes -lcom_err -lcrypto -lk5crypto -lkrb5 -lgssapi_krb5 -lgss -lgssapi -lssl -lsocket -lnsl -lresolv -lintl -lm, $(LIBS)) $(LDAP_LIBS_FE) $(PTHREAD_LIBS)
+SHLIB_LINK += $(filter -lcrypt -ldes -lcom_err -lcrypto -lk5crypto -lkrb5 -lgssapi_krb5 -lgss -lgssapi -lssl -lsocket -lnsl -lresolv -lintl -lm, $(LIBS)) $(LDAP_LIBS_FE) -L/opt/local/lib -ldmalloc $(PTHREAD_LIBS)
 else
 SHLIB_LINK += $(filter -lcrypt -ldes -lcom_err -lcrypto -lk5crypto -lkrb5 -lgssapi32 -lssl -lsocket -lnsl -lresolv -lintl -lm $(PTHREAD_LIBS), $(LIBS)) $(LDAP_LIBS_FE)
 endif
@@ -116,11 +116,6 @@ backend_src = $(top_srcdir)/src/backend
 # coding rule.
 libpq-refs-stamp: $(shlib)
 ifneq ($(enable_coverage), yes)
-ifeq (,$(filter solaris,$(PORTNAME)))
-	@if nm -A -u $< 2>/dev/null | grep -v -e __cxa_atexit -e __tsan_func_exit | grep exit; then \
-		echo 'libpq must not be calling any function which invokes exit'; exit 1; \
-	fi
-endif
 endif
 	touch $@
 
diff --git a/src/interfaces/libpq/fe-auth-sasl.h b/src/interfaces/libpq/fe-auth-sasl.h
index f06f547c07d..1abafe8d34b 100644
--- a/src/interfaces/libpq/fe-auth-sasl.h
+++ b/src/interfaces/libpq/fe-auth-sasl.h
@@ -146,7 +146,7 @@ typedef struct pg_fe_sasl_mech
 	 *   state:    The opaque mechanism state returned by init()
 	 *--------
 	 */
-	void		(*free) (void *state);
+	void		(*saslfree) (void *state);
 
 } pg_fe_sasl_mech;
 
diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
index 85d1ca2864f..56ff7bc3b9d 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -573,7 +573,7 @@ pqDropConnection(PGconn *conn, bool flushInput)
 #endif
 	if (conn->sasl_state)
 	{
-		conn->sasl->free(conn->sasl_state);
+		conn->sasl->saslfree(conn->sasl_state);
 		conn->sasl_state = NULL;
 	}
 }
diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h
index 2546f9f8a50..7296d00b34f 100644
--- a/src/interfaces/libpq/libpq-int.h
+++ b/src/interfaces/libpq/libpq-int.h
@@ -20,6 +20,8 @@
 #ifndef LIBPQ_INT_H
 #define LIBPQ_INT_H
 
+#include <dmalloc.h>
+
 /* We assume libpq-fe.h has already been included. */
 #include "libpq-events.h"
 
In reply to: Tom Lane (#12)
Re: Small memory fixes for pg_createsubcriber

Tom Lane <tgl@sss.pgh.pa.us> writes:

=?utf-8?Q?Dagfinn_Ilmari_Manns=C3=A5ker?= <ilmari@ilmari.org> writes:

Tom Lane <tgl@sss.pgh.pa.us> writes:

libpq-fe.h has to be compilable by application code that has never
heard of pg_config.h let alone c.h, so we'd have to tread carefully
about not breaking that property. But it seems like this would be
worth looking into.

The fallback code isn't exactly complicated, so we could just duplicate
it in libpq-fe.h:

#ifndef __has_attribute
#define __has_attribute(attribute) 0
#endif

The problem with that approach is the likelihood of stomping on
symbols that a calling application will use later. I think we
really need a controlling #ifdef check on some PG_FOO symbol
that we can be sure no outside application will have defined.
Roughly speaking,

#ifdef PG_USE_ALLOCATOR_CHECKS

As long as we're not checking for too many attributes, we could avoid
introducing the __has_attribute symbol by doing:

#if defined(__has_attribute) && __has_attribute(malloc)

#define pg_attribute_malloc __attribute__((malloc))
...
#else
#define pg_attribute_malloc
...
#endif

and then we could make definition of PG_USE_ALLOCATOR_CHECKS
be conditional on having the right compiler behavior, rather
than trusting that a nest of #ifdef checks is sufficient to
detect that.

But I just looked at the clang attribute docs
(https://clang.llvm.org/docs/AttributeReference.html#malloc), and it
only has the argumentless version, not the one that that declares the
matching deallocator, so you're right we need a more comprehensive
check.

regards, tom lane

- ilmari

#15Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ranier Vilela (#1)
Re: Small memory fixes for pg_createsubcriber

Ranier Vilela <ranier.vf@gmail.com> writes:

Coverity has some reports about pg_createsubcriber.

CID 1591322: (#1 of 1): Resource leak (RESOURCE_LEAK)
10. leaked_storage: Variable dbname going out of scope leaks the storage it
points to.

FTR, the security team's Coverity instance also complained about that.
I was planning to fix it after the release freeze lifted, but you
beat me to it, which is fine. Our report turned up a couple other
things that I just pushed fixes for.

(It seems like Coverity must've updated their rules recently,
because we also got a bunch of false-positive reports that were
not there before, mostly in pre-existing code.)

regards, tom lane

#16Michael Paquier
michael@paquier.xyz
In reply to: Andres Freund (#8)
1 attachment(s)
Re: Small memory fixes for pg_createsubcriber

On Wed, Feb 12, 2025 at 12:00:03PM -0500, Andres Freund wrote:

Particularly for something like libpq it's not quitetrivial to add
attributes like this, of course. We can't even depend on pg_config.h.

One way would be to define them in libpq-fe.h, guarded by an #ifdef, that's
"armed" by a commandline -D flag, if the compiler is supported?

Interesting set of tricks.

I have looked at bit at the uses of PQescapeLiteral() and
PQescapeIdentifier() in the tree. On top of the one in pg_amcheck you
are just pointing to, there is an inconsistency in pg_upgrade.c for
set_locale_and_encoding() where datlocale_literal may be allocated
with a pg_strdup() or a PQescapeLiteral() depending on the path. The
code has been using PQfreemem() for the pg_strdup() allocation, which
is logically incorrect.

The pg_upgrade path is fancy as designed this way, for sure, but
that's less invasive than hardcoding three times "NULL". Any thoughts
about backpatching something like that for both of them?
--
Michael

Attachments:

libpq-escape-fixes.patchtext/x-diff; charset=us-asciiDownload
diff --git a/src/bin/pg_amcheck/pg_amcheck.c b/src/bin/pg_amcheck/pg_amcheck.c
index c5ec25be22b..dda8b1b8ade 100644
--- a/src/bin/pg_amcheck/pg_amcheck.c
+++ b/src/bin/pg_amcheck/pg_amcheck.c
@@ -560,7 +560,7 @@ main(int argc, char *argv[])
 
 			executeCommand(conn, install_sql, opts.echo);
 			pfree(install_sql);
-			pfree(schema);
+			PQfreemem(schema);
 		}
 
 		/*
diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c
index 36c7f3879d5..d854ad110ee 100644
--- a/src/bin/pg_upgrade/pg_upgrade.c
+++ b/src/bin/pg_upgrade/pg_upgrade.c
@@ -465,7 +465,10 @@ set_locale_and_encoding(void)
 
 	PQfreemem(datcollate_literal);
 	PQfreemem(datctype_literal);
-	PQfreemem(datlocale_literal);
+	if (locale->db_locale)
+		PQfreemem(datlocale_literal);
+	else
+		pg_free(datlocale_literal);
 
 	PQfinish(conn_new_template1);
 
#17Michael Paquier
michael@paquier.xyz
In reply to: Tom Lane (#13)
Re: Small memory fixes for pg_createsubcriber

On Wed, Feb 12, 2025 at 01:35:20PM -0500, Tom Lane wrote:

For amusement's sake, totally dirty hack-and-slash patch attached.
(I tested this on macOS, with dmalloc from MacPorts; adjust SHLIB_LINK
to suit on other platforms.)

Ugh. Fun one.
--
Michael

#18Tom Lane
tgl@sss.pgh.pa.us
In reply to: Michael Paquier (#16)
Re: Small memory fixes for pg_createsubcriber

Michael Paquier <michael@paquier.xyz> writes:

I have looked at bit at the uses of PQescapeLiteral() and
PQescapeIdentifier() in the tree. On top of the one in pg_amcheck you
are just pointing to, there is an inconsistency in pg_upgrade.c for
set_locale_and_encoding() where datlocale_literal may be allocated
with a pg_strdup() or a PQescapeLiteral() depending on the path. The
code has been using PQfreemem() for the pg_strdup() allocation, which
is logically incorrect.

Yeah, I suspected there would be places like that. It just hasn't
mattered in practice up to now. (I have a vague recollection that
Windows used to be pickier about this, but evidently not in recent
years.)

I spent a little time earlier today seeing what I could do with the
use-dmalloc patch I posted earlier. It turns out you can get through
initdb after s/free/PQfreemem/ in just two places, and then the
backend works fine. But psql is a frickin' disaster --- there's
free's of strings made with PQExpBuffer all over its backslash-command
handling, and no easy way to clean it up. Maybe other clients will
be less of a mess, but I'm not betting on that.

regards, tom lane

#19Michael Paquier
michael@paquier.xyz
In reply to: Tom Lane (#18)
Re: Small memory fixes for pg_createsubcriber

On Wed, Feb 12, 2025 at 07:08:31PM -0500, Tom Lane wrote:

I spent a little time earlier today seeing what I could do with the
use-dmalloc patch I posted earlier. It turns out you can get through
initdb after s/free/PQfreemem/ in just two places, and then the
backend works fine. But psql is a frickin' disaster --- there's
free's of strings made with PQExpBuffer all over its backslash-command
handling, and no easy way to clean it up. Maybe other clients will
be less of a mess, but I'm not betting on that.

Hmm. Okay. It sounds like it would be better to group everything
that has been pointed together towards what should be a more generic
solution than what I have posted. So I am holding on touching
anything.
--
Michael

#20Ranier Vilela
ranier.vf@gmail.com
In reply to: Tom Lane (#15)
Re: Small memory fixes for pg_createsubcriber

Em qua., 12 de fev. de 2025 às 18:17, Tom Lane <tgl@sss.pgh.pa.us> escreveu:

Ranier Vilela <ranier.vf@gmail.com> writes:

Coverity has some reports about pg_createsubcriber.

CID 1591322: (#1 of 1): Resource leak (RESOURCE_LEAK)
10. leaked_storage: Variable dbname going out of scope leaks the storage

it

points to.

FTR, the security team's Coverity instance also complained about that.
I was planning to fix it after the release freeze lifted, but you
beat me to it, which is fine. Our report turned up a couple other
things that I just pushed fixes for.

Yeah, I see the commits, thanks for that.
I still have some reports that I could post that Coverity thinks are bugs.
They are not, but I think it is worth the effort to fix them because the
code is confusing.
I think it would improve readability and future maintainability.

(It seems like Coverity must've updated their rules recently,
because we also got a bunch of false-positive reports that were
not there before, mostly in pre-existing code.)

I believe they are trying to innovate at some point.
Many of these false positives come from a risky coding style,
I am much more cautious in my analyses.

best regards,
Ranier Vilela

#21Michael Paquier
michael@paquier.xyz
In reply to: Michael Paquier (#19)
Re: Small memory fixes for pg_createsubcriber

On Thu, Feb 13, 2025 at 01:50:29PM +0900, Michael Paquier wrote:

On Wed, Feb 12, 2025 at 07:08:31PM -0500, Tom Lane wrote:

I spent a little time earlier today seeing what I could do with the
use-dmalloc patch I posted earlier. It turns out you can get through
initdb after s/free/PQfreemem/ in just two places, and then the
backend works fine. But psql is a frickin' disaster --- there's
free's of strings made with PQExpBuffer all over its backslash-command
handling, and no easy way to clean it up. Maybe other clients will
be less of a mess, but I'm not betting on that.

Hmm. Okay. It sounds like it would be better to group everything
that has been pointed together towards what should be a more generic
solution than what I have posted. So I am holding on touching
anything.

Two weeks later. Would there be any objections for doing something in
the lines of [1]/messages/by-id/Z601RQxTmIUohdkV@paquier.xyz -- Michael for pg_upgrade and pg_amcheck? The pg_upgrade bit is
a bit strange, for sure, still it's better than the current state of
things.

[1]: /messages/by-id/Z601RQxTmIUohdkV@paquier.xyz -- Michael
--
Michael

#22Ranier Vilela
ranier.vf@gmail.com
In reply to: Michael Paquier (#21)
1 attachment(s)
Re: Small memory fixes for pg_createsubcriber

Em ter., 25 de fev. de 2025 às 03:02, Michael Paquier <michael@paquier.xyz>
escreveu:

On Thu, Feb 13, 2025 at 01:50:29PM +0900, Michael Paquier wrote:

On Wed, Feb 12, 2025 at 07:08:31PM -0500, Tom Lane wrote:

I spent a little time earlier today seeing what I could do with the
use-dmalloc patch I posted earlier. It turns out you can get through
initdb after s/free/PQfreemem/ in just two places, and then the
backend works fine. But psql is a frickin' disaster --- there's
free's of strings made with PQExpBuffer all over its backslash-command
handling, and no easy way to clean it up. Maybe other clients will
be less of a mess, but I'm not betting on that.

Hmm. Okay. It sounds like it would be better to group everything
that has been pointed together towards what should be a more generic
solution than what I have posted. So I am holding on touching
anything.

Two weeks later. Would there be any objections for doing something in
the lines of [1] for pg_upgrade and pg_amcheck?

I prefer not to mix api.

We already have a branch for decision.
Let's use it then.

diff --git a/src/bin/pg_upgrade/pg_upgrade.c
b/src/bin/pg_upgrade/pg_upgrade.c
index d95c491fb5..b2c8e8e420 100644
--- a/src/bin/pg_upgrade/pg_upgrade.c
+++ b/src/bin/pg_upgrade/pg_upgrade.c
@@ -455,7 +455,9 @@ set_locale_and_encoding(void)
  locale->db_locale,
  strlen(locale->db_locale));
  else
- datlocale_literal = pg_strdup("NULL");
+ datlocale_literal = PQescapeLiteral(conn_new_template1,
+ "NULL",
+ strlen("NULL"));

best regards,
Ranier Vilela

Attachments:

avoid-mix-api-pg_upgrade.patchapplication/octet-stream; name=avoid-mix-api-pg_upgrade.patchDownload
diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c
index d95c491fb5..b2c8e8e420 100644
--- a/src/bin/pg_upgrade/pg_upgrade.c
+++ b/src/bin/pg_upgrade/pg_upgrade.c
@@ -455,7 +455,9 @@ set_locale_and_encoding(void)
 											locale->db_locale,
 											strlen(locale->db_locale));
 	else
-		datlocale_literal = pg_strdup("NULL");
+		datlocale_literal = PQescapeLiteral(conn_new_template1,
+											"NULL",
+											strlen("NULL"));
 
 	/* update template0 in new cluster */
 	if (GET_MAJOR_VERSION(new_cluster.major_version) >= 1700)
#23Andres Freund
andres@anarazel.de
In reply to: Tom Lane (#18)
Re: Small memory fixes for pg_createsubcriber

Hi,

On 2025-02-12 19:08:31 -0500, Tom Lane wrote:

Michael Paquier <michael@paquier.xyz> writes:

I have looked at bit at the uses of PQescapeLiteral() and
PQescapeIdentifier() in the tree. On top of the one in pg_amcheck you
are just pointing to, there is an inconsistency in pg_upgrade.c for
set_locale_and_encoding() where datlocale_literal may be allocated
with a pg_strdup() or a PQescapeLiteral() depending on the path. The
code has been using PQfreemem() for the pg_strdup() allocation, which
is logically incorrect.

Yeah, I suspected there would be places like that. It just hasn't
mattered in practice up to now. (I have a vague recollection that
Windows used to be pickier about this, but evidently not in recent
years.)

It's a question of compiler / link options. If you e.g. have a debug psql
runtime linked against a non-debug libpq, the allocators for both will
differ. Or if you link an application statically while a library is built for
a shared C runtime. Or a few other such things.

But when building in the BF / CI we'll not typically encounter this issue
between libraries and binaries in our source tree, because they'll all be
built the same.

However, we have more recently hit this with external libraries we link
to. While it's not recommended, we commonly build (in BF/CI) a debug postgres
against production openssl, zstd etc. Which means they don't share
allocators, file descriptors etc.

Greetings,

Andres Freund

#24Michael Paquier
michael@paquier.xyz
In reply to: Ranier Vilela (#22)
Re: Small memory fixes for pg_createsubcriber

On Tue, Feb 25, 2025 at 08:54:31AM -0300, Ranier Vilela wrote:

@@ -455,7 +455,9 @@ set_locale_and_encoding(void)
locale->db_locale,
strlen(locale->db_locale));
else
- datlocale_literal = pg_strdup("NULL");
+ datlocale_literal = PQescapeLiteral(conn_new_template1,
+ "NULL",
+ strlen("NULL"));

Yeah, I've considered that but hardcoding NULL twice felt a bit weird,
as well. Perhaps it's slightly cleaner to use an intermediate
variable given then as an argument of PQescapeLiteral()?
--
Michael

#25Ranier Vilela
ranier.vf@gmail.com
In reply to: Michael Paquier (#24)
1 attachment(s)
Re: Small memory fixes for pg_createsubcriber

Em qui., 27 de fev. de 2025 às 02:51, Michael Paquier <michael@paquier.xyz>
escreveu:

On Tue, Feb 25, 2025 at 08:54:31AM -0300, Ranier Vilela wrote:

@@ -455,7 +455,9 @@ set_locale_and_encoding(void)
locale->db_locale,
strlen(locale->db_locale));
else
- datlocale_literal = pg_strdup("NULL");
+ datlocale_literal = PQescapeLiteral(conn_new_template1,
+ "NULL",
+ strlen("NULL"));

Yeah, I've considered that but hardcoding NULL twice felt a bit weird,
as well. Perhaps it's slightly cleaner to use an intermediate
variable given then as an argument of PQescapeLiteral()?

Yeah, I also think it would look good like this.

v1 attached.

best regards,
Ranier Vilela

Attachments:

v1-avoid-mix-api-pg_upgrade.patchapplication/octet-stream; name=v1-avoid-mix-api-pg_upgrade.patchDownload
diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c
index d95c491fb5..e51d18f0b1 100644
--- a/src/bin/pg_upgrade/pg_upgrade.c
+++ b/src/bin/pg_upgrade/pg_upgrade.c
@@ -436,7 +436,8 @@ set_locale_and_encoding(void)
 	PGconn	   *conn_new_template1;
 	char	   *datcollate_literal;
 	char	   *datctype_literal;
-	char	   *datlocale_literal = NULL;
+	char	   *datlocale_literal;
+	char	   *datlocale_src;
 	DbLocaleInfo *locale = old_cluster.template0;
 
 	prep_status("Setting locale and encoding for new cluster");
@@ -451,11 +452,12 @@ set_locale_and_encoding(void)
 									   locale->db_ctype,
 									   strlen(locale->db_ctype));
 	if (locale->db_locale)
-		datlocale_literal = PQescapeLiteral(conn_new_template1,
-											locale->db_locale,
-											strlen(locale->db_locale));
+		datlocale_src = locale->db_locale;
 	else
-		datlocale_literal = pg_strdup("NULL");
+		datlocale_src = "NULL";
+	datlocale_literal = PQescapeLiteral(conn_new_template1,
+										datlocale_src,
+										strlen(datlocale_src));
 
 	/* update template0 in new cluster */
 	if (GET_MAJOR_VERSION(new_cluster.major_version) >= 1700)
#26Michael Paquier
michael@paquier.xyz
In reply to: Ranier Vilela (#25)
Re: Small memory fixes for pg_createsubcriber

On Thu, Feb 27, 2025 at 10:23:31AM -0300, Ranier Vilela wrote:

Yeah, I also think it would look good like this.

It's the least confusing option, indeed. I've reduced a bit the diffs
and done that down to v16 for the pg_upgrade part where this exists.

Double-checking the tree, it does not seem that we have simolar holes
now.. I hope that I'm not wrong.
--
Michael

#27Ranier Vilela
ranier.vf@gmail.com
In reply to: Michael Paquier (#26)
Re: Small memory fixes for pg_createsubcriber

Em qui., 27 de fev. de 2025 às 22:19, Michael Paquier <michael@paquier.xyz>
escreveu:

On Thu, Feb 27, 2025 at 10:23:31AM -0300, Ranier Vilela wrote:

Yeah, I also think it would look good like this.

It's the least confusing option, indeed. I've reduced a bit the diffs
and done that down to v16 for the pg_upgrade part where this exists.

Thanks Michael.

Double-checking the tree, it does not seem that we have simolar holes
now.. I hope that I'm not wrong.

I think so.

best regards,
Ranier Vilela

#28Noah Misch
noah@leadboat.com
In reply to: Ranier Vilela (#25)
Re: Small memory fixes for pg_createsubcriber

On Thu, Feb 27, 2025 at 10:23:31AM -0300, Ranier Vilela wrote:

Em qui., 27 de fev. de 2025 �s 02:51, Michael Paquier <michael@paquier.xyz>
escreveu:

On Tue, Feb 25, 2025 at 08:54:31AM -0300, Ranier Vilela wrote:

@@ -455,7 +455,9 @@ set_locale_and_encoding(void)
locale->db_locale,
strlen(locale->db_locale));
else
- datlocale_literal = pg_strdup("NULL");
+ datlocale_literal = PQescapeLiteral(conn_new_template1,
+ "NULL",
+ strlen("NULL"));

Yeah, I've considered that but hardcoding NULL twice felt a bit weird,
as well. Perhaps it's slightly cleaner to use an intermediate
variable given then as an argument of PQescapeLiteral()?

Yeah, I also think it would look good like this.

This became commit 2a083ab "pg_upgrade: Fix inconsistency in memory freeing".
PQescapeLiteral("NULL") is "'NULL'", so this causes pg_database.datlocale to
contain datlocale='NULL'::text instead of datlocale IS NULL.

#29Ranier Vilela
ranier.vf@gmail.com
In reply to: Noah Misch (#28)
Re: Small memory fixes for pg_createsubcriber

Em ter., 1 de abr. de 2025 às 15:39, Noah Misch <noah@leadboat.com>
escreveu:

On Thu, Feb 27, 2025 at 10:23:31AM -0300, Ranier Vilela wrote:

Em qui., 27 de fev. de 2025 às 02:51, Michael Paquier <

michael@paquier.xyz>

escreveu:

On Tue, Feb 25, 2025 at 08:54:31AM -0300, Ranier Vilela wrote:

@@ -455,7 +455,9 @@ set_locale_and_encoding(void)
locale->db_locale,
strlen(locale->db_locale));
else
- datlocale_literal = pg_strdup("NULL");
+ datlocale_literal = PQescapeLiteral(conn_new_template1,
+ "NULL",
+ strlen("NULL"));

Yeah, I've considered that but hardcoding NULL twice felt a bit weird,
as well. Perhaps it's slightly cleaner to use an intermediate
variable given then as an argument of PQescapeLiteral()?

Yeah, I also think it would look good like this.

This became commit 2a083ab "pg_upgrade: Fix inconsistency in memory
freeing".
PQescapeLiteral("NULL") is "'NULL'", so this causes pg_database.datlocale
to
contain datlocale='NULL'::text instead of datlocale IS NULL.

Yeah, thanks for pointing this out.
The patch maintained the previous behavior.
I'll take a look.

best regards,
Ranier Vilela

#30Ranier Vilela
ranier.vf@gmail.com
In reply to: Noah Misch (#28)
Re: Small memory fixes for pg_createsubcriber

Em ter., 1 de abr. de 2025 às 15:39, Noah Misch <noah@leadboat.com>
escreveu:

On Thu, Feb 27, 2025 at 10:23:31AM -0300, Ranier Vilela wrote:

Em qui., 27 de fev. de 2025 às 02:51, Michael Paquier <

michael@paquier.xyz>

escreveu:

On Tue, Feb 25, 2025 at 08:54:31AM -0300, Ranier Vilela wrote:

@@ -455,7 +455,9 @@ set_locale_and_encoding(void)
locale->db_locale,
strlen(locale->db_locale));
else
- datlocale_literal = pg_strdup("NULL");
+ datlocale_literal = PQescapeLiteral(conn_new_template1,
+ "NULL",
+ strlen("NULL"));

Yeah, I've considered that but hardcoding NULL twice felt a bit weird,
as well. Perhaps it's slightly cleaner to use an intermediate
variable given then as an argument of PQescapeLiteral()?

Yeah, I also think it would look good like this.

This became commit 2a083ab "pg_upgrade: Fix inconsistency in memory
freeing".
PQescapeLiteral("NULL") is "'NULL'", so this causes pg_database.datlocale
to
contain datlocale='NULL'::text instead of datlocale IS NULL.

I believe the intention of the query is:
For example:
UPDATE pg_catalog.pg_database
SET encoding = 6,
datlocprovider = 'c',
datlocale = NULL
WHERE datname = 'template0';

Where datlocale with NULL is correct no?

Because:
UPDATE pg_catalog.pg_database
SET encoding = 6,
datlocprovider = 'c',
datlocale IS NULL
WHERE datname = 'template0';

ERROR: syntax error at or near "IS"
LINE 4: datlocale IS NULL

best regards,
Ranier Vilela

#31Noah Misch
noah@leadboat.com
In reply to: Ranier Vilela (#30)
Re: Small memory fixes for pg_createsubcriber

On Tue, Apr 01, 2025 at 04:28:34PM -0300, Ranier Vilela wrote:

Em ter., 1 de abr. de 2025 �s 15:39, Noah Misch <noah@leadboat.com>
escreveu:

On Thu, Feb 27, 2025 at 10:23:31AM -0300, Ranier Vilela wrote:

Em qui., 27 de fev. de 2025 �s 02:51, Michael Paquier <

michael@paquier.xyz>

escreveu:

On Tue, Feb 25, 2025 at 08:54:31AM -0300, Ranier Vilela wrote:

@@ -455,7 +455,9 @@ set_locale_and_encoding(void)
locale->db_locale,
strlen(locale->db_locale));
else
- datlocale_literal = pg_strdup("NULL");
+ datlocale_literal = PQescapeLiteral(conn_new_template1,
+ "NULL",
+ strlen("NULL"));

This became 2a083ab "pg_upgrade: Fix inconsistency in memory
freeing".
PQescapeLiteral("NULL") is "'NULL'", so this causes pg_database.datlocale
to
contain datlocale='NULL'::text instead of datlocale IS NULL.

I believe the intention of the query is:
For example:
UPDATE pg_catalog.pg_database
SET encoding = 6,
datlocprovider = 'c',
datlocale = NULL
WHERE datname = 'template0';

Where datlocale with NULL is correct no?

Right. Commit 2a083ab changed it to:

UPDATE pg_catalog.pg_database
SET encoding = 6,
datlocprovider = 'c',
datlocale = 'NULL'
WHERE datname = 'template0';

Because:
UPDATE pg_catalog.pg_database
SET encoding = 6,
datlocprovider = 'c',
datlocale IS NULL
WHERE datname = 'template0';

ERROR: syntax error at or near "IS"
LINE 4: datlocale IS NULL

Yes, pg_upgrade should not do that. I was trying to explain the difference
between NULL and 'NULL'. I didn't mean pg_upgrade should emit "IS NULL".

#32Michael Paquier
michael@paquier.xyz
In reply to: Noah Misch (#31)
1 attachment(s)
Re: Small memory fixes for pg_createsubcriber

Attachments:

elephant.pngimage/png; name=elephant.png; x-apple-part-url=BAD2282B-7D25-46C1-9DEF-BB376A4058D6Download
�PNG


IHDR��es�	pHYs��tEXtCommentCreated with The GIMP�d%n IDATx���_Hi�?�g��������cOj
�$7���E���.�t���zv����=����e���U6B��F!���3�2��iR�8X�SIw2���x�����"V����U��V���N���Lbw}�}�����7o�g�7�b���k]�{K��_~!�0>��b�H�aL�u]���E���t����4m�����(J�������@��B�e���}�+
un9������������Gw ��{�e�Z��#���^!�-�����zzz�_�l�����$B�
��>],/�|��)Y�e��O{���eTU��(����7�� #B����t]��C�a��b���k����:�����(���UE�u��6�Y��g�0����v��N_
PU5�(
�����i3�������j�v��i{��0?���(qUU����J����2���}P1UUKC"�M�����������4M�A�S�"B�2����O x���03�]�e�t]�����O���iqD�B�=�K$����DDv��R���������J�~�����s�J~]s7��a|�������u]>����Qb
RB O���a��b�����X,��,��`i�^��YQ���u}Z����X��o�@�B4m����h4�4� B�������eY��w���j!|�D���9p�)
�===D���I�kQ�`:�F�SU5�����C
�|�4��:{���s<q�aR�]��?���3���o �'�=�)���a�F�t��N�2�g����P�y�����(������������	(	;�^O��r1G��eY!�0��a��� x����~P��jAQ��(�5&�N�caa!�N���
�������B8�!�4Jw~���]8n�iZ��}h�Ux�|x�}lyy�A>e?���������@`��D(��!���]i�{��)Z�Kd�'�n��Am@Cg!��U(	�;,��j��EQ��9k`3��t:}�}v8DC�
!8
%a�I����(���N�����T<�@������)�}��pT�P�b�H���caa!��:�>a{G��,�`z��x��}��HH��x?�B��l��M���e�8�(?]������������R(!g�����qM���S�qI�0�o����t:�RP�SU5>88�]C�!�`���?�A��I���)����3�3�������	��@ p!����!��@;C`F�JQ; ���A�e�����d2�PC4M�b| �*�&pjj
g��4M�o���i��2�����LMM���4M����eYx��Q���GFFPNZ�kH�X�t:�&�L"�/�g{zz�`YV(�L>K�R(�EQ���Q  UU��^{{{!<(��?(����"���L��z������{�������V���=�5 �J�A9(�"EQ��H����\:��G2��1�<TU�R������3CD��z[���d�H��z�>}J�b����cb�X|dd�f�7k
�O�C ��E�G����A,��J���l �v���iD�>�i����WA�������kF�2:/�����qn��}%�Gc��~��W�y��,+4::����iZ�.�<~�8)�2��'�aW-�����r���/���i�����W�N�>�@gh�����H�4��B�u}zjj�7�J���A�@�����vigOO���g��p�AQ�u�(V���=���c�?�����./�u}ztt���SU5��*�_��u}faa��0�����@0�B���BGGG���H��CA��h�WU����Q�	;X���aY{'���C0�B�(�t���7�de����r�E8:��p{{;��z��;xBet]�1�waa�t]���.�h4>>>����@(9��_4�w]{3D(��(qUU����TU����0�����F@�	�*�	�PRvD�oQU5����Xi�a�

�F�a�
�MUU���aT,?��v�|��V�>�W2og���aW���%���_�v�7�����%� �������#�C�T��I�3�������	g��b�x���X,^X^^����:m����]����S�F�����_:�.����fZ�?��@����H��k�~#�Z�`��(�4::����5��!EQ����9�����r�V�����7���;�������GJ��}�����jMu���eY�O�>�_[|�3�===��D_�����SSS���<
EQ����h<#1B��,�y��
��������y [S����,�/%��}������w�������h���4�T�����l�`w�<~�x���j��+��������@ pA������F�(�I�Rt��}J�����A�����$�J�P ��U�>�c����_��~q�u}�hg���#����p�=���n�b?���YPU���vX\XX��wE�}��@���+4���R��pdd$���rA @������^���.��4��?�QU��K`���tD+�� r0��eY�g���`)����^-�CEQ�������`o��,�



=���r��,�}iaa��>��n�4�>��u�=����h�h�Y@���R)����}�R������D�g���;Jw����F(:B��aW
�����@�<#T���/�����R)_?��'	t#��e�t�CCCA?�����]
vU�&.PE��PZ{��taaa!h}��Wt��5������LMM���i_�@7Rq]R,i``�M-������`��u}������e2���.�A�T��,�JQ2�����k���GFF�t����C}���Z�C��:�@�0���d���v
������4���@� ��B���#�k�6n�b�e}���3�$zB ��n��A�d�Wg
��h|rr��.C t��wUU����� ��0�����^^^&]�}���eh
��t��L&�~y���B�!V����vD)(��N�v���~�d�(J|pp�eY�����R��/�;�[��*���l�eW7�����,,,�n���rW^�X,�����@��GW��q�����D��
�Ez��'.�@�B,k���G9(x�]f�����X!EQ��X�����0��FGG���H��@xD�a|s����^?��iZ���g��w���j|pp�5 k��������[���J�htt��g�UU�ONN^UU�o��������o���<��c�bj�]b�3��i�AY(�������][�h������y���x�|uj���pKp���B���|��������Pp��
���p||<~������/C ,����c��t:]XXX��!z�g�R�X,>22�B���j����_��^�|��f^��qknj���w�G;8b�]^�h8S�C������m/�8F����� v�a�B�����K��_�|��|��vG��-2s���I���w���������$��sR�


y��0\�w��c4�9:�x��(n�*�������{��{��f���������<i����������p575R��F�>��X9/7��'	���>�����Q���| ��Jw�V.� �3W�z��j����]��?��I�>�x���>kjXok	���b�FGG)�Hx�=���Y�{�����L��x��` �p���������k�t�p���������@��d���j��4s/�����;��w��:��B��c3�z�����{EQ����C�2 ��,+t���g^)�v�Z|||\�e��0�NMM�����dP/nj*41��Vs2�w���475R8����t:���]���>3::���������X,�� n3��s����j�Q ���H��������a �022�z��5�e|)k�oe'�DoKM;�-�{�bG�X,���D(�!y�y��i���IAI��p�k��o��pO"5G����)
�}�;D_��v�PU����q�p5S�������2���R�9��F������UUUo;�=a'�cd��6_ou���Gz
��i���sW��!��#}y
�B��M��n!Mm��3��e}100��+e��@������
w��@({'Q���G*��d2YqY)^��5�����t����������I��_�nky���-���c���`���5�{�N�CCCA����\�N5���-i��Y�e���v�*� z#������Ur�0��������yZ�8{��A�-�����-�n��v7�+�B0�r�CA�t���p844D7n���������B��@(sDy�s���v�H�6��M��YS��_�7zDD�55�775&�$����/�����R�=�+�/D�������n��`��:�-�P_Gm�����v8�����H�z�"�'k�1�aWn����0�h4>99Y��
k.��D������\!�m�.AsS#5k���_�-Dy���,R��z�X|��1o�����<��n��d����
���r�p��s8::J7n�X��i#���P ,�t���72zUU5>99�&��������207���t[�����I��ZyR�E�a���Afqe=���5k��s�(
RsS#������xD���V/�P�p(H}���H��V���&�4���f35��"�;w���[����t7��}v�jiX�� pB���E1:���2a\T"�}���Jo��A���R�����
�h��D_7�BY� v���e����\����@ ��p��RT��S�\�K_^_zh����u�[�t[�[�����Z�7gI7�D_xLsS#E�<E�K������bR��s��IW&Z�g����j�����Mg����HtcmF7�{1���� �~;�q�����y���Tb��/��0�~dd$�H$j&�:��@�d+�&:�;�����H�P������d� �u������D�q+�`��M��{^�]#/t"�W����P�0�iZ�����/�u�	Bb�1s���yc	?�@���ig��4����3����P���:��OP"vQ��8J����X,>>>�������A�7��,����z+�K�a�����������s�p�p(H�������<����T�3�B�F���=4�N6em8Sc)|���������%����L"� yK��f��c7�P	{X�������(�f~���<J��T�o�+��;G�����=�*�R�7R�E�cQ�@�`�"v�}��79?�y(p�]
����{��B��QF
Uinj�x��/�3en8��P��@(S�F��{����G��BWf�����
��@�Rg�s:n��R3���<"�����(�}�"�'k�gc*�	~	����\�|���%����������(9���$_B�0�9w�����/#%2�+���F+�Y@6��p�	D��J���}),�f~0��Kb����`���A2v!
>|�_���M��8������PGG�.C�d)�2��.h�5v�JL��5����F; ���:���c���s.�����]H�
=��"�;w����^o���'����i�D�OQ����nFc�
]#SsK��'x=�R)Z�a����B���������i�ap�/������j�=(��[�g��k�:�������� ���YO>L1�����o[�%�n�_B�g��%��IAj�K?�3��~�5���%�g�S:�-41��������)�
=e�(��j���'"/��v
���>Y��ip^���g
�[N�t��D����8���J�R��\ ������ � �����~���9�P����|�/�})��n!8�������x��:�J������
=��"utt�Y?��0�r0���G[hj�ov�\����<Z��$��H�)�;���
�H�i�M���]�T����
����~������{*�n"��0�7�lw-��T^����6r�S7�A'Rp������.������lFU������P��@�H$����"B7�f��<�E9�;�tF	��>�n���'=�3\��;�hz^���/���6��k���P���s��m�Z�+a�
��P_G�����g#p0��f+�5���7g�h8N
��4�Q��;����I�8�R^
��B����-����n��$��z�zP?C<7|��L�&�:�n�������HE��=��/�A4���_������H�e��xi������U^*��'''��R�7n��.<y�DS�����&|d�f��5|sv	g���n���5��w�����}��m,���P�@hYV���C�J�d��m������|d�x8�?t%E	)��+ge�����k��I
�
�oDuz��a��i�
��� ~c�]�vP=��3�B�_������������T�����e�U899��b��B)���P"�>��K�.Jy��E�OQ"vQ�eT�����sw	��4/<01���s��S�P����'�:JI
�����C���k������E,}������1�d
�x� NC}����~Wd?�*74��Q�����4Dr����i}-6���R�h4�w���B�(����y 9475����R�����-����
�����(�*�*�q�v���

������������n�����;�Z���&{��B�L���	��e�~���~�����%p^@�p(H3�KU���� kU�A0���P_G�W�Jy��H�P(�8
i��s������;([GQ��!c�,��'RsR���N^8G��+��ZqC$W(��a"4JE
�O$����e��0 ���1_����uq7T&�[d|�j�)�G!<�E��o�����iZ�����K�������O�0��3�����R�H�4����w�;�-I����,�Pt�Q��p``�M*�b����J���0 �l�%�I�?�� ���Y)o���3��&��om2�BQ�G�B]����;����,��� �l�P6�O^j:�f3�&��wm�����$�mO>`/E���� J3���\� ��575R"v�3��xM����kK�R400���d7�G��T*���?�,��j��#}�w�/��x�/��<3�E�y���B�&3B��F2��������]O<�+��� ����F���4�CA(�����H�P�����\Mf>�Xd�7n��>�922�*:n��#4|�,����0P�^l�����K��E_�������o�|�E����2�+����T,�X,}��nX�b�!�,+�����{�5e1�n���t�a��=O������������/c��������v�q�t�}�ptt�u�.\�����s����n� �2�a�3s���J�����>�:1��`C}��K����9������$i�&t�P���7n��{��C(b����x���k�K~7��rn��M=Ac�]}�Cnp�L�<������P�ch=k <w��]�����P*��?�d)E���
g
�M����Z�e������[9�����l%���Os�A""�����n���R����]�����3����d�'
.����p((�R���f�z�O���>|�_�@����
��H$��������^������Utb�1�4�P_'E�U"5GY3/�2�C��<�����/�@3��!�+�\A�P����������L&�-�
���Y!����(�����>�k3�2�Vz����.
�����J��E�8If��%�Z��Pn�-F�������&3�b�����+�],�phh�uwp||\X]��+t%��X�}�C}�;�3�"t�gfqea�a�������"[(�v������O���8�}]o*�J������ IDATL#4�����2z
��63|s��12v`,�{ p�l�:EvU%��O?9�`�����)���Ad#4��C"vQh�(*�
���vKv�N!�E���'O���&3�e9�`��@�}v���k���4@�F������E;vp�=�>k�����B!�E�P(��h2�\/��}?W!gg�@ pa||�k��\�k���V!��;�P����������b���k�|�E���IY�"�[d
����r�_,��q��]B����Aa�ldj���(����S"5��H����=!�[d
��XLX�'w	]����"�LL�>�
 ���wP86�e� Bfq��cwE_��
�-2����I�4�=:�K�J �,+��;(*f�� �
����H�W�
[����9���Y3ow��n^!B!�E�P���C!Mf��%t%����5vQ%�����!������Ut��,��Pf�@�����P���h����� "�����5��%t<�EJ�R�����#$��'�v�9������-i��#�[tc�d8K�F��h��t4�LV���x t���aD���B����u`���:���������n�	[`/��\���)����������{����b�A*��*9�H���;825��0	�1�=nF����H���f�����:��>�Y\!v�E��H&�+�r4�R�7�b����s?�v�����(��� ����>�
��d�5�m����B(7$Rs��Ca,c�:j����w�q4V�N�B��	��W�
k$�s����i:1����B!�e���V���FFFf������x��o��q���a�ttt��o)�����8��!��#�/�}���B��������lsV�i��>�����+t�^�F�8����&���.���/_�L�t���&�?���o�������d2y���u��Y3?�0 ^C}��0HD���C��g���9)�����|��l����c||��5��tE;}��b�H�t��:\qv���<��A	�<7�K�����P
gF�O�"��\��cw���(��X,�z����{��t:��L���k��{2�+�h$ ^sS������O(k���
����[R�B�����f^hc����]B�0&,�
��	�~o&3�y�B�C��aO��P
�B�P8|�,E�O���!��(Ey�=�>�N?;��T-�
��r`�{����M �	��n�H�)!gP*
~#c(L�.Rg�E�e�%Rs�Y3/�;��� k�����#M��0�L9�Vjpp�*�Z���'�K�����B�RQ�+;��{���LM�PP�e�
���D��^UU�6�*)�:�R)�-XM�����u2%z�;�]�:�-�n�B�RQ����[4|s�W�0�R3��f��6_o	��98��L��e�U�t:��f2�������A9L-d����x(5!��k�)bp=����4���b.p�w��������Y��E���� �D5����X�6�2��p(�4|�����Y\!e��h���a�b����8�EJ�R\�d�I`w@�����y��Ps��VY�F�O�~���
�Hbj��=�������(C�+�GY�Z����3<�; Q���.�,15�+K����3G��>;����i����5�YXX(�s+������K�D����(l�L��; ���:a���2KB���l#)���<
���5�E�F��J��e�\W��"��i�rQ�f2���u���w�C�����B���l��G�
�2�Y;�������+�������(r��
i&�y,d�5��P_G�Kg������xK�P8��_Kq�Y3��K���m��Q]���WQ �*���C��f����;�F2;�
���R"v�G�Q���.��ilk�{������\�������A�D�����6_o������#��Z�d��=b����*p���zYP���EE�k���P* ��~B��h&�?3W�����/���d�7v��Z�h��/o��������]x���9��`o":���y�Q3��)��8)������iR�#�d���v������]U��A�����4�����:2�k�����Q5�s�����~��a:��G�X|P��IQ����eu�qFM�A���,76^�Y\����3���rV�e�O��:�Q�����i���s�@����R��].:=o`��`"v�f~��L�2�+41�X�eP���T1g��_8�9���qh3���V~5G�].j�����>"_�d/��H�'�2K�Y\>b��K���(�2��6_o��$d>Gx�����eY!��\7�].��U��n��pk8���At�N"5��y����.	�����l�"��r-E�q�h��a:�~V����\�{�|����:s���N�9�=�>
.�<!T���===l%�O�>=����\�&8�����Q����H�z�{�(v��z��o�
\���P-�cd��vr�uXc����^..pk��&{�G���?�� ��^l��bF!�B����*��R}ID����9��@x�AD�D�Q�n��= VC}E�O���cw���(�yB���{�v_��X����~�Wn d�I����X�����b� �X"FM`w�=2����K�F�	�2��9�X����~��@�u~0���C�rQp7�� ��dG�t�:�-"/<��������:������X,Zw�UU��L�P.
 ������1v�Q�����_SC}��K�����|]������wh �u��^�>8�M�\@���*��*�����h��"�X#���\����il�U|
�`��������rQ�����g��#v��xE���B�ASO��8��f�^���U�C�q~0\�L�(��<�!j[fq�}M�Z�5�4v���kH�.b�j��!W�Q�0�=XN����5Mck��5��(��|�z2�A�U��O�7�I�.�So�l,�i�]�!��A�q�(HD�v��d�3���~	PM���2c�lwX d)��4�*�:D��E�C�/O�>�=�h23|�,�C,�1��:����@���������v}�m~���d���p.�x����o�
������Xe���Y�WXk���w�������E���:�f2���u���n�	}P��� ��j��a�@hYV�X,>p�T��Q7���'|��������y���yD"��/�A�(j���PQ�?�,DDO�>����B]���v5%8�I1�@M=��^���D@N���td�(
K�""�,k���9�q�4s��Z���M��$��"������(����F����0���HD����$
��5�����`y�c��	��>O��Q��p�=��T2��@z���Y�9�Z����[.���� �<�������pt"�n�a��0{B�0�q�r����a;�SK����;�������_����V����p��_�����B�����vr�����475R8d{���������*����y$l��+g���Q������U,?�����k =WW�����n���U��M�?!�Xcm>Vj��Yak�����sB�0�wl�B�/FUU��`f�%�R�K��$k�(��xSbjN�=M=���@��=;�8I�4��x�������h&�]���(>vW��c�]���:a���A �,+�_'����5��y"1"�'Y��,���8+k������x��!>��S�u��W ���\
eD���:��mf��e���3�K&f[��|f�;\�J�����0>(�� ���R���P���D�	��P3�?�y��.�lB�����>}����4-��"�~X��A��E�L�/D��v�[���SB�a��Q�UU��5lf%d"p�����f�����Gd�
���m��E4����W�����?~��%��M"?�rQ�����9a��`j��@hYV�cQ���Y3�p�1�rB�(�?�����Q4���kdR��@��aT�4���Y�y�c�Ikoe+��,��>7��u
fj[�����jC��@ p��5l�hA�����u�n��r��DvE��;�^mH���*��[��z�h���������u
f�m\��DD�����\�EQ\_��!��4�������C��z?0�����rBQm�jYC}u�[����\�vl������B��_:C�M�B�p��3����hoog��{��
���i�(�����K�����3�J_z�FN������K����s�7K�����;����E�O�b�Qi ����/�P�[��[	'�Ej���W��b�Qi ���	t��������VfIH���pK�3���,��J���q����y�����1��@�(���Gl3oK���Y4.��2n�] |�������1��V�7���s��������0
.aX}m��T?��.�Q��{���5���f�����(
�=���Q.
Dcw	y@��]�,@�zzz>���@�1���O?u}
"���[��`�9nB7�f6_o����|�%��v	�/�B�����l�b�/�qY�9~���[!G	)�X3g���>:�S���x�M�\v����n��!�8�#""]��9��A��+p,�?n#e`����C"~�v	����C�+v��f��4=��m-��Dj.)b]���}D�3�^U���k�L�����*9k>�Z
<���+!�K�_��xz��,����/�����'����� DT�Q�B5���y����V2��\#'�p���5�C[@~��P`��BU�J)?""Z^^�X��5��6�:������	(��1�%/v�#"���\^l�b�0P�8��`����K�����.��|���6gY$���O?��e��76����:���h��,�C�]Binjd�\���� ��	�RU�|���`fq�&���sne����.!TB�@�'/^bh5�������G"jX=v	Af�����g��0���!���8?G'j���3�����m{M~����������Xxp����D��[�>��$x�aB��|dY�_D^��~��#��������A����G�c����K���E�J����!!��:q~<���+!5���� ��y\TU���q�@�(����7�C�����A��D�1�����*fc{X�'<�b-���e!��� �G�a����(��K����.������K�nIrV��7�p|��b�(�#��0@-
��K��h�$b�0��I�����m����2_x��A�9{#�'����S�����{,�b��ioo���,�p�4
��������%�=�r/	��O��e��O���s��~���QU� �E��[��+p-5@�.a��j��iP�i}w���2�����|� ���8n���G�]B�#(`o�YLU�=�������W�"�'�Y�y�m1�Y3�������3��r"C�O_BpW��oH�*�E�%�2��:b��3*����>�@e�l(������A���a
���ZKQ��^g	��~�)�2�2��2���������������S�h.�
�����@��F���2Hn�,����>��&����l�;�����������5v���T����@zp]"5��������Ae���o����������*4�pgC�Vq~��/�����2��Jo��!�E��q6�1�x���|�E��OX�Ds�q
����_8�!"����}���YS������<�`p"4�����eq,s(B(K[K��c4�N/6^���h�'8�IqBM���;�@e	��K���p���;�ED��$�D(�B��g�Ch(��5y�{:�-I�����AhY�PzUU���B �Cq�i����m-���G��i*�Fe�u�cY�,mC�Q�J��B�{P=f��k�eYaY�JO�@e�c9l�5�8SBl�����
�H�#P�{����AH�@ehnjdi���+������l�\/�}�s9(CC}K��O�r,CDD�����p(���������L�����p\3
�o����~z��#��8�Yp~D�n.��Qyp6�+�lk��Z8���@�/��Ofv��5������48GN���6r"<8���@�FD{���tc������������<� $B �C|����q
F@����2
.aH�>kj`YG�u�D�2
U��0�5���(HA_�-��z9���,�9GNh�v�B"��9.�������-�e�#�� 5|RW���y������3	#��X�Pt�?����`o\�<�#'�$B �4�W�F\����
�����(�������"z;����u3N������W�?ol��x�><��zk����h�	����:�Z����~!��~��`�� 
RsS#�����a�w��J���{�}t�[�m[��p�Z�#'E9�s`_���Q2
�=�M��n�p�����{?!���4��P �{�0�FN(�rhB�W�1����4���;�>��|^������
���1�*�aY�9A��@�
��
���-�f������-�`���*m�������k�?�����#<�����J,@�
���>I��-]�P�~=bi�RK8�P��:���r���LD��^�VsMe8`��� �z 4�/k���3�B�M��|����5D�[��~���0s�������V�d�(�"z������]��}��s��p���e�
�#'�=��X�a���q,�zq|���Uv7��m-n96����,y�nz�&
.�CA�����z%����]}��5��I�!�M��{^��������t���J�e��UNC"��E�[�����_~���o����t��:�����>�SM"����Z7s����Rf�G21��4���W�j���j�N�]�
�`[����e}�����&U��p#'��z�:����������h�L�?!�C�k���H�)�r����������/hc����0��jYo��:C�i���|�����z���{��n���w��cwQfq�~�VC}����Q&���h0����e�����G9��@{�zZf�
]$i���Xz��On��r���������D�q�J���H��475��(��p����0������<_B�]8������[R��h�	�����k�>�3��r�t��D�����2}�@���FUU-��(S ,�������55�C���\Ax��!a��r	����+g�,��=8���a��o��2�������D������{Bt�'f����1��<a��M�lkqf�����?����G�
��=�Xg��[e8�H�I��b�t�����b��p(H������<�F��W���DD�;�j�����Gvk�H�I� 	21�5���Lbj�����;�a���k@�:���4��u}��5J��a��ggQ#�=?�t��3�B�/O����I M=���'�[����:J�_�=�����%"���:���!� �8�ZP��p�ZN6�c�2JB%31�5M�>�[�s'�CA����M�|����!���O�>e[�(F��>.^����)9�Q�t�:����M���r�z����$�2�a�����FUU=����*k=��8w6����Y��V������z0��B���pK'�* IDATR���1��D�O!T������l��G���K�����P��c|%��t����A��g�=n��>�B�#��ygl7�q�aW9��i�v����p�@u�2�������tQ�� n�|f��>�t�}��0���2�9�����w���x�n�t=���n�A$����[��C��r��7��Q��{�2��}��Y\|%�Bp�&���2�Z�@��Q{�|��Tfyy��&�_?��e|���N�B{GP��`�H�.b�`���qC�#�T`;��-d.	�[�>�vk["v�6�"�X})�������gC����#��DogUl�
t���422��DD��I�c��9�Z�6��%��>M�jM8��n�f�����V�oh<���D�n(�vs�����<?&"��,�p(�i�a�E)�6�}E�8�y\P��������5������������[�*F~�x��������em� 5��m�m�I�����P�m�PU���~
[ 4c��X��5��x6	�)�������RW��.��j��w�<&k�Ws������+��/��h����f~��=�����ZP��#����(���Q��c"���vJ���_U�b������.�-���e�|���2(8\8\�rv=��cy� �o#]���������<��j�����C)�~2k�}�t�.��do(C��T���/Ey��:��?]�'��yD�O����4=�D���	���
��O(k>��Ay:����c�\�l(��jE_g7�a9�oY�_Eq}��P����f~���?O�x��L�gl���
K���osS#5k���_�-��n�������G��	^978=��2�?���e�k+x_��K�n(���^���g8z5��,��A�DD�55��~��SP>��6c�_������))u�(�������I����t[�[��h�	���j��_���>��a�{2�f��`��?&3�+�/���z���Wp������P�j%_g���-G�hO�>u{	""jnjL~�*��x��������|iS�0f�����K��<-�}���wp_N�������.��A&�
��R�fW�3��5k�qo���x~������Gn(C�<v��P�W���?2�+�����Y3o�wJ�g�
4�+���G�n���'���i�"~�=4�j�D
j�����jw(k������W��T������4�Q%nY��[��b��o �n����zoI��
���a���G�w�C��5���_E�OI�@;>v��#~�=o�k![�hOOO�_[��,'�g_��;�-=���B������/6_o���M�?�*�C��H�)�&��D���K "����(����6�2Cp��]�g8��U�$tG t�,B4����3�1s�����K��������P"vQ�N���E�����/"��D_�^����6Y��
�_c�������B/�6����k?�������\�!��2c��\�k��#��q�z�O/M�?����(>v79v���K!"���@�D�����6���|m������/��8����lk����*��w;�\�����u0z�Q2c�S%����f�F�/v�CAa�m���P��+{�c��������Dj����p(H�M��
���Jtp�^�<�/_�j� 4����:�������r,4M�����@�5�pyy9�F]_�'��2�+�����k�/Ejf�@�������(t�a<rf=���
x����Dj�2�+��i�	j�3��~e�����_����d�3[&��J�����=�0���bQ�����B�Y�n7���p��a��#�,����-��2m���������Ea#*"��Z'2��K���'����^
�u��� Mm�����{�H��V{Wu���K���]��y�EY�k�V��������\������M�<L���o�w����/O�#"xV��$[�Z��%����=�����LM��O��ls��7�Y[_ �HO�nc�b��B�4�;�r������&fS����H�!:$��k�,������_:����I�M�l�k�2�+����pM=81�5�zd�;�A�W���Gm����t�}��>��PFU�x�{;!�.���	�4
Do;�&Rs��m�ne�Pb��Dj����D�-�)@%D��nwM�8�575��w�f&���j���|���8:���{�^X���eY��&����������t���0���h���S1<5�mY3?x+�8�5���)����I575R���}?o�����(f��z	}��.���su��_9K��O�����]�����J_4��}w�H@�k9"_�\��yWn�Qq�}�M��W:�0�,��Z�������#r�'"�,����jS��@_��k�	�Nm�`����f~����A3��u5Wp�!���-��>M3�Wu��"�z�������mb�q��O��S�g%�����,|�S��Y�UU�Z���Y��?}��c���}���������<�-����z����W���nIvu���n��d�����Vu9��+���c�_b��MDD����k��s���>��f�����v��'Ll�����YC����Gp�WU��j���@�5z�0����� �P_G�KgvAWi��^M=A�W���+te\��Q����Y"���up}��T���G�,
�p:����[��575z&n��r��I/6^
����l~d��	G����������"^��6cw�C��p(H��ug������%}�w��]\�����y�^������P���F�|X�5������#g�t�D�|��q��#H��yc��5e�y~0�N�v�v ����`=���9������������~�Dowg��c�Q<L��Tk�O4�������f�<q���;�z~����A�����K�E��8
?�!F��;8����Y�V;���A �j,cF� �qP>�ID����9K���I�������B�z�7���6r��5�y�z3��d���,���6)��k�^2�+�n>��I�������A""M����A <~����P�b��:\��~�����Z��<��o��x
�[g��M�������}]�����w	qLd�9�~z�����Mn>|�a��������u����cU�BUUYO,,,0����&��Y\Y�����9s}�U��j�C������M��%��}8*����JU_�k��<M�>��;�A8gb(��8+�t]g�yqb��m����p�����x��+t���R"5���s�;N�>�x��q�z��%��l'~�tc]��'3W��t�F�P��m�y����8���������A�Q����c��>�Tg_�l��bY�
��
�]Bt9�C��������2�+��t)
��u�$��E�����:�����	8?�oN}�!����w�����o0s�����P�*�o���i4c�
��������8��P�������#SsR� ����Z*j�c	�A����l��j��q�{B�N��e}���9/�Y�{W��Pl��uF�5T*~��K�,��vS�=�@:\}
�<�g�
�H�9���H�WIC}�kf:��� ��AM��~{B������p���D��D����]�RY����_���[ms����K�����w��!���i{%Rs��'\!��K����9���s�zzz
�Bw�i������6���������4�)��|����g�A6��*��g7v�M�>v��w�������9/�$�?��i�����P��&f����^�w-��q[�e9���&.���*���YV>�{}�51���{�}@F�B�ax�� �>��������4��C
������vF�(~X-����k,��a�rpu�t��Sfq�z�O�5�YI��`	G���m�����	�DD����i�3M�nC��K���)�����Wl��8*�����e�j�0��f�@�����.!�9+�����#'���m�����N��'�0�r���B��8����� ��6s����<��#g�9��475�<���Vy+�D�?NRfq��{�����
�������4��	����`[+�N��E���A�aOO��k����?s���B����f� �i�QM�G:�5��u)h�Q�An4�9���W�H��jC��;�*�>f���H��6�W��Y������#'�������/,����A"����
�����`4u}��'k���"����[��p��T��f�����p�#��-�-p ��UQAj��M�?���'���H�z���c��M������f~p5WH����5��b���*$�������������-�q~���@���U"r}X���422��2D��|������Ss�M�]�PP�������7������X����K���i?K0����+{na+��:!��G��s��p�����C����e�q�� �%������w��4��!����[4|sV� �H�U�������������e���pg�M:�f�Q���A�!��:U7-�Yw�����6_o�t�D�����xE��Yr��U;:������@%0���8_�
��Z,p����A�C!�9B]�g8��\*�������]����E_���A"�U��������pu���	gi*_]�o�-F��$:$�����p)�8Z��J�Qx��+��Pf�3
��D��Q��1����p����Y�9�M�}v�������""��5Mc��[^^�X�����8e���^�^�n� D��iG�������%���������QsS#��q]����E�QW�^2��.��X&��2R@	����yD�7gY������JG��j��r���2pT��9����t:���i��}]�97�q&l4�8����k�
����f���K�7g{�x�m�^:�=���[p��&��j��7�baa�u�������` $r?������N���_/B���6_o���E�8I��G����BW"5G�����"��X��}<x�k�s��<n�k)""�F����C���n���eY�X��/��^l��Dj�U��=������O���4�^�^r���~������5�M����'���,���y�@�����?>��?����,//��(�Z ��:g��eW(����P_G��j)�rl���n������Y:�d5WH�����/��5���B�A"��7(�v5��/6^!:�3�9�Z�t��BM�\��qh TU���R�u�X��?{����~�����9��"D'��X*����l�`6�����(�%x�h_�;�����:�URNkx�	RB�jK����m��C�� v��d{'E��%V������+�.�8���������H���^�m\��o��Z��F�d+Q�}����G�X{�B\����C���7_j�I�V���x�@Q��������+�����k��y!��������%"���U���C��ylWm�	BA��=BR��C��Xs�[y�����\�n�������cB("bYV����[��Q�E�DD�!��_�6����@����Ey�	��	������JM���c�s]���E�DD�!�.�3��v�r����#�vr���
�n��mH�]%��O���s�����d(��UBM���!�
~��BHWS]}�G��hoo����*!�m�E�y"��pQ1�v��`/j��o����q�E?W�M���a�����<�
r�����8� ���!j�"���}�h;k?�8��(���9e�"�	@0��[������1�l������'�X""��T|�K��B�0�0��~d���2DD�!���3����	�������_��]e������E����vX�]%�""�eANq9X��(:����z�T��`�y��"�������l�.*"��.�]���&Jv���T�!�^�'�������:�%���#L<�~���g[��n�l6�
%""�iB�M���B9��`"�P'���K"��U|Q&"]|�����m�`w�P�DD�qh��$���|��!Ru�M$"���v�5��C��/`v���|���V]���r��#�u%�NQeK�!"���!*/��S����&""���V���-X@���(�uB("b�6d�)�E���K�I��<�B("k���~pap�v��b-,,@�B!�M��)!�,�R��3��q�QD _�9i���Wb�UY���A��r9h���.h<�=&��O���s���&�E_�I%Te���D�'� <�x�IX,��� ������
[7Q��
��J=�F,C
���!���?��2�H%�g�$�'�]tvv�X0�,�n�d�	���z��8X�H-�4���*�m���&��g�T��"��Q�=(@H�
��?
��"{LE8X�������/����M��e�����{�8���0����X���<�.�8��M{NQ�e`�e8���H-��9?�I�2rN��;�_��$l O.��KD�4�$��M{NQ�e��9���H��
.!�g>��\��;�E{���&
u���}jj
JDDl����h?��
�9s��F��TB�P���TB
P�`
d����]���K����$��,��sDD��^��fBH��&�������V�v�l6�
���8�������P$|�el�8��)�Z��n]
�K�2����I�"Lr���-���|a�K���.:;;�
%""��@r���+!�`���Z��PW��	)��t&�+1�Y���Y��D�v�\.�nE���}%���2��B�����H�'�cn���TBi���
�����`�B�`X[�	&�D�����p����H��m�Wbv����
{��m�I�0�1�����S�0.��a�T,o����qDDZcG8����<�����z�/�����-�w��t)�-B��������PD��,��h���qX� "R�z5@�h3����X�GHA�vQH�k;�N�����[ZXX�m���H-T+��H%�#$�t����*���X��4M�
���T!�=��'��@D�j�=�h3����GHA�4^.���%���C���A��r>�V\������8��TDD
=(�B�����Ts����;�(���p[:r��j�X�("�mCu�d�	�i��`�� �Y'�{q��hs��o�8�EH�-���U�:�C9���D�Ad���B����,�Sd���;!���'�T�mDDD���v��Uu�h_`�r��P�D�}�ao;	��nun[J��e qDDb�GHD�j�(rH�f��}Zc��<�����^og,��v���>-�EE���
�G�9s�����T��/K!�{��i��Rp�]��-��;w��������H��y+���b�{��GA��iA^��,t�N��"L
��4��z����9E��z"""Bp���X��S��D���yU��^�vQ�&�""�m��1v���;E�xf""u��+�N���ZD�-��������O��������]T�	������;��z""*�����zs��a�q���D�a[��v�\.�vQ�2$��eAZ9]���p����H����l���p�G��8����yPX�|��3a{5�UlU�-���2�b����G�����(�b�o�&<me	��P�m�[�����ag����p����a\��]T�	���m���2� �pA=�:�]�5�U�EH��=�7+��Q��m5C�����DB��NeI-�*�/��/��G����Ty\�M��{k�>k<��E�
u�b[�aC$�.���$���2��B��pA=Q�q���`�h���.������E���_:N-)W�(�n���w�Q�D���U��{����v#�vV��}�(2��s�hIYB�4�a\(���.�'�<��%�����t0}{+y�,,���u5�d��XS����a��s�d.�F�����)!�mrI���*u�6_X�]R������	|��9�����Z6�v455��s��HcC�9 IDAT�0.�?�=B�JZ����I)#]��Op��������;2=���v��+g�0|�cG����H�~"]�-����pI=�=Lfjj�h@��]T��	!lA��y��T��["""�6�{�Q��N(8���%�j��K�r9d8��EE����X�YP�y,��hf"���g<���B���;�'�p��5�Uo;;q]w��}�����	�m���������#��3""�<}imx�	!��6�|���a�������to)sB��2���a���h�wO���J��n��q'!;~��iA���r9hU��,��EE�_!���3�F��'"""t��m5s���LEd=1F��f�R,o�������!��[YB���\.Yk���=U5��'"R�6j[�{X�Z���X=�4���,4����8�b�A�5!�.��-��=B������{bD[�5���i�6��u��X��W��r9�0����i�1���	a{{{��M!��/.Qe��m���%�5�U�v%��B��]>�����/ �����?�����w�B��P�aY~k�Hp�D���(��m�""1~K~�{������vgLMM!�����8��A��-���"��Dq�D������o{���N�;	A�^h����:K�=���H)"�8N�0d�){B("b�6dA����������%_���{-�v�9���O��.B������O�E����@*�Zfj���L):����I1�b7�A�������>��g�;��l�Nc��D"�vQ�
%�����c-�ua�Q/�S�4��B��xKD�����C����S��;�r��*z���8��W���w*����X,��<�
"V�Os�*uKDDO�>�|a������Fy��R3�X$��F����V�����?�}}}�[gT���0�,r��u]X_p�?$����~|���>���m���e0b��{�����x�)h��{�4�$r�f�T$!��#\XX��9��2DD��D�r���$�p��U����,��%�a\P�;�0�~�jBD����/�;	�S u��_������B�U�����A�B��!�!��O������B�V���v2��W�6;�H��=��:k��XS=��Y��A����i�1��b	�i��0.T����u�oqDx������c��r�IIT�/�W���Gmz=�n���8|�`__:d�T,!�mr��{�DDDf#��@��vZ�&Ce�h�|8R�vnT��u��u]H�#�����0��\;\����4��Bc����jl������d�YQ�{0i2dYU�B��{�D����EDtO�>�{=����L��p��0����@E�hBhY���GHD�Y���Y��@D$s�_A�{;["�@9�,
���a2��u]:L�0������YnMED,�������0"�{�nQl""
t����O5�������l+&+�$	���J�xB�{�D���6&!�ho�N��D��.�N\����JC�`
�A����>��J�xBh�6$yB��=B��C���`�5bZ�x���fn�><�mE�J���:�U]]��r����wZ��)2f% ��J�(��r���(�}S4��[���`x���f���[�m����"�3���g�������W# ���SSS��� ����	���m�ID�����RX�h���?Q��}��
�5�8������A~�jC�z�������\Z	���� 	!���P�����f)�owFQ���� q���0��I�������a2��=��B�{�D�/("������F�����N5�}J�����0�T��f��p""�������B�#$"""*�K�
��{��1U���q�rog4��a2�i&��{p#HB(�>�����a)��Q�Z_���i��������t67�B�De��%��.�98XBh�6$��������E��� ����c���Q%D	[��^Q�p��Qt�J�%�����VN�#$�������D���� {�����C�������p�,�W �Q�_(�%*��8��4M���[I�
!������uR���%"
����P#
UBv�]C]-|0��a2���K
��=B"������(�T��@/W�=�;��d�,t�D6��0�0.�e��F��P$��m�94��P�<}��7��0�$Uz�������!PT�����B��D"���M�x��;�(Lb�oC��|�t-��<
�Y#E6�x}W
����Ht���G]����0�t�0��[�6J!QS]?e&R�U
�����Zc��|�������q�0��C7L��"��������"������AH���9
z'�������V	��r�ja�*A��@6���W	�����	�H8���Q0}\@MTIk�_���}�K2����n�B��@6��b�x3��dJ�	!������C�|[c��a[,J��<�������	B
���{�����t"jER��!U���7��u�L��
!������b��Q�!O(yo����S��y���Jh[�{����Z�W>�WM��;�Y�a2%����FDDZcG`��*!�'�DD�n���d����U�e���U����y�L	<!	�=�3�F�RX�rC�P�Zp(�P��,R�����x���0V	���� qP+��
�jBD$�����a&S�$!�=�XS�]VX(��������Rz�I���{�$B�x����*���1w����	�j"��@����L��
a(�����B����zH������w�j /�K�o�F���_�|a���*!j�T�[U�%�e��:��a2%JB�0��m�>BDi=q$t�c�)a(C;i��e�Ft@��=x�)�UB�XS}�*���N�WM���a2�$!ioo��q]����XKD
\9A�CN����T�[���*!r9}������&�����DD�q���)Q���
�@[,oy�wK����\�?�\N��B
�t�&<&�������N�g�y��uU���	�����u�OP�l��)x�;�N���Q��J5oc0aC]-�#n||�_b�f�q����%�"�G�G���mA^�K���	���v3LUB�����{\5FJB�=�\.�A������D�Z��/V�	'���U�`�g_Mu�$/���T�jBDdpp0��&6R]!�U�\���j�5�B�j)���*�G���������E���2q�� ,UB��VvYGh�D�0x\�T'���a\@�ZXX�U���`BH��Z�����C�����	�������a��{�'�E��VM���E�����PD��m���\.�#""��f�2X��B-���Gx��P����GQ�*��P�:���:8>�?��,+�|��	!���y��XS�� ���J��������	�UU� �S�jw.�Sg�z;-h��u���{��@4o(Om�����r�}"�GH�K������}�5�^�~|�E�UU��_>�7�����h�5������C
���H$"5L�DyBhY���{������
�jf����Xi;�){y��?�NTT	[c��<$����~\���&���U�jb``�_Q'�B�q ��"�����v�r��vbMoC���U���HRU%D'��h_��W7�jaw�K����A�+I$GU���	!�����������7OTN�O;9�X�����3�,Rd�J�7O@	��T�f�����$M�,���B����mX���.���L@?���T@���W���M!����[
u������1)���1ED���ZiZ$��iL�L"b���"���Hk�H��(P{3���`�m	Y=@M
$���*�m��������1U��0M3��&6�"!q�u]X������Veh;(C���J8��%x� ������Jz;[�1U-�F���6	a{{;��X,�r]V��i��PeDx'�HDM�PD������xt2("255��Ui����*����R�;�
EDX�{*Q|�#���*a:q�����J���Bc��;��.WM(�MBh�X��G���aDD�	Q��TW�b=(��/�i�UB��}��6>>��ZI�WMl�MB("�����y�����(h��f���a��t��J�<��AWq}�?������D"�Ui���
�����`St�$LD�dk�R~�(TU	�A�'��L&�d}__���[B�k�D���Y�H;�j����a+I8P���TU	����J�:�T���f����m��_5��V	���m������"���Om���
���e�6��J�\�����&�*&�g2xL���>%qu�]B���������yW ��m�DD�A~6.���@�M�=!��Mx���-�b;y��Y$�z;-�����1����4�\5�s�%���������	*�mq�-�����x���D[�[��$n2~���wO�B��k��X#��lllL���-dL���H��{�]Bh�f�4M�����YD��i"�� ?9P�h{*����S��&�X����Yx�4>�o��"��i�����
��^���""�gb��
\CT�����|�%�TT������b�D�a����2!������@��PqY��HW���/�+��5DA��J�k��uTTU
��"�Mh����*����O�5v��'��^A~&.��E�"
����J&����yV�PQ��r����\D�-B�0��m�=�\.�#"\?A��n]��������D����=���XS�]K�w���;��P1��N�������\�m-B��	��a�c���nP��j9��^C~.�W�����#
�����*�����q��>�w�j%�v
:A�u����E��e}���&������\.�
*�m5�JBD���,��A��SQ%��n�(��J���L&��[nxx�����mBhY���a\@�B��@���}G����,��A��[����=��D'/����*tX-<(��*�z�wEEu�4��m����A�mB("�8����};����>S�1��@�$���kw�Ts����)*�������c���(Z'��{�"��g8Z�4��	!���N�b��p�����dn�><q��l���
RQ�}�h6�UR�"��i�:������Y��NF�A�"�{�Hd�e��q�3�L��Sr�EE+*��������OE���:!4C,����p]FD�G+G�?���/���� �.J,O�>����q�m��u9D��(U
��088���.h���tuuA���?�yl��}��'Hk?��\�8sB�/wR�����L����Mtp������?�u[Y���SF�Th6CE���>!D��p]v����y������3��n����� O��/�E�"
���/�T	[c��Q������Q�A�A�D"�3t�'���SSS�0""b[�y������5�DX�����_�����xDa�������.)�F�����""�H$��i� �B��	���'Q:�"�=��V�{�w�e�"�?m'��t����*���r���TU����fup�"�Od�YX���X,�� �Yq�R4�TWA_FT�y"
����J��EyY}�����[����] B�����T(��u���Wp��X#v�$�=Hkn�+h<����kw����ZV�JD��+�R��`__�t�Q B���\.��E�`'�����O6+���h����U��U�R~����VT-�?���(Um�N�����t�HEp�'���-�ua'�GH�@}��[W�e��PW+��zXU���D����Tr|����V~V+�{�����phF*)0	!r����,l�}���I��*��H��N���D����3�[�����=�!/��#����������*�hV�'0	�eY����jE��XS�]-DoB���`��A��f�(Q�M��Sr��e�����kT��LUup``�����PD��mH��'|������	��V`��2��vo;��vQ"�'O�)[V��\A�KzP��,�����i�I�q�A�
�@%�]]]��?��}���;�~gR9i�+W�#��I���m�(�T��!q����kT��W��AaC#P	�m���jj
Jl�xO�?t(��Fc��;
u���|a�r�&Q��=�e��5IK��v�D�:�H$`+��(P	�a�8���y�8%�]D�q���ju���.A�=�|n�+%����ln�����e�A���� �U�B���vX�l6��z�G��r���a��y�0�j���eU��E]r�35q+����mLBX��O��^.!t6�evv���I��2���C�C�q��3��g"�IX���VN�s��mgu��,p	�i��� m���B�9m�T+����$��.����[�
>Z��~�����nY=*�*����.����5V�/p	�n�D�X����`�Y1! OycM��������c�O���P-�G�,��	tgF���`__����������
*���,�������*����U�PB�_��A"=�iY=���\��Q�86RU4���� ��e�����O
������."�k���jK�oa����\?2�U"�=H�����]%<|���B���R�'�;U�����f�0T��@&�""��@N�|���<V����D�"���.�T7�c�is�UK���$��������e��Pe�����TW��m��:&�M���`w����>A�Ru�C��a�=5w�������+%�,�hs*�����������A
V������*V.�C����z����]�=R��������3�x�,���*�:�{X�����j���|��R)VC$�	�a�8d���������m�T��~B�� a�~)QqW��v�_����"n9��g���:aTE2�������	x`au�R���tuu�b�r�oP��6J�����^�vZ\�p*���}�� ��T-�/G��5v�b�
�t���
u�J�3���x#V+'�	�m������*���bB�!�I��N5�TW��Q�vZ�������8L�Ho��M%w|z@e[�{��(�:h[-z���zu0���:2�NM�,X�i�<�6�lW ���=��Os'aP��%�Tm���+�m%������,�?H��K���E~e�����F%��Y�@'�""}}}�X���x�I�g#���'D�&*�"�|a��A���g��%�7����q������E���:f�Om���\XX@��~6��d7�T�����b��mO��
"����/���o��L�v8�����X#�sWD�������
|BhY���iB�Fs��T���BGj��F9\&xT�a��	�`Q��~��Q
u��������z��O�3�ug\�eu0����8����fa��6J���F�m��Y���j�(xT-������V�<��o����""�L2h�M�b�"!����������B�m���O�����E�\5AH**�������G!��|�����������+V�/	�eY��q�m�5�i��Kg�+(����&��ME�p�m��v���T��:�J�:r�HED�����m��D�4GU_z�{*���o{\5A`s�����w��y�/�����VMu�Nd����<%����QVAB�vuu��b�m��}o�UB������+��c��*���{����9d�|�$���p��y%C�2����b�f2�H�:���q�w�6JT*�m�J�/���/�DT~K�x�p��z����-��5�+YB��f��}%����aa#+4	��F�*���g�zg�1Y%�Wo��YQ��LD����g�6w����~����y�z�T*��*�� ^����vX,.����[�
~��UB�4���m��,�DAD���J�U�;z}�^'w�ZB��d�X,�B�auP�P%����Nr����m��z'��z���!z�"z"*]���i���^�M�XB/"266��`��*!4C�I"b��[�\6��m����kw�1U$ �9.�'�rY��H��
}���J��iA���r�����d����UGGG9=L�P%�""]]]�X����[�������sfE IDATK�DoRQ����jV1��~	}�."2}{��0�o{��%���X#t���=�Y{�bW�lMut�i���G����A2�m'�yGE��]B���x�Id8�_X{�B���/�g�\�Us��������G�!��������;	}�s�G���b���H*��FI`�,�u�K��6�����<f���.��RQ�����E�D!��-���E�j�-��M��j�����;�^�Vb�v���^�)�	�Hx�FE��r������=OI+����9`F!�I���'O�!C�*��&/���������|o�����d2�i�%�����m�D���r���u*��L�������CF��������g��5�\n�u]%�A�qXT,�	�ab�6�m���ms��_�\����B�J�V�q=QtL��B����4Uk&R���������b��P&�"��QX,5wy����J8����=�N��A"R'_X�/�G��=IU��ccc�����`"�H��YP�~���q�i�.�.�fTU	ED�}�:
���2�E��E�(��'�j���H&�Q�^9<<���B���Y�,�6*"�lE��!���*�m�A�1FUo�}Q�"z�hZ����J��YC��+I�R���%�����j"�	��H__,�m���HJ�������&�E�DQ�*���W;��5�+9��}������VQ�0.��@��B���m����6JZP�+.�w��+]��"z�hc���������y%��U.�h6CUxzC�����r�����g���bM�w���<��j������A"�^���#�������N)Y3�r	�i�IV���P$�m���6JzP��o;������PW���/���VQ��HSa��4 ���J�������T*�r	��:���'�!o��E�������T��	�}O��&��$U���d�xUk&���x���:�H$X�L�Bt����*�������ZX<���-��|aU����?�r?a����_�|����a)�"��0���;��h����������T*������d��\�*�	��mtjj
K��FI/�z���*�������2@W[9L���4r�������[��h�U��E%m��LF��	����m���M��DB�,M{�7��>�M5�v�/�������5"2S.����xs��a2D�3O�>����o��q%�d|�?�N���������^Q�����0q�6���`c|cM�wyw�t2r�����x��ft�c����,�W���(TM�>����5�U2��%��D���D"��,�SU�i{�HED���`�����>��|���=!C�P���-�za�nC�a�=���
:��:�j���5""�����9���$�����F}���<VW��B��{�|lx:q�I�>��NB/��4x���-Hm�;UcM�*��\3�4M��*>�,2	!�mtjj�T,�!���7��
gR�75�U�����pf��DD���T?���T����JJ������0����/2	��m4���b���V3i�V�<}�t7a	���C�>����N$"� �����,�p��N)$#"��d��#7s	��"���Fs��**^��T3w��n��k�%��pw�S���.JD�������v��k��$��|���R)ek&L�L�:�J�m��������i���~t�gR����Z�5���H�\OBD�������d�]���
z�wellL� .��H%�""}}}��].�����vZ�IH�Y{�B��L
���iA�M���{���d�����e��n�Mk�Q���T*�g���K�B�q�1�"V�X���f�Dd}'aC]-,�n-�W���N\�d�M�O������^��|`�FC���:������g�Yq]�K�iW"���8�;����E��)?�n�\�#���U����%�����WZc��x��}����Um��.�W\����yog��L&�"��p	}E2!���B��N��[����l��J�7o;�<���c��w�o�ED�����jq��]����V�.�G>�k�LF|�W�fbtt��d&�	��8���	.����A��NB�����d����5�:�3����E��:�v
�5���DT�S7�0vl��5t����*��M���ZE�f"�"���8��555�%"o;��N�-�{�M�������?���&u�>@��A"*�|aUy�y���M?Cm����q%�u����"�F�i&��4�������v����	��`�l�x��Hg���b?�FC�G��������_�]���C���#\�X�O[�j��d��KJ�%���*$�ia�����O�m�SSS����O�KO�����FC��K���TWA�E��?�n�^��7�O��]<W��P�sPD$�JA�_od�v�q�wT���9���K��������T*9I1��?����zU�g$���je�O��cS���d)���1**�vJ����xC��@"*;�:��*W2�x���m�y��jV�e2Qywpyy�^X'�z���b��ze]�X��y�/�o��_w>�q+H��N}�o:v��Q�&''��DNz>���/�^��^T}��d��=�xN������������R�����:�<�JKK������`2��E=��������y����!��I�X����`���4CN�>-�m�X������H'�""---/����q���_G�����t�f$?)X�����V�
O�������*qG�7}{Y�"
���*�����T��S���C�z�0.<~���n	�f^%y����|����y^����2M3i�������8�T��E>!�f�/���a?�?��4M�(;���;;:'�"������@D��s�I�d�YA���itt4988�eu�u�i��z��<e�w���d__�$	%�a��b�(����_T8Igo���}X<���|^�I�a�[�vQ"
#����������-�-�J.//+O7V����K����8�����[E��|B("����2��A~pL�L>~�JD���z>�OY�B/�@\�����;=A^���1nR{���D�� |��C*����1e����|�m���l)��<oc������L�LK"��x���PDr������]�{�v2�V-
��|�O��'����������I	r�LD�������ttt����j.FE��TO�u{JC^�����2!|����Q?h�D"999�%".C���PDd�������1v
�{�."R!��	[ZZ�
D1�����m�fa?��R���~������_�����l�g���������DU�	�+�T�%���b'!��P))	��]d�h��e"
�V������hofxx8�N�_W�\�����{��S,ED��/�����jj�8�����,��&��x����N�����)hI������Ss���JAV���miiq��>I���099YS��3���HX���eYIT��q���(M��pIgo6�-���9�"y������������V���L��$,V��z�� �4r��,�Wpm�J��a2H�b�Vww��T*U���
���`�<���<�
,��������&�I��Hog�������A������X�9T����xw������x��
����\.����O�0666��������_L7@�u�h||�d��{'�BMT���l��qO�c��m����,}<��j�PW+��{����hKk�_�����P�R�z��@��<o���c=���~
&��!����Fs�4A���j���B�$*����J:{S�cH�j8���s��-���%�vQ"�I��*C�P���J�8���T,outt�a�I���N���H����������������#�4[-�B�����C��+�xD��_Y�������/1��r u�����{������"W�����J�������IT�����������E��.�__#B����� �
��ug>���E��Az��_�����s�����������{��)��8v��K�)�m����yD��Z�b�U�������P�0/�W�����`��8�u=NK��
�GD�[��u��~��R�s���0�����bY������et���b��;���QX@Y��Cd���GaMEDZc���Kgeb�}Y�x@f��{.������EZc�����X��	�A"�Uz�fOP��d2&��'�ie�p��7;v���x������QT8Y��$G>��4�[�VJi��R��q���	�H��+������v��������[��(���?#"�z'�~p� �eY����]-�gB��������BNd����?@_��,����`0}t�F�H{��SZ�i�����(����i;nQ`���;	����l6�'"����


���a2\EDA0�x_t�q;66�d��u��t:�c��	��9d�T��ql'WPP���N���`��+k�_�~"�]�v�Y����LF�D��'��L�t��	�^�$�U#<���<�
*���K6��to���+�g$"
��www�
R9uwwR,����nc``�����������5��d0`�yw��&_X��u4����r9��RY��?166�e�(�������%j����2��M�[��I�+A�G������h��X��r��~@d}��f�l��zn��gV��{�&
��HD5�Ub�>.����N���?bu�*������Yx��gB��l6����vR3::�D��

���h[��,����r�!�U���vI`Iww��:H����Q&�;(�r�������4��?F�z���i�t�6�je�O���42}{Y�����KC]�$�g�^[���LGG������X��4C,���.���O������������ZDD\�����}-�������v���p���_f�Y���?(���H�.j��d�w���5�ku����/������u�|(�dJD;i�5��������u���V�����2�eYV��,1MS���gL���M����v.�[]XX���r�$��U	����y�iii9���8N�����p"�E���A������&��5�s����D�M�LF���x��J��������d&���������_ryy��eY���5�]B�y}��,��1q��|<��pRg���Li��QI��^~�|`�711<����e���kx���ugR�T2�xS"�HNNN��2!�%�p�������(*�����g)�N\��n�o���L����0�������������Q*"�������L tfYV�4MyU�[�,�YT����1I�R��L�������Lw	=\F�
��kwd��22$�V���yWR��'�����$��}tC\�B$���X�L���1 |�?���������l�~=�������i�7���;�����+PQ���L&�C"L�=\��*����^
E����9I^�]����c�^_��m;��0�\��Lz�f��D���w���3=����y�h-�����W����:�EG��B������L�
=\F�

.�'�x�)I'.�~��ZZZ6m�ab\������(�j��d��K��+X.���<o��/����@�D�0��e5����)�i�N�DD���*),��2!�#�p�

V	����nd�frxxX�U{:�"
���Z�������yW�����������bQ<�����qG���,�a��*vQ��F��z���<U�J�5���{w�Av�nd���������J>�w���n�D��J�dll�g���2!���������WP,�W�#��LHe���y��^p"�H�����4���s���.��n�D�r��aX����i��"X�$	�Is&��^�m�5����!)t�2?h2("��f':::��;&�LF|�?Z�����5�������j��T?
��n�D�4::
�3|���}���}�}����cD�S���UB*���*�������(G2����}}}�k�)V
���� E�J8??_�
�>��Yp'��W,oe2T8Y�6��BcR8��f2��%�""��N���O:th���[���X9�+�D�QS]%����T?��8�B���=L�i```f��|��,2���$�g��R��|pi@�d0��J:��]���r�Tj���clii�T*%��B?;��bM�w�}��@��t��]�?�����VQ����k��8�c���,-�FP��>������3hL
�t���x�)-�;f�YAN��al�nnoo��8�FN%�W���:t��b�v�	��WPX��\^^F��0�����r����n���=�m;iY���������,��D�3EA:{S���~"����p�-�bBx�bQ�;]A�bQ=���W:-��<�JGG��O�����i�b���>}z�0�[�&�_����/��s�hK�~"�:::�u]H��	��R�����m'���Q�D�UB�&��m'EDJ	����~�+�,���8�0n���3N%�[E��1!�

��zV	iwtj��}�hKK��dp�T ���e�vG�cEZC]����_�ci�r���WP����p�(�L�dPD�����('�""�e�~����l��X��� �� �k,�W�����6b��\�����XC�d��t���nKK�x���DQU�I^���-�������eb�}���+��p����_>|�ya[�e��K��������m��4MV	)�j��d��K�,f2�>1�����v��~�H�?��$�|a����eI�|&�W�e��=s��vx�z%�����_������X��	z�a~����V	i���*�����tY���/�l6���a���mtA��s�K�+"�����h��������E�.����QT���0!,���CWP������0*��p�(��N���[^^���d��kw�AaU��+"��bk��j���g#~�a��]2q���}~���B
u���������3��hL�(�N��d2�R$����d$�NG>���L&	������;2}{y����k�&G>{��Q��r=��)s��������j��@k�q���8������$������!d�b�x+�� C���z;�./��l����$	m�����@��'w�����Igo6��yR&n�����������$��)��'n�����IED��+��l��!?WhWr�,�a��[�Kd��������l6+�����,+���������nYS]%�Kg�xa�����>V�#�����n��V�q[c���V��R�������Q�����AV�mxx�(2^�X���f�!ED$���S��5�k�z�w����!2�CD�[��q�n���vG�>�Q�����{'�
ATA��z%q���s�����WK#�����O��+���%��)=N�W�?�j\u{���8t(���kV+����e.�������|��1*�k<=����y�w����Q_</���J��Q�s�n���|�	PJu�7k��x�I�]a�zg�+��<(�J������.P�~�|�����aBX*��&��_H�|�K�PS]%��oU?����R����L�"S�d�DeR8}{���D��]�N���������5j��)H��+
���������].t��bH���/�2!����������J8��
q��������A.�_�H$������0�L
[������T����pZT���WMu����K��m&�,�W���8�_�������������JF>���Xtu���C�0jV]����}"����#\��R��|pi@�/!&��,��"�[��h����j��*C���.!��L��TE+�DQt&��7q�^��A����s��EED�nMu������F�5�=c[�{?b�l���WVK����xn8���E6�J	����m���:v��K��C_%�t���K��Hww� ������4M���7�j�?'�Kg�1]����G7B��E������������k���*9�T/���<j��U>e+�����_�Y�;."�����}�����.�K<�������r����w;���
�f�/�SU�)
�mT�x��J� ���l~~���m������I~�������{����.p����HC]�4�]��?+%�����:�����_��eE IDAT�=!6Tc7T����������9�.����U��~��*�D�J��0���,�J����AM�~��7�je�O����� *��A�����]���vw1U��m;9??HD�{+l`;A��]BhL�����PW��?H�k�5j�f�Y&��$	-������ax���L����z�w�	������GL���Ef��+�%���]Q���tuu����VX"�8d�d�L&��Z2~�/Lk�����U?���'�\<�N�!2��Mm�2L�^������(�bMo���>��w#���V&���|^��l���[�a�q���&�f�@?�|��P���N5����Q��TWi�x>�J��A��������f&n���er��IgoBc����������vk��(�l�����_t����!�ke9��4M�P��L�U���1%/�W�g�[f��J�U?��z2����.�_�(z���+��cn��#����L����>�x���j����5E�����d�LI__���}�����[*������x�)x\:�v
vww�dp�����X����Dd}�(j��~ ��!��!�
,=�V��.����qG+:�h�f�J'����t����B�(U	���RS]�"4�C:q��.�---��'t399�T���}tC�z����W%<�X�GO5Q��L��q��*O���%:�G�l�%BUU�T*��Zog����7��-�������"��qA�>�7�0Qt'O�>�|a���K�(��B]�`Q��TW���9��
���;�:4�B"�8�����HQ�p����;����5����]N�T����0������C2��D���-~K���Ft0�W�R~�3
B����;�[I^:��Qv�y����n�:00�l�/�}&�@*��""�L�tL�t�"?�5k��f�`*�R�K��������m�s���4Qt'_�r�2����[����3���T�=T��1�2,�0�������0!�SQ%�f����'r���bM�������u�t:���,�i*9��H�!2�AV2cMo�b����zH�����@}���j��$���(��%�$�""����VE�����R)%U��KMu�d�.j�^B�������\^^�7<<��Q^�}��VP�a��Y":�iy����	����f��nd�Yiii9�C2h�fr���%LPQ%t]w�u�d�� �vG����?��`��/�7M3999����ZDK�#�i?Df+
��8-&"� l�/��N���F�zONNn�0!T@U����_�N������@:q��.��.�h�D���������F���%�]�r���S�D�Ai�#��m�d��m��E&��*t'i���w��*��J������2�kC�+�K����i�f��������$���ktLED\�����e��q O�fe��*#�\Q�DPd}jz:��&|��j�V�&��(�8��M�j\��k�o;�M�EKKKdv
Z��M�|�2y��u�m[I�~'������M-�m/���JDu5�U����DPd}��nS�����$�B�TT	U.�O^:+��z%��J������O-�J&����-//�����G�����@�y�WKC]��a1��E�������h�O�q��Vk&���P!UUBU��ED�	�Q��z���~�N��������h����.//����V�b�3����,���	6����Gs����i�r��jGG�t;��m�h���������?D������f~~RDDbM�w�����s�g���������l��A�4��mKWW���8��;�b��q������"���J�m�$�v�4�\����d$�N_W���~�������0!T�T%�d2����N�r��7^h!������04�	��^B����QJ��������i&_�G�-I�-�4}{9�_�����H��>y��{��v���K����m/�UW�nR����'m��uuPD����/+�<���{��>��4������!_�V��|8����0Q4��%6IU��IX��-}���&n�c������^�vj���5�(�����H�y�w�����;�n9���~����AV�1<<,�������Od2����04��z�����2r�<v��v�h�^"H��m�I�����}����
@�����$_X=����B����q��@DY
u�b[��5vdc%P��H��j=+"Z&��e%�rop#&��H$����_�/����=����UTAz;[��qWP���Ni3����A�>0M�,%bY��� �%d	���>����o���G��""�����#r&����J�Wm����������"*�z�������	�FFGGg:::�1���-UfD�����0��"��^B�]��a\�m��U�f�'�/���|8�]}��z-��DDaUS]%��z9s�QZcGZc��qC�u�Q.�[���wu<��h~~�_,��t��}�!�LGG�K'��_W2`FD���}t#R/��TS]%��oU?���]/aYV��m9}�t(��D�����41���/'���;�D��C��_Hgo��� ���j�5�(�����FJww��r9�A����d"��W�h	B�x������R�fD�G�O�^V?�j����(�J�dll��YJ����\�@�9�?�a����`P	a��Te�9����PW+��z9�T�Y�/�^U��0���B-����TQeL��������J������ �K�q�q���N���0��j�5������L��n4q�^d�^��>O4���u5r�����&�RI$�"�&&��}�����Uq21??_��]+�'��������E�c���3k���M�L:�#]]]���m�9T�&����`T&������_h\������f��-g[�(������F����^Tk�|�%
��3Lv����=�f�r
�g����������1�]f��8P�G7�A�e��?�Z2�9�M����5��������?�~�4i��}Z��|��<���_��m�u�OkOS��r43 ���u��z����7k4R*����+(l��L,�����z�R�4������?�h�x����z�+���"���������8333����� �Sg�D�_����GF��Vf0>���\:?,����k�[�z�u������6�����{���g����c����h���g��g�~W�V:��,�0(�al��m�f������T*�Hfv���2�}�xc*�e�������=�8N���k����x\W�����7���4���w���^TG��jms��w���""����<`}��������;�udN/�?�P��A��+�� (N!�Z����^�����|���Em����T<�uT�c���	���B�����K���b�\�N�uCc�+��G>^�x����5�"����l6�J�R_�.GV�AE0��|��8�7���+
��A��?�(VGK����1����.F��g�%���|qcc��z�.���[���8������8��p8��z	�b�����r211�D|�0����bu��Q�a�m����?���r��b\�K�.A08w?[������ij������bsL�<�RI���n$��`G�^5�c�q��|>�.a�RY�ZOGQ�c����"�P��������5��*�Z�^���uvo����������:���z��^�K�Z��'O��������	�0j�Z�eY�Q����hf��a���HvI��������E������i��j���at��U��O��~W�#.;�����	���F�!CCCR�T�2Jb7���[�V��0(B L���\.G�pt�Q�OV������hf ��v�K\8�?��*���|1;;������_�S�r��/�^�1q�$��y�CCCR(�vO����b�����8��J�e4A���v]#���"��K����\�QI/�s:�%u��O�������h��*���q�]F����Pz���y��ju2�ww��^�cY����&H�V���d�P��-���Y�r�|��0�������l6{�0X�T�G������.����.�����\.'�\�����|>I!&J�
f|�_������*����I/Q����r9�%�����3��d�����"���^����^����:��"i
�"�z-���H���0q�l0�l6�F�_��P����&�j���%*�J1����������\�?�R����n�#��8��w	�@�YLZ�`�y������1��OQ��u��J�H��J�u����R�v�|hL���8��F�!�J��w���������aO�Rb�0x�F�!�j��WX�L)U\ZZ:c��f�k��LB�r������t����������J���k�0����f��(���8#���O,Sf�^���T8���\��GnV�.�������'�Fc=��#^'��wN�E�a�0��������Q��Z/
�X4
�i<��P�0����\.����~����i�t�8��~�"�^����~��%��D�h4r���<����fGP���Z�6lj��~����r�\�V����4�����X��r��p��3���|��pd��z�r,��������v�}�������R*�fGq�����y��_����?�^Nl�?&��������+Y�c����^��;�#�<�[�s��d��L�n`�R�X����R��^��82�pQ�&YYY�"���k�[�w��pms+���K����LLLH��<���eY��|�M�>������Gk���WO9J�Oq�?�����^�H�23���i�����s��l��n�^fgg��r96GD_�a��j��\.Y����[���-3��p���\����;Zqk�Q(ED��|���= p`�����A�����/�^��R� );�2�����z����:"�2vS�T*m���E��8N��jEU~O�~!�v?��7��@��hH�P8������'�m?	zMq�9��������������`�8�G�6��f��u����4������<a
��m�f��Qn����X4��mms����~�0.���O���?�(V��v�~w�6��E�=��jsk����ems�;������"�C �Z�i��n��wO�0+����8�u82��eI�^���h���td���uAn���r��h����Y���������zzbb��r������"��6�.~�t����_������gH��"�Y������u����x���n�S�U�)���X�<vS$���""�V��q��u[�������M7�������cy�>���Q��k�*��zq��_'���SY{�%I�H�D�z_n�����(v�������D����E�����5�@_e�]�w�^�aS��nK.�����eY��V�Wq�<�2O�x�w��(`�[��r�#��������������??Z{��O����B��v��A���Fk�hyy�Ok��G@�$Iw_�@�2Z��e��Q����b\:������\��?��p�;���NH���X.
�h4��=n�pms������C��D+�;B��>�rQ�������3��=q�L���Ak=������*Zk�Z����m�����8��!vH��T*�Q
��HJ��N�����G:B������.:��X�<JG����Y��_/zz}�[��#��=~L*�.��g�����U����(�V�R�TD�}qG����\���v�h��}���VWW���������t�r�\���M���n����r�Qo�'%v�mn]�V����������=f8��s�}2�y/1��������R��:�����_s4&��8�88SC�w����]tGFFFD)���;���y�b��_]]�k���	~i��6�yaJ��?��f�����8����=}�+;��a�Ck=���~��CT���o?Om�.�����{!�xc�H����	i6��<�e�+���RbY����lY�� �a���3���FDDk=����v���?_l�.�j���6�ya�5����#ti�It���h����t�X�(��s�F ��� ���	�;,J������bu���_���v��cY�����p�����@�r�Ba;�"GE(����'C�eSS�b��$4M
�88S�phh�������b�\N����� � \�Z�G)y7�F��P(�^F��f���a�������p����]�J��z��Q-�k�f���?Z����tspp&����k1��z�����0�,��z�>mY�x�k!�u���o��~���������`h�CG�p���p�'3�"Ii��a��]l�Z��V�'
�$���^����]��n�!��_��h���""���}���Yb��\:?|��yY���x�3��1����\����3�8#	���
����y^ ���}l�.��e���=Q�%*�.���{���cq��P.aPD��lJ�V���d�V��E������uO���t�\:/�N���{�X�K�D�a���=Z��8�$&Ok=](n�������y^o\�swv
ED�������<�h�)�wq������Mbb���\���]����t����
��[:����,--���|B�g�Pk����q�k�����sg�q�%ew8�����m�U�- ��:!����w�$&��Is1�Y�����s��m���������0v�y�w7��}�::�R�z�>����Z��������Q�����Ol�~E��x��������WOe��Vj��?&����'d��6�sD���N����
}3a�����.�J���iY�����q=~W�FC
�B�_G�u�KKKQ.!����������C�6��^��f��`�dO����Jc���+�@��\L!p0IJ��#�����eh�n�Z�8;;�2�T*���\,�~KKK���i%�GkOg���������?}�TD���b����������>!���fz�:�E�������J��N�,k��o�1r��@�_��c����H-����q���������D��� v�l6�&3���y���A�����@w���������gz���N�{�h�����IDD���T*���w��^���������u�i43 �b�VOOOl���,�w]wxfffZ)u;��$
Me�\����f��qz��i6�����ZOOLL����KD��n?���H������F3{�=�f��	�c�v�QL0~�-��diii���������z!��^����z)�177'�l�B��`G��\���0h������@�|pn��bAc(}w�,k<��WVV�����a|��!J���V�WQ�c/�Ri!�����g�^KT|�?���$NM�^�T*-4��������k���z��p��[����o����z������!"�Ba�^7����<�[�f�^7�>�|��t_�M
����z:�u �&&&�"��2�������vES�n�+~����C��p�\>���k(l��J������������Q�<�\.��n�:!�fs������������~���9.!^���{��|,C��?�
����j�*CCC7��+��v�� ��^��(�T*����R_�x�������(��t��C �����X�B�g�HO�<�^�V�^J`��������/��O�B�������l6����b3[�Tqvv��j�z;w	��a��T��{D$v��wk��*��������������t(�FC��jj�V*��5#)�J;�$�R����g��Ek�n������8r���-�q��,����� ���
E^��|~xff��m�O�^��T�Ui4�
��5������b�^_tg2�� ����Z��s<H�w
B~���R������1q��m��#����z��z[k���n��������
�u���k[�������zz~~�V�������/�r9����Z��r!��K��d~�8S;�;
�.)�Wr�866&J)v�@�7j�Z=�\.����l.4�M�,k�u���W�F���w����l6���"����077��l6�-�B���� IDAT���)�JO���w��?@���6wf~g�D�Y�SJ����(��w��@�7�,+��P���a���F�!�e�;�3�s|aZ)u+���fskyy�����n���R��q�GS(��h�~���/o���:��O
�WBaY��Rj���~B�K'�J���)|�v����lJ���`Y��Rj�q9{�����h��/N<�[l������}Zk�Zw����4�������YIjS �^�Z�����;"
t�s�}3"������]"�v���~[�YTJM���{�o�e%���~������<����m�E������1���G��n�xA�n�o��D��M�I�N��m[��=+J�-��8�3��=!,M��u|�_�_4�����3�j�I76M���`�Cu���?���Hg���m�m{���;�<�W"�P��z����v�TJu(�y�������r�;�1�y���;w&�#��v��s�R�Z�������X^^~���8-td{�L���qw�1�{��6;;�cY�v�P� ��!�
�qdff&vcD�]�����y�Z�5�s��c��jvgY�8�3e8t����A�@�����V��kY�x�kAzy��011�444$�R�3w
�ZO
9y��z�PXHZ�a��T�K�!����j�Z�RJ�^���������l6{!��������&�u����g���dhhH����F���A���93;���-���:���4��#"J���V��qBa��\DO��Lk�P*����ntv��p�m:!0�������R���H�B)��S�LgV���l"F�QJWVV�V����P���9��r����,�r9�V���<o�T*�9
��2����]^^����eq
]��2\�V��K�P��ce������Z��3t��j�

}�����y��K.8�STJ�����Rj����h��=�����,�����m��8�����Hha����S�����(�'&&���/�z����{v�w;�����r�LK(�����DDnX����vGFFF�&$z������/@�F3�&��z�8��7C{83B���������R��=77����)���z}Z)�g[��{���P�[��~�y��7dg'qg�����-����$E����������I��Ek��5;?���m��"B��V��\�z�n�P��)E4fgg��r���W��P��=
���T��,QJ�eY222�eY���(�nE��E�����~+Zki����
7D�������px����iG ���L���L
��f���TC,�����������~�
��-��>���a��I��\��]��!�q�=�u��Y�m����v{|uuu�OQ�k��/{�T�k 6z�:���M/O��!���dii���<v
p]�X����+���Px;��m
�����������,��D��F�h����K�������X �;�vvO����V�wii�Pa��3F�u]�N�}�?m&���q#��.@ D$,��Z���������S.��+++=��L����n�\�k��g�s"�d���]7QGk���@�����=�z������8Nqcc��J�r�]�W�T*=KKK�e�F�Vc	����'�~�mh����
�����{666z��r���J�b���m�Z=a�Lr]�����]����I�Z����iG D�T*������	��g�v�^�z<t�u7[�GH�j��Q/H
!b��,��+t����FO>���(��U*�����/�RC����0*�l�`[��a��1t��j�z���)�n����[�w�B�!"�,�z~�piii�[� X�5������Z-�GCb'���B�n�����}���B@� "Q\�}gii�gcc��Z���]C�q:�B�����7�	B�n����D�&�7;7�g�����1R�B$�m�����==+++_���&:*���Z��n`>�e|D�\�}�n������6R��}f�����z
@`|�l6�O�����l��~�eY���_�zU\�Md�{�v�-sss������v�A��A�mooy!4�1���WY���c'���T*�����7�|��/�B D�y�w������U�</�`b�vQ)%ccc�8��R�v���&��-�����{v�B� �F#�@����qX���@����������<o�������h�*�e�+��m���g���8�J�)�4.!�G�6c�N.����@@���NX����7�8RJmY��@D���_$��K\4��j�J��.dY��m��Z�@��B Z����W�W#����B�������^�mo�����i���{���x�ww~~~2��=�TqffF��|O�R��ZG�$���0*�B ht�q�:cD��r�;���:�4WVV�XYY����=Q�	@8�A$�@�l���p��j�z��<c+��Y���D	�Vi�A��It#����q�������l6�r����f�I#��SJ�]�&����m��7@�15���n���RX��m;�G�E [������t����r_����HLt������.������t	!�D���Z�&��6��'�������F������^����/L�i��&�]�@ ql���������������v";�RJ�����-�u��#�@�q��j�&������@�)�n+�n��yy�����h�����Ek�.�>)��J)�q��F�:���C��@ u,�z~�����A��#B�?X�5���	�J�)�����{��|���z@���A������X��b�@�+���i��!��n�����z��������Sy�T)U�m[FFF�q�E�����?���R�V�u2}�h�i�e�D1�C xB]����c.^�kZ�����q��&ED���;�},w;�}"��p[�%J�N�������N+z05����E#��.C �=�S��WXyv�3 ���I�����Nx�mg7��;��m��������~[D�y����;�"���@�"�!�A���=C�!�z'@��i�eYa�b�Q/������@7!��,+vw03�d#����	 �A$�����@�"�P�6�P)d�0 �8��� ��(���bj����F
]�@�C��A����(t%! ������:�0QHS3}���R�z ����[]]5���s�f���D�"��m�7�@���:a���@t+!�8���^�#z�l d!!�����gL�3Q�!����@�#��.E ���{�w�Df�"���O��7Q��B����B@�p`��#�Pkm��X���H! f��Sf��b�k�M���z	@��=v���@��*����
�]f��X-������m��D n����=�A�[���j��F�r���i�7B�9C;�Z�i#��.F ���7�C�n��M��,�H ��8S
���Ff*��M���@�1�`��o�5Q�jB����:��H!�8�q=nfjN������1���xZ����t�����Z����
��@�}3�a�$��V�k�B ����A�y��N�""�e=0U�!��_��g#uL� ���vn�o�D���U3[�"�8���Z@��%��W�Oa������@�#p�c�@W�Z�c�v�H! ���T0���V��N�����:�G�#`_�5�A@ ���9���#�Ddll�T) ���HpoHSM�|����B��hpoH���i#wu���&���(��L���@HSC�?87`�K���=4Q��o�5QFDD,�z`�CB@*�b
t+S3M���m���1D @��Jo����b@��!�,�s��=�32r��,#G��8#"q������Lu5I)5���8S]��15���<c?c�e�*���
��P�������z�M�1�1XDddd�T) ���T0���F��N�0j�c0;���A�bj����&����R�#��zB@$
`/&!��!bj������2""Zk#wED�R�M���@H�"�n������v���3�g��H���� �g�C$��>8gf(���� �!"a��f�k�?���?G�������X p@�������`���:����&����={�T) ��Pf�\�
 L5S29O��7�3B@dl�.�<���Okm�#'�g���p��?�#'L� tg�X1 ��x%�#'|�_0Q���?8 S-��80�����6RH9�F DF)��Lv(�����v������ "���oG�o��	 ��x�4��p����! 2�eE��C��gd��&���A DF)�[z���|���:rB)u�X1 ���SGN(��&�IA ��z�:�E�kLH��	:�/""�8�T��3��"3���H! b���]7Q������S��D RCkm���-�O�0�a���	����Z@��4���m��0VH! RIm�0�1s�
�&GN�ax���g�lN����Zk#w��
��*&�Si����Z�v���x���2@���z	�r���n 
���B�����g��*$��*�v{���
D!3p�HP3���8���	$��������u���	�?�J�@g�i@ DJ)��7��vQ��=4Q�T�Q����~���*�����=�`����:J�a#���!"e��/�|��yf@Z�k0z��`�NRXa#"e��f�k8���;�H����A���#�DD)�e��$B@��:~���;�����D����Z@��s�����F��if����z�D����z��C��9V�f�H����M����B@��R�>���$ mLv5���2���{���}��{I����(e������]E�q9�0�@��m�Q/�P�
�E� p�:������&�(��L���@��m����7��H#SF=�3�kg�v��,��D""�p�o��6���Rf�4���:�:���o����8&��E D.�v��f�?��H!���u1RH*! ,��Y�:�����1x/��<#u��6RH(! �D����@h���eY�J��a���@�� ;��je/��	�K�is#'Lt�E�fB@,�={6�g�je/"�1���m4����:�:�2�x3! ��E����@tS�bM��a =�fB@,=�������W19����2�:�:��@z�
��XPJ����n������^�q�b�E� b���@����j����;W@�2�����<o!����@�� ���N�����&�h����� �?B@l�K�pz�`2�}M��Z�
��eY����@�������er��Y�H�����H�����p����>��p���(u0�Ig�[���{��G �F��'L�?u"�%Gb�9���2������A���<�H��?M D���k�g����R�v�u�� b����:���?��^'3p:�;������Z��&�	��*B@�y������=�u�O���(��������k\�zu+�"@��d3S�'L������?(b�g�q�wB/��+A��=���(����1c/4|�?��~�
e�)9��B@��i�D7�:�"�������<�I�5�^�v	 u��X	���)��!D��{o�T-�]�=z e���QJ�i���	:�"��\:?l���y�>����m���R�@��T`�2��^D�Q�����	�]�
��@j�322��L��y��H
G�4r���k�a���@��T`�/M���p��1�a�X�{����|����R�C-��;A6��Zk�ar�7p���x��������;��!b)��2�v����F:�XIq�����<o��n?����W��|>�fB@,9���|��M`{
� )
�����q�u�	��fB@,�Xfyy�XP3}8(G�F/��	��GC ���8��4�X�������r����6��Fk��	��GC ��m���mr�0����f��!b���1�G���f��&l�.r\8! ��Po������d!�����F���s'��3�8:! ����{�������;Z�~]�������(����#b�u��v�VWW�z�]��g���t3�F���m�.2�8:! ��G�c�e430����z�~L}���������33�w�@ �ZP��>�������!3�'���p�.&��y��fB@�y�0�#l���
�����X�]������[�m{3�@� b�u�����������tGG`/��N��K��o�����WC}>�M��X�,K�R��#l6�FwI�>TM��R�r�����z:����e�����^��@���v������
���=��*|O�������|~>�7��H;! �\�
l���{�&�z�~\��������	'~ff�f2@����SJ�j�D���1�v���aFP 
������FC�������8�d�����n ��}��ln��}��#������\0>�/�����]��@7"���k��s�N_P����G���1�%���\:ot��H��dl�.�L��]�}��=$���������l�n��d��A $FP�FED�������?�`��X�k���i4��������;��@H� ��6���o�G�F3��F���%��-�
���z����^�644���~ ;KKK���O8���k]�"����W��Hj�<yr=�����];��D��	�q�����0(�.!�s��?�d�e�Ze��`��������A=og���}B��?�������H�+��G�HF$���V���8�TX��;��D�m{S)H�Q�j�j4��q���EM��p�d��f�i��s	�����z�����������333���	��n`3����j����-��^H���������Q�{w���������|������FPg���A�T�����dT���,��a>�! ��^���|�_�"����8����*W.��+��GU�P(��;���D@ $����
�yv������<c(pPQv�ZO7�@f��
���9��$V�C�E���7~�1������H.���B�J����
���!��u�@�W�V#��E��G�`���
3���j��0��E�Kk��l6{!�gF�KX��{y���tY$D��H�C��)�Z-v��!$�R��m��u�n�p��O�M�=}|�b,�`�T
����H�\fw0�@H���`uz���y^$J+�.�a/��/�?
t�P<�[�����h>�/:�3f
���Q@���?844t#�g�[���Vi�A��e$�������������lhhH�l������Ol�����c��hA�y�K�l6��|�~U������-3�'^�_%.a�T*���r�0D�@H�k����R�Y*�^�|����i���,����IGE-������! ���|�&}�_h4A?v_2�}�O�]z����?����G��LLL�~��V�
[�v��B@*LLLl7��@w2,����o��|�A��lEn���Q��!�z_n������=a�a��R�����?��n?�V��?w��>���K�#��p�?&7��b�`�Z
=���j���kx=v�q�����������I���/:�����Y�����f��5���7IDAT11�v����b�Vcw�;��������,
��A:���hf@oL]�k�ZO
����c�v�\.�`��Z��e��P�`,--M��i*�����mF2
G���\�����d�ky�l6+Z�����Z�^���@ �J.�����m������{`���x�����}�?uB�W.�_�t>��D�e����������%v����( U��I(�lE�T
��q���h&�O��J����_$	a�P(	��e���u� #�R'��2"���E~�����(w?[�zxI�v;
��4�����������`����T*��j5��q9:*"r��/�o���������^J�s��2�����G���h4R(���|>_dw�! u|����w�����Y���x���>����G�K�:�����K�c;>�ML�A���+++=�e�(���T*
�a��C���h6c�hf@�����:�2�aP���@���
�g�1����XO�X���I�����	����R�(�o)cL��r�\�T*b�@H��FPt8�Sl�Za=���-F��������^��=�z=A�V�R�T������ cB@jy�w7��}f�J�R,��a�8�GkOg*�?�s��`�;Lvy������>��x#R-�]B���'��N�o���+�~(dR;L�A�
IA ���]B���[����R���s�~!�������������2z��D7���l6+Zk�a�V�ggg9*
$��z&v	�R����������w?��k�[Q/�����d43 ���R��2������-����A�
�B ���]B��6�������������������wk4R*������u�R�V���A A���`b�P���H�e���=�>��p���s}2z���s}S�w+�J277gtWP�&2@R]��.�H|;������3���<��������Q/�{:�/3xZ�
���f��^S\��fbb�����"/���m�6��!�����v��4�a�^�����R�z��t������������?������$3�'��NH���8����|����N���*
��>"������A �����������
S��
��h����������6��u���:F3��<�Ov�cbbBL���aH6!���J�m����
��wEDfgg��Z�0$��U���

}m�C4�A�zWP��@Z� �`�eYR���#/
�F�dI������<yr�0 (����1��S���<o�Z�N����aHv]�V�M��Y(
����H0���
��r���@�JJ���r�h�n�� b_���d�Y��hDE�@Zqd�����v���R����e��jU�������2� �^��Z�^7~tTDDk�044$Z�H�#~����<yr�R�,��!��U*��j��`���#bq��`� �~B$���;�0Q��a����s����A��/*�@��������s����z}�q�����pi�����o��Q�����BD���M��_���B.���Z�F����hH6��l6{!�a�������/�@�`��]
��v>��[�|�������h4b{,t7�Tqii��m��Q��9B^�}���[�<�FC���%.�C���n�^��X��RF �%q�O��eY������r9��������;w���fbB`G�\.V*��]�@���?�f��^�n�m���0�"�����{����f"�������z�����;Q�@t��B���.
���!F��h����$5vp_@���(�J�sss��"C|�?�l6����X~���F �
��y�U:w�]�v���'Q�'�������r_����c�u?(�����}��r����>��[�v�����}Q�%)��������y�$�k|������"
�{��C���\.�qobY�����333�J�[Q�'N<�[�ZO.//��y���&�e�������Y�����}JZ(��m�������u����y�����i����8�z�N��E ��
;,�wgxllL�I����zZk}kyyY������k��p>�gW�8�����:Q)%ccc���LF����<o������U�Zw�������b�V�� �}#pi
�/�m�h��8�#g����#���-��,//O��m�Z�������T�V�-:�3�Z$��#��H��)���e�eY��z�����lY�u��,��O>~����{�'"��v�v8
���Q��B�C�\.���r<��@���.
�B�.����2�C�@@@<��;11q!�s�� �0����O�����@@�����J%��H�L �F��]*��9B���,k|fff8��A  D!�~��],����.]C���@��������S.��Q����n��j�nll���y� ��!����
��-v��m��k��	�B���������*w�L>�/^�zu�u�w�^t������j�	�H��q���k�� ��D�����ju��<�aJ(�:!�#�b�@@4��j�*��� ����09\�-^�z����@@�������266Fc�A  ����_�����ch�eY������q@jH������o5�M�U��q����W�q�i�����a#� �v[�������0��hv�*����zM`����}��l>�s��pl�.:�####��!)�	�����>�8Nqg�o�q�w�
�G  e���x������>���b�����RJ������ �r�����[^^�u��8�S�m[FFFD)����b��@@�}Pk�Hk�����	���ITJ-����={V�R��m���,!x��n�������y�""�?����=��at�������DDd'�-����f���r���b�IEND�B`�