Re: [HACKERS] get_relation_stats_hook()

Simon Riggs <[email protected]> Fri, 26 Sep 2008 15:52:20 +0100
Newsgroups gmane.comp.db.postgresql.devel.patches
Message-ID <[email protected]>
--=-tUvbn5EHTHuZ9RWtZFHf
Content-Type: text/plain
Content-Transfer-Encoding: 7bit


On Wed, 2008-08-06 at 23:38 +0100, Simon Riggs wrote:
> On Wed, 2008-08-06 at 16:37 +0100, Simon Riggs wrote:
> 
> > I'll submit the fully working plugin once we've stabilised the API. It's
> > designed as a contrib module, so it can go in pgfoundry or contrib.
> 
> OK, here's fully working plugin, plus API patch.
> 
> I expect to open a pgfoundry project for the plugin, but will wait for
> the main patch review.
> 
> I've tried the APIs three different ways and this seems cleanest and
> most widely applicable approach. It's possible to add calls in more
> places, but I haven't done this for reasons discussed previously.

New version of Postgres patch, v5. Implements suggested changes.
Ready for review and apply.

New version of stats plugin, v3. Works with v5.
Corrected problems:
* now loads using preload_shared_libraries as well as LOAD
* example test script fix 

-- 
 Simon Riggs           www.2ndQuadrant.com
 PostgreSQL Training, Services and Support

--=-tUvbn5EHTHuZ9RWtZFHf
Content-Disposition: attachment; filename=stat_hooks.v5.patch
Content-Type: text/x-patch; name=stat_hooks.v5.patch; charset=UTF-8
Content-Transfer-Encoding: 7bit

Index: src/backend/utils/adt/selfuncs.c
===================================================================
RCS file: /home/sriggs/pg/REPOSITORY/pgsql/src/backend/utils/adt/selfuncs.c,v
retrieving revision 1.253
diff -c -r1.253 selfuncs.c
*** src/backend/utils/adt/selfuncs.c	25 Aug 2008 22:42:34 -0000	1.253
--- src/backend/utils/adt/selfuncs.c	25 Sep 2008 15:57:58 -0000
***************
*** 118,123 ****
--- 118,126 ----
  #include "utils/selfuncs.h"
  #include "utils/syscache.h"
  
+ /* Hook for plugins to get control when we ask for stats */
+ get_relation_stats_hook_type get_relation_stats_hook = NULL;
+ release_relation_stats_hook_type release_relation_stats_hook = NULL;
  
  static double var_eq_const(VariableStatData *vardata, Oid operator,
  			 Datum constval, bool constisnull,
***************
*** 3996,4005 ****
  		}
  		else if (rte->rtekind == RTE_RELATION)
  		{
! 			vardata->statsTuple = SearchSysCache(STATRELATT,
  												 ObjectIdGetDatum(rte->relid),
  												 Int16GetDatum(var->varattno),
  												 0, 0);
  		}
  		else
  		{
--- 3999,4017 ----
  		}
  		else if (rte->rtekind == RTE_RELATION)
  		{
! 			if (get_relation_stats_hook)
! 				vardata->statsTuple = (*get_relation_stats_hook) 
! 										(rte->relid, 
! 										 var->varattno,
! 										 vardata->freefunc);
! 			if (!vardata->statsTuple)
! 			{
! 				vardata->statsTuple = SearchSysCache(STATRELATT,
  												 ObjectIdGetDatum(rte->relid),
  												 Int16GetDatum(var->varattno),
  												 0, 0);
+ 				vardata->freefunc = ReleaseSysCache;
+ 			}
  		}
  		else
  		{
***************
*** 4116,4125 ****
  							index->indpred == NIL)
  							vardata->isunique = true;
  						/* Has it got stats? */
! 						vardata->statsTuple = SearchSysCache(STATRELATT,
  										   ObjectIdGetDatum(index->indexoid),
! 													  Int16GetDatum(pos + 1),
! 															 0, 0);
  						if (vardata->statsTuple)
  							break;
  					}
--- 4128,4147 ----
  							index->indpred == NIL)
  							vardata->isunique = true;
  						/* Has it got stats? */
! 						if (get_relation_stats_hook)
! 							vardata->statsTuple = (*get_relation_stats_hook) 
! 													(index->indexoid, 
! 													 pos + 1,
! 													 vardata->freefunc);
! 						if (!vardata->statsTuple)
! 						{
! 							vardata->statsTuple = SearchSysCache(STATRELATT,
  										   ObjectIdGetDatum(index->indexoid),
! 													  	 Int16GetDatum(pos + 1),
! 														 0, 0);
! 							vardata->freefunc = ReleaseSysCache;
! 						}
! 
  						if (vardata->statsTuple)
  							break;
  					}
***************
*** 5551,5557 ****
  	double	   *indexCorrelation = (double *) PG_GETARG_POINTER(7);
  	Oid			relid;
  	AttrNumber	colnum;
! 	HeapTuple	tuple;
  	double		numIndexTuples;
  	List	   *indexBoundQuals;
  	int			indexcol;
--- 5573,5580 ----
  	double	   *indexCorrelation = (double *) PG_GETARG_POINTER(7);
  	Oid			relid;
  	AttrNumber	colnum;
! 	HeapTuple	tuple = NULL;
! 	void		(*freefunc) (HeapTuple tuple) = NULL;
  	double		numIndexTuples;
  	List	   *indexBoundQuals;
  	int			indexcol;
***************
*** 5756,5765 ****
  		colnum = 1;
  	}
  
! 	tuple = SearchSysCache(STATRELATT,
! 						   ObjectIdGetDatum(relid),
! 						   Int16GetDatum(colnum),
! 						   0, 0);
  
  	if (HeapTupleIsValid(tuple))
  	{
--- 5779,5795 ----
  		colnum = 1;
  	}
  
! 	if (get_relation_stats_hook)
! 		tuple = (*get_relation_stats_hook) (relid, colnum, freefunc);
! 
! 	if (!tuple)
! 	{
! 		tuple = SearchSysCache(STATRELATT,
! 							ObjectIdGetDatum(relid),
! 							Int16GetDatum(colnum),
! 							0, 0);
! 		freefunc = ReleaseSysCache;
! 	}
  
  	if (HeapTupleIsValid(tuple))
  	{
***************
*** 5800,5806 ****
  
  			free_attstatsslot(InvalidOid, NULL, 0, numbers, nnumbers);
  		}
! 		ReleaseSysCache(tuple);
  	}
  
  	PG_RETURN_VOID();
--- 5830,5837 ----
  
  			free_attstatsslot(InvalidOid, NULL, 0, numbers, nnumbers);
  		}
! 
! 		ReleaseStatsTuple(tuple, freefunc);
  	}
  
  	PG_RETURN_VOID();
Index: src/backend/utils/cache/lsyscache.c
===================================================================
RCS file: /home/sriggs/pg/REPOSITORY/pgsql/src/backend/utils/cache/lsyscache.c,v
retrieving revision 1.159
diff -c -r1.159 lsyscache.c
*** src/backend/utils/cache/lsyscache.c	2 Aug 2008 21:32:00 -0000	1.159
--- src/backend/utils/cache/lsyscache.c	25 Sep 2008 14:16:01 -0000
***************
*** 27,32 ****
--- 27,33 ----
  #include "catalog/pg_proc.h"
  #include "catalog/pg_statistic.h"
  #include "catalog/pg_type.h"
+ #include "optimizer/plancat.h"
  #include "miscadmin.h"
  #include "nodes/makefuncs.h"
  #include "utils/array.h"
***************
*** 35,40 ****
--- 36,43 ----
  #include "utils/lsyscache.h"
  #include "utils/syscache.h"
  
+ /* Hook for plugins to get control in get_attavgwidth() */
+ get_attavgwidth_hook_type get_attavgwidth_hook = NULL;
  
  /*				---------- AMOP CACHES ----------						 */
  
***************
*** 2492,2507 ****
   *
   *	  Given the table and attribute number of a column, get the average
   *	  width of entries in the column.  Return zero if no data available.
   */
  int32
  get_attavgwidth(Oid relid, AttrNumber attnum)
  {
  	HeapTuple	tp;
  
  	tp = SearchSysCache(STATRELATT,
! 						ObjectIdGetDatum(relid),
! 						Int16GetDatum(attnum),
! 						0, 0);
  	if (HeapTupleIsValid(tp))
  	{
  		int32		stawidth = ((Form_pg_statistic) GETSTRUCT(tp))->stawidth;
--- 2495,2524 ----
   *
   *	  Given the table and attribute number of a column, get the average
   *	  width of entries in the column.  Return zero if no data available.
+  *
+  *	  Calling a hook at this point looks somewhat strange, but is required
+  * 	  because the optimizer handles inheritance relations by calling for
+  *	  the avg width later in the planner than get_relation_info_hook().
+  *	  So the APIs and call points of hooks must match the optimizer.
   */
  int32
  get_attavgwidth(Oid relid, AttrNumber attnum)
  {
  	HeapTuple	tp;
+ 	int32		stawidth;
+ 
+ 	if (get_attavgwidth_hook)
+ 	{
+ 		stawidth = (*get_attavgwidth_hook) (relid, attnum);
+ 		if (stawidth > 0)
+ 			return stawidth;
+ 	}
  
  	tp = SearchSysCache(STATRELATT,
! 					ObjectIdGetDatum(relid),
! 					Int16GetDatum(attnum),
! 					0, 0);
! 
  	if (HeapTupleIsValid(tp))
  	{
  		int32		stawidth = ((Form_pg_statistic) GETSTRUCT(tp))->stawidth;
Index: src/include/optimizer/plancat.h
===================================================================
RCS file: /home/sriggs/pg/REPOSITORY/pgsql/src/include/optimizer/plancat.h,v
retrieving revision 1.51
diff -c -r1.51 plancat.h
*** src/include/optimizer/plancat.h	16 Aug 2008 00:01:38 -0000	1.51
--- src/include/optimizer/plancat.h	25 Sep 2008 15:57:06 -0000
***************
*** 14,19 ****
--- 14,20 ----
  #ifndef PLANCAT_H
  #define PLANCAT_H
  
+ #include "access/htup.h"
  #include "nodes/relation.h"
  #include "utils/relcache.h"
  
***************
*** 24,29 ****
--- 25,43 ----
  														 RelOptInfo *rel);
  extern PGDLLIMPORT get_relation_info_hook_type get_relation_info_hook;
  
+ /* Hooks for plugins to get control in lsyscache.c and selfuncs.c */
+ typedef HeapTuple (*get_relation_stats_hook_type) (Oid relid, AttrNumber attnum, 
+ 											void (*freefunc) (HeapTuple tuple));
+ extern PGDLLIMPORT get_relation_stats_hook_type get_relation_stats_hook;
+ 
+ /* must match ReleaseSysCache call signature */
+ typedef void (*release_relation_stats_hook_type) (HeapTuple tuple);
+ extern PGDLLIMPORT release_relation_stats_hook_type release_relation_stats_hook;
+ 
+ typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum);
+ extern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook;
+ 
+ 
  
  extern void get_relation_info(PlannerInfo *root, Oid relationObjectId,
  				  bool inhparent, RelOptInfo *rel);
Index: src/include/utils/selfuncs.h
===================================================================
RCS file: /home/sriggs/pg/REPOSITORY/pgsql/src/include/utils/selfuncs.h,v
retrieving revision 1.46
diff -c -r1.46 selfuncs.h
*** src/include/utils/selfuncs.h	16 Aug 2008 00:01:38 -0000	1.46
--- src/include/utils/selfuncs.h	25 Sep 2008 15:55:05 -0000
***************
*** 74,85 ****
  	Oid			atttype;		/* type to pass to get_attstatsslot */
  	int32		atttypmod;		/* typmod to pass to get_attstatsslot */
  	bool		isunique;		/* true if matched to a unique index */
  } VariableStatData;
  
  #define ReleaseVariableStats(vardata)  \
  	do { \
  		if (HeapTupleIsValid((vardata).statsTuple)) \
! 			ReleaseSysCache((vardata).statsTuple); \
  	} while(0)
  
  
--- 74,102 ----
  	Oid			atttype;		/* type to pass to get_attstatsslot */
  	int32		atttypmod;		/* typmod to pass to get_attstatsslot */
  	bool		isunique;		/* true if matched to a unique index */
+ 	void	(*freefunc) (HeapTuple tuple);	/* funct ptr to free statsTuple */
  } VariableStatData;
  
+ #define ReleaseStatsTuple(tuple, freefunc)  \
+ 	do { \
+ 		if (HeapTupleIsValid(tuple)) \
+ 		{ \
+ 			if (freefunc) \
+ 				freefunc(tuple); \
+ 			else \
+ 				elog(ERROR, "unable to release variable stats correctly"); \
+ 		} \
+ 	} while(0)
+ 
  #define ReleaseVariableStats(vardata)  \
  	do { \
  		if (HeapTupleIsValid((vardata).statsTuple)) \
! 		{ \
! 			if ((vardata).freefunc) \
! 				(vardata).freefunc((vardata).statsTuple); \
! 			else \
! 				elog(ERROR, "unable to release variable stats correctly"); \
! 		} \
  	} while(0)
  
  

--=-tUvbn5EHTHuZ9RWtZFHf
Content-Disposition: attachment; filename=TOM.v3.tar
Content-Type: application/x-tar; name=TOM.v3.tar
Content-Transfer-Encoding: base64

Y29udHJpYi9UT00vAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADAwMDA3NTUAMDAwMTc1MAAwMDAwMTQ0ADAwMDAwMDAwMDAw
ADExMDY3MTcyNjU0ADAxMjQwMwAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHNyaWdn
cwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXNlcnMAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABjb250cmliL1RPTS9nZXRfbWFwcGluZ19mb3Jf
dG9tLnNxbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDc1NQAwMDAxNzUwADAw
MDAxNDQAMDAwMDAwMDEwMDEAMTEwNDE1NTQ3NzMAMDE3MTM0ACAwAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAHVzdGFyICAAc3JpZ2dzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1
c2VycwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0tCi0tIEdldCBt
YXBwaW5nIGZvciBUcmFuc3BvcnRhYmxlIE9wdGltaXplciBNb2RlCi0tCi0t
IHNpbW9uQDJuZHF1YWRyYW50LmNvbQotLQotLSBFZGl0IHRoaXMgdG8gY3Jl
YXRlIGEgY3VzdG9tIG1hcHBpbmcgaWYgcmVxdWlyZWQKLS0gb3IganVzdCBh
ZGQgbWFwcGluZyBkYXRhIHRvIHN1aXQgeW91ciBuZWVkcwoKLS0gTm90ZSB0
aGF0IHdlIGFyZSB1c2luZyBhbiBpbm5lciBqb2luCgpJTlNFUlQgSU5UTyA6
VE9NX1NDSEVNQS50b21fbWFwcGluZwoKU0VMRUNUCiBjLm9pZAoscy5zY2hl
bWFuYW1lCixzLnJlbG5hbWUKCkZST00KIDpUT01fU0NIRU1BLnRvbV9wZ19j
bGFzcyBzCixwZ19jbGFzcyBjCixwZ19uYW1lc3BhY2UgbgoKV0hFUkUKCglz
LnJlbG5hbWUgPSBjLnJlbG5hbWUKQU5EIHMuc2NoZW1hbmFtZSA9IG4ubnNw
bmFtZQpBTkQgYy5yZWxuYW1lc3BhY2UgPSBuLm9pZAo7CgotLQotLSBFbmQg
b2YgZ2V0IG1hcHBpbmcgZm9yIFRyYW5zcG9ydGFibGUgT3B0aW1pemVyIE1v
ZGUKLS0KCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjb250cmliL1RPTS9nZXRfZGF0YV9m
b3JfdG9tLnNxbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDc1NQAwMDAx
NzUwADAwMDAxNDQAMDAwMDAwMDM2NDUAMTEwNDYwMDUxNjYAMDE2NDIyACAw
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHVzdGFyICAAc3JpZ2dzAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAB1c2VycwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0tCi0t
IEdldCBkYXRhIGZvciBUcmFuc3BvcnRhYmxlIE9wdGltaXplciBNb2RlCi0t
Ci0tIHNpbW9uQDJuZHF1YWRyYW50LmNvbQoKLS0gT3V0cHV0IG11c3QgYmUg
YSBzZXQgb2YgZmlsZXMuIFdlIHdhbnQgdGhpcyB0byBydW4gYnkgYW4gdW5w
cml2aWxlZ2VkIHVzZXIsCgpDUkVBVEUgT1IgUkVQTEFDRSBURU1QT1JBUlkg
VklFVyB0b21fZ2V0X3N0YXRzIEFTClNFTEVDVCAKICBuLm5zcG5hbWUgQVMg
c2NoZW1hbmFtZQosIGMucmVsbmFtZSBBUyB0YWJsZW5hbWUKLCBhLmF0dG51
bSBBUyBhdHRudW0KLCBzdGFudWxsZnJhYyBBUyBzMQosIHN0YXdpZHRoIEFT
IHMyCiwgc3RhZGlzdGluY3QgQVMgczMKLCBzdGFraW5kMSBBUyBzNAosIHN0
YWtpbmQyIEFTIHM1Ciwgc3Rha2luZDMgQVMgczYKLCBzdGFraW5kNCBBUyBz
NwosIHN0YW9wMSBBUyBzOAosIHN0YW9wMiBBUyBzOQosIHN0YW9wMyBBUyBz
MTAKLCBzdGFvcDQgQVMgczExCiwgc3RhbnVtYmVyczEgQVMgczEyCiwgc3Rh
bnVtYmVyczIgQVMgczEzCiwgc3RhbnVtYmVyczMgQVMgczE0Ciwgc3RhbnVt
YmVyczQgQVMgczE1Ciwgc3RhdmFsdWVzMTo6dGV4dCBBUyBzMTYKLCBzdGF2
YWx1ZXMyOjp0ZXh0IEFTIHMxNwosIHN0YXZhbHVlczM6OnRleHQgQVMgczE4
Ciwgc3RhdmFsdWVzNDo6dGV4dCBBUyBzMTkKCkZST00KIHBnX3N0YXRpc3Rp
YyBzCixwZ19jbGFzcyBjCixwZ19hdHRyaWJ1dGUgYQoscGdfbmFtZXNwYWNl
IG4KCldIRVJFIGhhc190YWJsZV9wcml2aWxlZ2UoYy5vaWQsICdzZWxlY3Qn
Ojp0ZXh0KQogIEFORCBuLm5zcG5hbWUgbm90IGluICgncGdfY2F0YWxvZycs
ICdpbmZvcm1hdGlvbl9zY2hlbWEnLCAncGdfdG9hc3QnKQogIEFORCBhLmF0
dG5hbWUgbm90IGluICgnY3RpZCcsJ3htaW4nLCd4bWF4JywnY21pbicsJ2Nt
YXgnLCd0YWJsZW9pZCcpCiAgQU5EIGMucmVsbmFtZSBub3QgbGlrZSAndG9t
XyUnCgogIEFORCBjLm9pZCA9IHMuc3RhcmVsaWQKICBBTkQgYS5hdHRudW0g
PSBzLnN0YWF0dG51bQogIEFORCBjLm9pZCA9IGEuYXR0cmVsaWQKICBBTkQg
bi5vaWQgPSBjLnJlbG5hbWVzcGFjZQoKT1JERVIgQlkgbi5uc3BuYW1lCjsK
XGNvcHkgKHNlbGVjdCAqIGZyb20gdG9tX2dldF9zdGF0cykgVE8gJ3RvbV9w
Z19zdGF0aXN0aWMuZGF0YScKCkNSRUFURSBPUiBSRVBMQUNFIFRFTVBPUkFS
WSBWSUVXIHRvbV9nZXRfcGdfY2xhc3MgQVMKU0VMRUNUIAogIG4ubnNwbmFt
ZSBBUyBzY2hlbWFuYW1lCiwgYy5yZWxuYW1lIEFTIHJlbG5hbWUKLCBwZ19y
ZWxhdGlvbl9zaXplKGMub2lkKS84MTkyIEFTIHBhZ2VzCiwgY2FzZQoJLyog
c2VxdWVuY2VzICovIAkKCXdoZW4gYy5yZWxraW5kID0gJ1MnIHRoZW4gMQoJ
ZWxzZSBjYXNlCgkJCS8qIHplcm8gc2l6ZSByZWxhdGlvbiAqLwoJCQl3aGVu
IHBnX3JlbGF0aW9uX3NpemUoYy5vaWQpID0gMCBvciBjLnJlbHBhZ2VzID0g
MCB0aGVuIDAKCQkJCgkJCS8qIG5vcm1hbCBjYXNlICovCgkJCWVsc2UgcGdf
cmVsYXRpb25fc2l6ZShjLm9pZCkvODE5MiAqIChjLnJlbHR1cGxlcy9jLnJl
bHBhZ2VzKQoJCSAgZW5kCgllbmQKRlJPTQogcGdfY2xhc3MgYwoscGdfbmFt
ZXNwYWNlIG4KCldIRVJFIGhhc190YWJsZV9wcml2aWxlZ2UoYy5vaWQsICdz
ZWxlY3QnOjp0ZXh0KQogIEFORCBuLm5zcG5hbWUgbm90IGluICgncGdfY2F0
YWxvZycsICdpbmZvcm1hdGlvbl9zY2hlbWEnLCAncGdfdG9hc3QnKQogIEFO
RCBjLnJlbG5hbWUgbm90IGxpa2UgJ3RvbV8lJwogIEFORCBjLnJlbGtpbmQg
aW4gKCdyJywgJ2knLCAnUycsICd0JykKCiAgQU5EIG4ub2lkID0gYy5yZWxu
YW1lc3BhY2UKCk9SREVSIEJZIG4ubnNwbmFtZQo7Clxjb3B5IChzZWxlY3Qg
KiBmcm9tIHRvbV9nZXRfcGdfY2xhc3MpIFRPICd0b21fcGdfY2xhc3MuZGF0
YScKCi0tCi0tIEVuZCBvZiBnZXQgZGF0YSBmb3IgVHJhbnNwb3J0YWJsZSBP
cHRpbWl6ZXIgTW9kZQotLQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAY29udHJpYi9UT00vdG9tX3Rlc3Quc2guZXhh
bXBsZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA3NTUAMDAwMTc1MAAw
MDAwMTQ0ADAwMDAwMDAyMjUxADExMDY3MTcyMzA0ADAxNjIyMgAgMAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAB1c3RhciAgAHNyaWdncwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
dXNlcnMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIS9iaW4vc2gK
IyAkSWQkCiMKIyBUZXN0IHNjcmlwdCBmb3IgVHJhbnNwb3J0YWJsZSBPcHRp
bWl6ZXIgTW9kZSAoVE9NKQojCiMgQ2hyaXMgQnJvd25lIAkJc2VsZWN0ICdj
YmJyb3duZScgfHwgJ0AnIHx8ICdsaW51eGZpbmFuY2VzLmluZm8nOwojCiNz
b3VyY2Ugfi9kYnMvcGdzcWw4My5zaCBlbnYgICAgIyBBIGNiYnJvd25lLWlz
bSB0byBzZXQgdXAgYWNjZXNzIHRvIG15IGZhdm9yaXRlIERCIGNsdXN0ZXIu
Li4KCiMgVGhlc2UgYWxsIHByb3ZpZGUgb3ZlcnJpZGFibGUgZGVmYXVsdHMK
U09VUkNFREI9JHtTT1VSQ0VEQjotInBvc3RncmVzIn0gICAgICAgICAjIHdo
aWNoIGRhdGFiYXNlIGRvZXMgdGhlIGRhdGEgY29tZSBmcm9tClNPVVJDRVND
SEVNQT0ke1NPVVJDRVNDSEVNQTotInB1YmxpYyJ9ICAgIyB3aGljaCBzY2hl
bWEgaXMgaW4gdXNlIChlLmcuIC0gd2hhdCBzY2hlbWEgdG8gcGdfZHVtcCkK
VEVTVERCPSR7VEVTVERCOi0idG9tdGVzdGRiIn0gICAgICAgICAgICAjIHRh
cmdldCBkYXRhYmFzZSBmb3IgVE9NIHRlc3QKVE9NU0NIRU1BPSR7VE9NU0NI
RU1BOi0idG9tIn0gICAgICAgICAgICAjIHNjaGVtYSB0byB1c2UgZm9yIFRP
TSB0YWJsZXMKCnBzcWwgLWQgJHtTT1VSQ0VEQn0gLWMgImFuYWx5emU7Igpw
c3FsIC1kICR7U09VUkNFREJ9IC1mIGdldF9kYXRhX2Zvcl90b20uc3FsCgoj
IHVubG9hZCB5b3VyIHRhYmxlcyBoZXJlCgpkcm9wZGIgJHtURVNUREJ9CmNy
ZWF0ZWRiICR7VEVTVERCfQpwc3FsIC1kICR7VEVTVERCfSAtYyAiY3JlYXRl
IHNjaGVtYSAke1RPTVNDSEVNQX07IgoKcGdfZHVtcCAtbiAke1NPVVJDRVND
SEVNQX0gLXMgJHtTT1VSQ0VEQn0gfCBwc3FsIC1kICR7VEVTVERCfQoKcHNx
bCAtZCAke1RFU1REQn0gLWYgY3JlYXRlX3RvbV90YWJsZXMuc3FsIC0tc2lu
Z2xlLXRyYW5zYWN0aW9uIC12IFRPTV9TQ0hFTUE9JHtUT01TQ0hFTUF9CnBz
cWwgLWQgJHtURVNUREJ9IC1mIGxvYWRfZGF0YV9mb3JfdG9tLnNxbCAtLXNp
bmdsZS10cmFuc2FjdGlvbiAtdiBUT01fU0NIRU1BPSR7VE9NU0NIRU1BfQoK
IyBsb2FkIHlvdXIgdGFibGVzIGhlcmUKCnBzcWwgLWQgJHtURVNUREJ9IC1m
IGdldF9tYXBwaW5nX2Zvcl90b20uc3FsIC12IFRPTV9TQ0hFTUE9JHtUT01T
Q0hFTUF9CnBzcWwgLWQgJHtURVNUREJ9IC1jICJsb2FkICdcJGxpYmRpci90
b21faG9va3MnOyIKCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjb250
cmliL1RPTS90b21faG9va3MuYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAMDAwMDc1NQAwMDAxNzUwADAwMDAxNDQAMDAwMDAwMjI1MDYAMTEw
NjcxNzE3MDIAMDE0NTUyACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAc3JpZ2dzAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c2VycwAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog
KgogKiB0b21faG9va3MuYwogKgogKgkgIFBvc3RncmVzIHBsYW5uaW5nIGhv
b2tzIGZvciBUcmFuc3BvcnRhYmxlIE9wdGltaXplciBNb2RlCiAqCiAqCSAg
JFBvc3RncmVTUUwkCiAqCiAqIAkgIHNpbW9uQDJuZHF1YWRyYW50LmNvbQog
Ki0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgojaW5jbHVkZSAi
cG9zdGdyZXMuaCIKCiNpbmNsdWRlICJmdW5jYXBpLmgiCiNpbmNsdWRlICJt
aXNjYWRtaW4uaCIKCiNpbmNsdWRlICJhY2Nlc3MvaHR1cC5oIgojaW5jbHVk
ZSAiY2F0YWxvZy9wZ19zdGF0aXN0aWMuaCIKI2luY2x1ZGUgImV4ZWN1dG9y
L3NwaS5oIgojaW5jbHVkZSAib3B0aW1pemVyL3BsYW5jYXQuaCIKI2luY2x1
ZGUgInV0aWxzL2Vsb2cuaCIKI2luY2x1ZGUgInV0aWxzL2J1aWx0aW5zLmgi
CiNpbmNsdWRlICJ1dGlscy9zeXNjYWNoZS5oIgoKUEdfTU9EVUxFX01BR0lD
OwkvKiBUZWxsIHRoZSBzZXJ2ZXIgYWJvdXQgb3VyIGNvbXBpbGUgZW52aXJv
bm1lbnQgKi8KCiNkZWZpbmUgUExBTlNfVU5QTEFOTkVEIAkwCiNkZWZpbmUg
UExBTlNfSU5fUFJPR1JFU1MgCTEKI2RlZmluZSBQTEFOU19SRUFEWSAJCTIK
dHlwZWRlZiBzdHJ1Y3QgdG9tX3BsYW5faW5mbwp7CglpbnQJCQlwbGFuc3Rh
dGU7Cgl2b2lkCSAgICpwbGFuX3RvbV9wZ19jbGFzczsJCS8qIHBsYW4gb2Yg
YWNjZXNzIHRvIHRvbV9wZ19jbGFzcyAqLwoJdm9pZAkgICAqcGxhbl90b21f
cGdfc3RhdGlzdGljOwkvKiBwbGFuIG9mIGFjY2VzcyB0byB0b21fcGdfc3Rh
dGlzdGljICovCglpbnQJCQl0b21fb2lkWzNdOwkJCQkvKiAKCQkJCQkJCQkJ
CSAqIGtlZXAgdHJhY2sgb2Ygb2lkcyBvZiBUT00gdGFibGVzCgkJCQkJCQkJ
CQkgKiBzbyB3ZSBhdm9pZCByZWN1cnNpdmUgY2FsbHMgdG8KCQkJCQkJCQkJ
CSAqIHRoZSBwbHVnaW4gd2hlbiB3ZSBhY2Nlc3MgdGFibGVzIGhlcmUKCQkJ
CQkJCQkJCSAqLwp9IHRvbV9wbGFuX2luZm87CgpzdGF0aWMgdG9tX3BsYW5f
aW5mbyAqdHBpOwoKLyogZXh0ZXJuYWwgY2FsbHMgKi8Kdm9pZCBwbHVnaW5f
Z2V0X3JlbGF0aW9uX2luZm8oUGxhbm5lckluZm8gKnJvb3QsCgkJCQkJCQkJ
T2lkIHJlbGF0aW9uT2JqZWN0SWQsCgkJCQkJCQkJYm9vbCBpbmhwYXJlbnQs
CgkJCQkJCQkJUmVsT3B0SW5mbyAqcmVsKTsKSGVhcFR1cGxlIHBsdWdpbl9n
ZXRfcmVsYXRpb25fc3RhdHMoT2lkIHJlbGlkLCBBdHRyTnVtYmVyIGF0dG51
bSwgCgkJCQkJCQkJCXZvaWQgKCpmcmVlZnVuYykgKEhlYXBUdXBsZSB0dXBs
ZSkpOwp2b2lkIHBsdWdpbl9yZWxlYXNlX3JlbGF0aW9uX3N0YXRzKEhlYXBU
dXBsZSBzdGF0c3R1cCk7CmludDMyIHBsdWdpbl9nZXRfYXR0YXZnd2lkdGgo
T2lkIHJlbGlkLCBBdHRyTnVtYmVyIGF0dG51bSk7CgoKdm9pZCBfUEdfaW5p
dCh2b2lkKTsKCi8qIGludGVybmFsIGNhbGxzICovCnN0YXRpYyB2b2lkIHRv
bV9pbml0KHZvaWQpOwpzdGF0aWMgdm9pZCBnZXRfdG9tX3JlbGF0aW9uX3Np
emUoT2lkIHJlbGlkLCBkb3VibGUgKnR1cGxlcywgQmxvY2tOdW1iZXIgKnBh
Z2VzKTsKc3RhdGljIGJvb2wgZ2V0X3RvbV9zdGF0c190dXBsZXRhYmxlKE9p
ZCByZWxpZCwgQXR0ck51bWJlciBhdHRudW0pOwoKdm9pZApfUEdfaW5pdCh2
b2lkKQp7CglnZXRfcmVsYXRpb25faW5mb19ob29rID0gJnBsdWdpbl9nZXRf
cmVsYXRpb25faW5mbzsKCXJlbGVhc2VfcmVsYXRpb25fc3RhdHNfaG9vayA9
ICZwbHVnaW5fcmVsZWFzZV9yZWxhdGlvbl9zdGF0czsKCWdldF9yZWxhdGlv
bl9zdGF0c19ob29rID0gJnBsdWdpbl9nZXRfcmVsYXRpb25fc3RhdHM7Cgln
ZXRfYXR0YXZnd2lkdGhfaG9vayA9ICZwbHVnaW5fZ2V0X2F0dGF2Z3dpZHRo
Owp9Cgp2b2lkCnRvbV9pbml0KHZvaWQpCnsKCWludAkJCXJjOwoJY2hhcgkJ
cXVlcnlbMTAyNF07CglPaWQJCQlwbGFuX3R5cGVzWzNdOwoKCWlmICh0cGkg
PT0gTlVMTCkKCXsKCQkvKgoJCSAqIE5vIHRwaSBmb3VuZCwgc28gY3JlYXRl
IGl0CgkJICovCgkJdHBpID0gKHRvbV9wbGFuX2luZm8gKikgbWFsbG9jKHNp
emVvZih0b21fcGxhbl9pbmZvKSk7CgkJbWVtc2V0KHRwaSwgMCwgc2l6ZW9m
KHRvbV9wbGFuX2luZm8pKTsKCgkJdHBpLT5wbGFuc3RhdGUgPSBQTEFOU19V
TlBMQU5ORUQ7Cgl9CgoJLyoKCSAqIFByZXBhcmUgYW5kIHNhdmUgdGhlIHBs
YW5zCgkgKi8KCWlmICh0cGktPnBsYW5zdGF0ZSA9PSBQTEFOU19VTlBMQU5O
RUQpCgl7CgkJdHBpLT5wbGFuc3RhdGUgPSBQTEFOU19JTl9QUk9HUkVTUzsK
CgkJaWYgKChyYyA9IFNQSV9jb25uZWN0KCkpIDwgMCkKCQkJZWxvZyhFUlJP
UiwgInRvbTogU1BJX2Nvbm5lY3QoKSBmYWlsZWQgaW4gX1BHX2luaXQiKTsK
CgkJLyoKCQkgKiBJZGVudGlmeSB0aGUgb2lkcyBvZiB0aGUgVE9NIHRhYmxl
cywgc28gd2UgY2FuIGV4Y2x1ZGUgdGhlbQoJCSAqIGZyb20gcHJvY2Vzc2lu
ZyBlbHNld2hlcmUgaW4gdGhlIHBsdWdpbi4gT3RoZXJ3aXNlIHdlCgkJICog
Z2VuZXJhdGUgcmVjdXJzaXZlIGNhbGxzIHdoaWNoIG1ha2UgbGlmZSBkaWZm
aWN1bHQgZm9yIHVzLgoJCSAqLwoJCXNwcmludGYocXVlcnksIAoJCSJTRUxF
Q1QgYy5vaWQgRlJPTSBwZ19jbGFzcyBjIEpPSU4gcGdfbmFtZXNwYWNlIG4i
CgkJIiBPTiBuLm9pZCA9IGMucmVsbmFtZXNwYWNlIgoJCSIgV0hFUkUgbi5u
c3BuYW1lID0gJ3RvbSciCgkJIiBBTkQgYy5yZWxuYW1lIElOICgndG9tX21h
cHBpbmcnLCAndG9tX3BnX2NsYXNzJywgJ3RvbV9wZ19zdGF0aXN0aWMnKSIK
CQkiIExJTUlUIDMiKTsKCgkJcmMgPSBTUElfZXhlYyhxdWVyeSwgMCk7CgoJ
CXRwaS0+dG9tX29pZFswXSA9IERhdHVtR2V0SW50MzIoU1BJX2dldGJpbnZh
bChTUElfdHVwdGFibGUtPnZhbHNbMF0sCgkJCQkJCQkJCVNQSV90dXB0YWJs
ZS0+dHVwZGVzYywgMSwgTlVMTCkpOwoJCXRwaS0+dG9tX29pZFsxXSA9IERh
dHVtR2V0SW50MzIoU1BJX2dldGJpbnZhbChTUElfdHVwdGFibGUtPnZhbHNb
MV0sCgkJCQkJCQkJCVNQSV90dXB0YWJsZS0+dHVwZGVzYywgMSwgTlVMTCkp
OwoJCXRwaS0+dG9tX29pZFsyXSA9IERhdHVtR2V0SW50MzIoU1BJX2dldGJp
bnZhbChTUElfdHVwdGFibGUtPnZhbHNbMl0sCgkJCQkJCQkJCVNQSV90dXB0
YWJsZS0+dHVwZGVzYywgMSwgTlVMTCkpOwoKCQlTUElfZnJlZXR1cHRhYmxl
KFNQSV90dXB0YWJsZSk7CgoJCS8qCgkJICogUGxhbjogR2V0IHN0YXRzIGZv
ciBhIHJlbGF0aW9uLiBTUUwgYXNzdW1lcyB0aGF0IHRoZSBQSyBvZgoJCSAq
IHRvbV9tYXBwaW5nIGlzIGxvY2FsX3JlbGlkIGFuZCB0aGUgUEsgb2YgdG9t
X3BnX2NsYXNzIGlzCgkJICogc2NoZW1hbmFtZSBhbmQgcmVsbmFtZS4KCQkg
Ki8KCQlzcHJpbnRmKHF1ZXJ5LCAKCQkiU0VMRUNUIG51bWJlcl84a2Jsb2Nr
cywgbnVtYmVyX3R1cGxlcyBGUk9NIHRvbS50b21fcGdfY2xhc3MgYyIKCQki
IEpPSU4gdG9tLnRvbV9tYXBwaW5nIG0gIgoJCSIgT04gbS5zY2hlbWFuYW1l
ID0gYy5zY2hlbWFuYW1lIEFORCBtLnJlbG5hbWUgPSBjLnJlbG5hbWUiCgkJ
IiBXSEVSRSBsb2NhbF9yZWxpZCA9ICQxIgoJCSIgTElNSVQgMSIpOwoKCQlw
bGFuX3R5cGVzWzBdID0gSU5UNE9JRDsKCgkJdHBpLT5wbGFuX3RvbV9wZ19j
bGFzcyA9IFNQSV9zYXZlcGxhbihTUElfcHJlcGFyZShxdWVyeSwgMSwgcGxh
bl90eXBlcykpOwoJCWlmICh0cGktPnBsYW5fdG9tX3BnX2NsYXNzID09IE5V
TEwpCgkJCWVsb2coRVJST1IsICJ0b206IFNQSV9wcmVwYXJlKCkgZmFpbGVk
IGZvciBwbGFuX3RvbV9wZ19jbGFzcyIpOwoKCQkvKgoJCSAqIFBsYW46IEdl
dCBzdGF0aXN0aWNzIGZvciBhIGNvbHVtbi4gU1FMIGFzc3VtZXMgdGhhdCB0
aGUgUEsgb2YKCQkgKiB0b21fbWFwcGluZyBpcyBsb2NhbF9yZWxpZCBhbmQg
dGhlIFBLIG9mIHRvbV9wZ19zdGF0aXN0aWMgaXMKCQkgKiBzY2hlbWFuYW1l
LCByZWxuYW1lIGFuZCBhdHRudW0uIE5lc3RlZCBsb29wcyBqb2luIGV4cGVj
dGVkLgoJCSAqLwoJCXNwcmludGYocXVlcnksIAoJCSJTRUxFQ1QgKiBGUk9N
IHRvbS50b21fcGdfc3RhdGlzdGljIHMiCgkJIiBKT0lOIHRvbS50b21fbWFw
cGluZyBtIgoJCSIgT04gbS5zY2hlbWFuYW1lID0gcy5zY2hlbWFuYW1lIEFO
RCBtLnJlbG5hbWUgPSBzLnJlbG5hbWUiCgkJIiBXSEVSRSBtLmxvY2FsX3Jl
bGlkID0gJDEgQU5EIHMuYXR0bnVtID0gJDIiCgkJIiBMSU1JVCAxIik7CgoJ
CXBsYW5fdHlwZXNbMF0gPSBJTlQ0T0lEOwoJCXBsYW5fdHlwZXNbMV0gPSBJ
TlQ0T0lEOwoKCQl0cGktPnBsYW5fdG9tX3BnX3N0YXRpc3RpYyA9IFNQSV9z
YXZlcGxhbihTUElfcHJlcGFyZShxdWVyeSwgMiwgcGxhbl90eXBlcykpOwoJ
CWlmICh0cGktPnBsYW5fdG9tX3BnX3N0YXRpc3RpYyA9PSBOVUxMKQoJCQll
bG9nKEVSUk9SLCAidG9tOiBTUElfcHJlcGFyZSgpIGZhaWxlZCBmb3IgcGxh
bl90b21fcGdfc3RhdGlzdGljIik7CgoJCXRwaS0+cGxhbnN0YXRlID0gUExB
TlNfUkVBRFk7CgoJCVNQSV9maW5pc2goKTsKCX0KfQoKLyoKICogcGx1Z2lu
X2dldF9yZWxhdGlvbl9pbmZvKCkKICoKICogVGhpcyBwbHVnaW4gd29ya3Mg
Ynkgb3ZlcnJpZGluZyBleGlzdGluZyB2YWx1ZXMgc2V0IGJ5IHBsYW5uZXIK
ICogTm8gb3ZlcnJpZGUsIG5vIGFjdGlvbgogKi8Kdm9pZApwbHVnaW5fZ2V0
X3JlbGF0aW9uX2luZm8oUGxhbm5lckluZm8gKnJvb3QsCgkJCQkJCQkJT2lk
IHJlbGF0aW9uT2JqZWN0SWQsCgkJCQkJCQkJYm9vbCBpbmhwYXJlbnQsIAoJ
CQkJCQkJCVJlbE9wdEluZm8gKnJlbCkKewoJdG9tX2luaXQoKTsKCgkvKiAK
CSAqIERvbid0IGxvb2sgZm9yIG92ZXJyaWRlIGluZm8gZm9yIFRPTSB0YWJs
ZXMgdGhlbXNlbHZlcwoJICovCglpZiAocmVsYXRpb25PYmplY3RJZCA9PSB0
cGktPnRvbV9vaWRbMF0gfHwKCQlyZWxhdGlvbk9iamVjdElkID09IHRwaS0+
dG9tX29pZFsxXSB8fAoJCXJlbGF0aW9uT2JqZWN0SWQgPT0gdHBpLT50b21f
b2lkWzJdIHx8CgkJdHBpLT5wbGFuc3RhdGUgIT0gUExBTlNfUkVBRFkpCgkJ
cmV0dXJuOwoKCS8qIAoJICogT3ZlcnJpZGUgdGhlIGFjdHVhbCBzaXplIG9m
IHJlbGF0aW9uIG9uIHRoaXMgc2VydmVyLgoJICogU2V0IHRoZSB0dXBsZXMg
YW5kIHBhZ2VzIHZhbHVlcyBkaXJlY3RseSBmcm9tIHRvbV9wZ19jbGFzcywK
CSAqIHdpdGhvdXQgdHJ5aW5nIHRvIGNhbGN1bGF0ZSB0dXBsZXMgZGVuc2l0
eSBldGMgYXMgd2UgZG8gaW4gdGhlCgkgKiBzdGFuZGFyZCBwbGFubmVyLgoJ
ICovCglnZXRfdG9tX3JlbGF0aW9uX3NpemUocmVsYXRpb25PYmplY3RJZCwg
JnJlbC0+dHVwbGVzLCAmcmVsLT5wYWdlcyk7CgoJLyoKCSAqIEdldCBzaXpl
IGZvciBhbnkgSW5kZXhPcHRJbmZvIG5vZGVzIHByZXNlbnQKCSAqLwoJaWYg
KHJlbC0+aW5kZXhsaXN0KQoJewoJCUxpc3QJICAgKmluZGV4bGlzdDsKCQlM
aXN0Q2VsbCAgICpsOwoKCQlpbmRleGxpc3QgPSByZWwtPmluZGV4bGlzdDsK
CgkJZm9yZWFjaChsLCBpbmRleGxpc3QpCgkJewoJCQlJbmRleE9wdEluZm8g
KmluZm8gPSBsZmlyc3QobCk7CgoJCQkvKiAKCQkJICogT3ZlcnJpZGUgdGhl
IGFjdHVhbCBzaXplIG9mIGluZGV4IG9uIHRoaXMgc2VydmVyLgoJCQkgKiBT
ZXQgdGhlIHR1cGxlcyBhbmQgcGFnZXMgdmFsdWVzIGRpcmVjdGx5IGZyb20g
dG9tX3BnX2NsYXNzCgkJCSAqLwoJCQlnZXRfdG9tX3JlbGF0aW9uX3NpemUo
aW5mby0+aW5kZXhvaWQsICZpbmZvLT50dXBsZXMsICZpbmZvLT5wYWdlcyk7
CgkJfQoJfQp9CgovKgogKiBnZXRfdG9tX3JlbGF0aW9uX3NpemUoKQogKgog
KiBDb252ZW5pZW5jZSByb3V0aW5lIGZvciBwbHVnaW5fZ2V0X3JlbGF0aW9u
X2luZm8oKQogKiBObyBvdmVycmlkZSwgbm8gYWN0aW9uCiAqLwpzdGF0aWMg
dm9pZApnZXRfdG9tX3JlbGF0aW9uX3NpemUoT2lkIHJlbGlkLCBkb3VibGUg
KnR1cGxlcywgQmxvY2tOdW1iZXIgKnBhZ2VzKQp7CglpbnQJCQlyYzsKCURh
dHVtIAkJdG9tX3BnX2NsYXNzX3ZhbHVlc1sxXTsKCglpZiAoKHJjID0gU1BJ
X2Nvbm5lY3QoKSkgPCAwKQoJewoJCWVsb2coTE9HLCAidG9tOiBTUElfY29u
bmVjdCgpIGZhaWxlZCBpbiBnZXRfdG9tX3JlbGF0aW9uX3NpemUoKSIpOwoJ
CXJldHVybjsKCX0KCgl0b21fcGdfY2xhc3NfdmFsdWVzWzBdID0gT2JqZWN0
SWRHZXREYXR1bShyZWxpZCk7CglyYyA9IFNQSV9leGVjcCh0cGktPnBsYW5f
dG9tX3BnX2NsYXNzLCB0b21fcGdfY2xhc3NfdmFsdWVzLCBOVUxMLCAxKTsK
CgkvKgoJICogSWYgd2UgZ2V0IGFuIGVycm9yLCBsb2cgYSBtZXNzYWdlLCBi
dXQgbm8gbmVlZCB0byBmYWlsIGNvbXBsZXRlbHkuCgkgKiBUaGlzIGlzbid0
IHN1cHBvc2VkIHRvIGJlIGEgY3JpdGljYWwgdXRpbGl0eQoJICovCglpZiAo
cmMgIT0gU1BJX09LX1NFTEVDVCkKCXsKCQllbG9nKExPRywgInRvbTogY2Fu
bm90IGdldCB0b21fcGdfY2xhc3MgdHVwbGUgZm9yIHJlbGlkPSVkIChyYz0l
ZCkiLCByZWxpZCwgcmMpOwoJCVNQSV9maW5pc2goKTsKCQlyZXR1cm47Cgl9
CgoJLyoKCSAqIElmIHRoZXJlIGlzIGEgcm93IGluIHRvbV9wZ19jbGFzcyB0
YWJsZSwgYXBwbHkgdmFsdWVzCgkgKi8JCglpZiAoU1BJX3Byb2Nlc3NlZCA9
PSAxKQoJewoJCSpwYWdlcyA9IERhdHVtR2V0SW50MzIoU1BJX2dldGJpbnZh
bChTUElfdHVwdGFibGUtPnZhbHNbMF0sCgkJCQkJCQkJCVNQSV90dXB0YWJs
ZS0+dHVwZGVzYywgMSwgTlVMTCkpOwoJCSp0dXBsZXMgPSAoZG91YmxlKSBE
YXR1bUdldEludDY0KFNQSV9nZXRiaW52YWwoU1BJX3R1cHRhYmxlLT52YWxz
WzBdLAoJCQkJCQkJCQlTUElfdHVwdGFibGUtPnR1cGRlc2MsIDIsIE5VTEwp
KTsKCX0KCglTUElfZnJlZXR1cHRhYmxlKFNQSV90dXB0YWJsZSk7CgoJU1BJ
X2ZpbmlzaCgpOwp9Cgp2b2lkCnBsdWdpbl9yZWxlYXNlX3JlbGF0aW9uX3N0
YXRzKEhlYXBUdXBsZSBzdGF0c3R1cCkKewoJaWYgKEhlYXBUdXBsZUlzVmFs
aWQoc3RhdHN0dXApKQoJCXBmcmVlKHN0YXRzdHVwKTsKfQoKLyoKICogcGx1
Z2luX2dldF9yZWxhdGlvbl9zdGF0cygpCiAqCiAqIFRoaXMgcGx1Z2luIHdv
cmtzIGJ5IHJldHVybmluZyBkaWZmZXJlbnQgc3RhdHMsIGlmIHRoZXkgYXJl
IGF2YWlsYWJsZS4KICogU2V0dGluZyB1cCB0aGUgbWFwcGluZyB0YWJsZSBj
b3JyZWN0bHkgaXMgZXNzZW50aWFsIHRvIG1ha2luZyB0aGlzIHdvcmsuCiAq
LwpIZWFwVHVwbGUgCnBsdWdpbl9nZXRfcmVsYXRpb25fc3RhdHMoT2lkIHJl
bGlkLCBBdHRyTnVtYmVyIGF0dG51bSwgdm9pZCAoKmZyZWVmdW5jKSAoSGVh
cFR1cGxlIHR1cGxlKSkKewoJSGVhcFR1cGxlCXN0YXRzdHVwID0gTlVMTDsK
CglpZiAoIWdldF90b21fc3RhdHNfdHVwbGV0YWJsZShyZWxpZCwgYXR0bnVt
KSkKCQlyZXR1cm4gTlVMTDsKCgkvKgoJICogR2V0IHN0YXRzIGlmIHByZXNl
bnQuIFdlIGFza2VkIGZvciBvbmx5IG9uZSByb3csIHNvIG5vIG5lZWQgZm9y
IGxvb3BzLgoJICovCQoJaWYgKFNQSV9wcm9jZXNzZWQgPiAwKQoJCXN0YXRz
dHVwID0gU1BJX2NvcHl0dXBsZShTUElfdHVwdGFibGUtPnZhbHNbMF0pOwoK
CVNQSV9mcmVldHVwdGFibGUoU1BJX3R1cHRhYmxlKTsKCVNQSV9maW5pc2go
KTsKCgkvKiBkZWZpbmUgZnVuY3Rpb24gdG8gdXNlIHdoZW4gdGltZSB0byBm
cmVlIHRoZSB0dXBsZSAqLwoJZnJlZWZ1bmMgPSBoZWFwX2ZyZWV0dXBsZTsK
CglyZXR1cm4gc3RhdHN0dXA7Cn0KCi8qIAogKiBTaW1pbGFyIHRvIHBsdWdp
bl9nZXRfcmVsYXRpb25fc3RhdHMsIGp1c3QgcmVzdHJpY3RlZCB0byBvbmUg
Y29sdW1uIG9ubHkuCiAqIFdlIHByZXBhcmVkIFNFTEVDVCAqLCBzbyBqdXN0
IHVzZSB0aGF0IHBsYW4gYW5kIHJldHJpZXZlIHRoZSBjb3JyZWN0CiAqIGNv
bHVtbiBmcm9tIHRoZSByZXN1bHRzZXQuCiAqLwppbnQzMiAKcGx1Z2luX2dl
dF9hdHRhdmd3aWR0aChPaWQgcmVsaWQsIEF0dHJOdW1iZXIgYXR0bnVtKQp7
CglpbnQzMgkJc3Rhd2lkdGggPSAwOwoKCWlmICghZ2V0X3RvbV9zdGF0c190
dXBsZXRhYmxlKHJlbGlkLCBhdHRudW0pKQoJCXJldHVybiAwOwoKCS8qCgkg
KiBHZXQgc3RhdHMgaWYgcHJlc2VudC4gV2UgYXNrZWQgZm9yIG9ubHkgb25l
IHJvdywgc28gbm8gbmVlZCBmb3IgbG9vcHMuCgkgKi8JCglpZiAoU1BJX3By
b2Nlc3NlZCA+IDApCgkJc3Rhd2lkdGggPSBEYXR1bUdldEludDMyKFNQSV9n
ZXRiaW52YWwoU1BJX3R1cHRhYmxlLT52YWxzWzBdLAoJCQkJCQkJCQlTUElf
dHVwdGFibGUtPnR1cGRlc2MsIAoJCQkJCQkJCQk1LCAJLyogYXR0bnVtIG9m
IHRvbV9wZ19zdGF0aXN0aWMuc3Rhd2lkdGggKi8KCQkJCQkJCQkJTlVMTCkp
OwkJLyogc3Rhd2lkdGggaXMgTk9UIE5VTEwgKi8KCglTUElfZnJlZXR1cHRh
YmxlKFNQSV90dXB0YWJsZSk7CglTUElfZmluaXNoKCk7CgoJcmV0dXJuIHN0
YXdpZHRoOwp9CgovKgogKiBnZXRfdG9tX3N0YXRzX3R1cGxldGFibGUoKQog
KgogKiBDb21tb24gcm91dGluZSBiZXR3ZWVuIHN0YXRzX2hvb2sgYW5kIGF0
dGF2Z3dpZHRoX2hvb2sKICoKICogUmV0dXJucyB0cnVlIGlmIGEgU1BJIHR1
cGxldGFibGUgZXhpc3RzIHdpdGggcmVzdWx0cyBmb3IgZnVydGhlcgogKiBw
cm9jZXNzaW5nLCBvciBmYWxzZSBpZiBub3RoaW5nIGVsc2UgdG8gZG8KICov
CnN0YXRpYyBib29sCmdldF90b21fc3RhdHNfdHVwbGV0YWJsZShPaWQgcmVs
aWQsIEF0dHJOdW1iZXIgYXR0bnVtKQp7CglEYXR1bSAJCXRvbV9wZ19zdGF0
aXN0aWNfdmFsdWVzWzJdOwoJaW50CQkJcmM7CgoJdG9tX2luaXQoKTsKCgkv
KiAKCSAqIERvbid0IGxvb2sgZm9yIG92ZXJyaWRlIGluZm8gZm9yIFRPTSB0
YWJsZXMgdGhlbXNlbHZlcwoJICovCglpZiAocmVsaWQgPT0gdHBpLT50b21f
b2lkWzBdIHx8CgkJcmVsaWQgPT0gdHBpLT50b21fb2lkWzFdIHx8CgkJcmVs
aWQgPT0gdHBpLT50b21fb2lkWzJdIHx8CgkJdHBpLT5wbGFuc3RhdGUgIT0g
UExBTlNfUkVBRFkpCgkJcmV0dXJuIGZhbHNlOwoKCWlmICgocmMgPSBTUElf
Y29ubmVjdCgpKSA8IDApCgl7CgkJZWxvZyhMT0csICJ0b206IFNQSV9jb25u
ZWN0KCkgZmFpbGVkIGluIGdldF90b21fcmVsYXRpb25fc3RhdHMoKSIpOwoJ
CXJldHVybiBmYWxzZTsKCX0KCgl0b21fcGdfc3RhdGlzdGljX3ZhbHVlc1sw
XSA9IE9iamVjdElkR2V0RGF0dW0ocmVsaWQpOwoJdG9tX3BnX3N0YXRpc3Rp
Y192YWx1ZXNbMV0gPSBJbnQxNkdldERhdHVtKGF0dG51bSk7CglyYyA9IFNQ
SV9leGVjcCh0cGktPnBsYW5fdG9tX3BnX3N0YXRpc3RpYywgdG9tX3BnX3N0
YXRpc3RpY192YWx1ZXMsIE5VTEwsIDEpOwoKCWlmIChyYyAhPSBTUElfT0tf
U0VMRUNUKQoJewoJCWVsb2coTE9HLCAidG9tOiBjYW5ub3QgZ2V0IHRvbV9w
Z19zdGF0aXN0aWMgdHVwbGUgZm9yIHJlbGlkPSVkIChyYz0lZCkiLCByZWxp
ZCwgcmMpOwoJCVNQSV9maW5pc2goKTsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJ
cmV0dXJuIHRydWU7Cn0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAY29udHJpYi9UT00vbG9hZF9kYXRhX2Zv
cl90b20uc3FsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDA3NTUAMDAwMTc1
MAAwMDAwMTQ0ADAwMDAwMDAwNDU0ADExMDQxNTc2NTU0ADAxNjU2NgAgMAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAB1c3RhciAgAHNyaWdncwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAdXNlcnMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtLQotLSBM
b2FkIGRhdGEgZm9yIFRyYW5zcG9ydGFibGUgT3B0aW1pemVyIE1vZGUKLS0K
LS0gc2ltb25AMm5kcXVhZHJhbnQuY29tCgpUUlVOQ0FURSBUT00udG9tX3Bn
X3N0YXRpc3RpYzsKXGNvcHkgdG9tLnRvbV9wZ19zdGF0aXN0aWMgZnJvbSAn
dG9tX3BnX3N0YXRpc3RpYy5kYXRhJwoKVFJVTkNBVEUgVE9NLnRvbV9wZ19j
bGFzczsKXGNvcHkgdG9tLnRvbV9wZ19jbGFzcyBmcm9tICd0b21fcGdfY2xh
c3MuZGF0YScKCi0tCi0tIEVuZCBvZiBnZXQgZGF0YSBmb3IgVHJhbnNwb3J0
YWJsZSBPcHRpbWl6ZXIgTW9kZQotLQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAGNvbnRyaWIvVE9NL2dldF9kYXRhX2Zvcl90b20uc2gAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNzU1ADAwMDE3NTAAMDAwMDE0NAAw
MDAwMDAwMTE0NAAxMTA0NTA2MDYxMQAwMTYyMjAAIDAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0
YXIgIABzcmlnZ3MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzZXJzAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyEvYmluL3NoCiMgJElkJAoj
CiMgRXh0cmFjdCBzY3JpcHQgZm9yIFRyYW5zcG9ydGFibGUgT3B0aW1pemVy
IE1vZGUgKFRPTSkKIwojIENocmlzIEJyb3duZSAJCXNlbGVjdCAnY2Jicm93
bmUnIHx8ICdAJyB8fCAnbGludXhmaW5hbmNlcy5pbmZvJzsKIwojc291cmNl
IH4vZGJzL3Bnc3FsODMuc2ggZW52ICAgICMgQSBjYmJyb3duZS1pc20gdG8g
c2V0IHVwIGFjY2VzcyB0byBteSBmYXZvcml0ZSBEQiBjbHVzdGVyLi4uCgoj
IFRoZXNlIGFsbCBwcm92aWRlIG92ZXJyaWRhYmxlIGRlZmF1bHRzClNPVVJD
RURCPSR7U09VUkNFREI6LSJwb3N0Z3JlcyJ9ICAgICAgICAgIyB3aGljaCBk
YXRhYmFzZSBkb2VzIHRoZSBkYXRhIGNvbWUgZnJvbQpTT1VSQ0VTQ0hFTUE9
JHtTT1VSQ0VTQ0hFTUE6LSJwdWJsaWMifSAgICMgd2hpY2ggc2NoZW1hIGlz
IGluIHVzZSAoZS5nLiAtIHdoYXQgc2NoZW1hIHRvIHBnX2R1bXApCgpwc3Fs
IC1kICR7U09VUkNFREJ9IC1jICJhbmFseXplOyIKcHNxbCAtZCAke1NPVVJD
RURCfSAtZiBnZXRfZGF0YV9mb3JfdG9tLnNxbApwZ19kdW1wIC1uICR7U09V
UkNFU0NIRU1BfSAtcyAke1NPVVJDRURCfSA+ICR7U09VUkNFU0NIRU1BfV9k
dW1wLnNxbAoKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAGNvbnRyaWIvVE9NL1JFQURNRQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwNzU1ADAwMDE3NTAAMDAw
MDE0NAAwMDAwMDAwNTIzMAAxMTA2NzE3MjEyMQAwMTMyNTMAIDAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAdXN0YXIgIABzcmlnZ3MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVz
ZXJzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALS0KLS0gVHJhbnNw
b3J0YWJsZSBPcHRpbWl6ZXIgTW9kZSAoVE9NKSBmb3IgUG9zdGdyZVNRTAot
LQotLSBEZXZlbG9wbWVudCAJc2ltb25AMm5kcXVhZHJhbnQuY29tCi0tIElu
c3RhbGxhdGlvbiBjYmJyb3duZUBhY20ub3JnCi0tCgpUT00gaXMgZGVzaWdu
ZWQgdG8gYWxsb3cgeW91IHRvIHRha2Ugc3RhdGlzdGljcyBmcm9tIG9uZSBk
YXRhYmFzZQpzZXJ2ZXIgdG8gYW5vdGhlciwgZnVsbHkgZW11bGF0aW5nIHRo
ZSBlbnZpcm9ubWVudCBmb3IgU1FMIHBsYW5uaW5nLgoKRXhhbXBsZSB1c2Ug
Y2FzZXMgYXJlCiogY3JlYXRpbmcgYSBkZXZlbG9wbWVudCBzZXJ2ZXIgCiog
cHJvdmlkaW5nIGRldGFpbHMgb2YgYSBwcm9ibGVtIFNRTCBzdGF0ZW1lbnQg
dG8gYSByZW1vdGUgYW5hbHlzdAoKUHJvY2VzcyBpcyBzdHJhaWdodGZvcndh
cmQgaWYgeW91IGFyZSB1c2luZyBzYW1lIHNjaGVtYSBhbmQgdGFibGVuYW1l
cwpvbiBib3RoIGRhdGFiYXNlIHNlcnZlcnMgKHJlY29tbWVuZGVkKS4KCkFj
dGlvbnMgb24gU291cmNlIGRhdGFiYXNlOgo9PT09PT09PT09PT09PT09PT09
PT09PT09PT0KWzAuIEluc3RhbGwgVE9NLCBpZiBub3QgYWxyZWFkeSBpbnN0
YWxsZWRdCgljZCA8cG9zdGdyZXNxbC1zb3VyY2UtdHJlZT4KCXRhciBjdmYg
VE9NLnRhcgoJY2QgY29udHJpYi9UT00KCW1ha2UKCW1ha2UgaW5zdGFsbCAt
IGNvcGllcyAuc28gZmlsZSB0byAkTElCIGRpcmVjdG9yeQoKCU5vIGZ1bmN0
aW9ucyBuZWVkIHRvIGJlIGNyZWF0ZWQKCjEuIFZBQ1VVTSBBTkFMWVpFIGFs
bCByZXF1aXJlZCB0YWJsZXMgCgoJVkFDVVVNIEFOQUxZWkUgW3RhYmxlbmFt
ZV07CgoJVGhpcyBpcyBqdXN0IHRvIG1ha2Ugc3VyZSBzdGF0cyBhcmUgdXAg
dG8gZGF0ZSBiZWZvcmUgd2UgdHJhbnNwb3J0IHRoZW0uCgoyLiBHZXQgc3Rh
dHMgZGF0YSBmb3IgVE9NIAoKCXBzcWwgLWYgZ2V0X2RhdGFfZm9yX3RvbS5z
cWwKCglQcm9kdWNlcyAKCQl0b21fcGdfc3RhdGlzdGljLmRhdGEgCgkJdG9t
X3BnX2NsYXNzLmRhdGEKCglUaGlzIGluY2x1ZGVzIGFsbCBzdGF0cyBmb3Ig
dGFibGVzIHlvdSBoYXZlIGFjY2VzcyB0bywgc28geW91IG1heSB3aXNoCgl0
byBlZGl0IHRoaXMgZG93biBpZiB5b3UgaGF2ZSBzZWN1cml0eSBjb25jZXJu
cy4KCjMuIEdldCB0YWJsZSBtZXRhZGF0YSAoYW5kIHBvc3NpYmx5IGRhdGEs
IG9yIGEgc2FtcGxlIG9mIGl0KQoKCXBnX2R1bXAgWy1zXSAtdCB0YWJsZW5h
bWUgPiB1c2VyX3RhYmxlcy5zcWwKCglJZiB5b3UgaW5jbHVkZSBkYXRhIGFz
IHdlbGwsIHRoZW4gaXQgbWF5IGJlIHBvc3NpYmxlIHRvIHJ1biBhbgoJRVhQ
TEFJTiBBTkFMWVpFIGFzIHdlbGwgYXMgYW4gRVhQTEFJTi4gT2YgY291cnNl
LCBleHRyYWN0aW5nIGEKCXJlcHJlc2VudGF0aXZlIHNhbXBsZSBpcyBkaWZm
aWN1bHQuCgpCZXR3ZWVuIGRhdGFiYXNlczoKPT09PT09PT09PT09PT09PT09
CjQuIFRyYW5zcG9ydCBkYXRhIHRvIHRhcmdldCBzeXN0ZW0KZS5nLiBSRkMg
MTE0OSwgZW1haWwgZXRjCgpBY3Rpb25zIG9uIFRhcmdldCBkYXRhYmFzZToK
PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo1LiBEZXRlcm1pbmUgdGhl
IG5hbWUgb2YgdGhlIGRhdGFiYXNlIGFuZCBzY2hlbWEgeW91IGludGVuZCB0
byB1c2UgZm9yIFRPTQoKCVRPTVNDSEVNQT10b20KCVRFU1REQj10ZXN0dG9t
ZGIKCWV4cG9ydCBUT01TQ0hFTUEgVEVTVERCCgo2LiBDcmVhdGUgdXNlciB0
YWJsZXMgKGFuZCBsb2FkIGRhdGEgZnVsbC9zYW1wbGUgYXMgcmVxdWlyZWQp
CgoJZS5nLgoJY3JlYXRlZGIgJHtURVNUREJ9Cglwc3FsIC1mIHVzZXJfdGFi
bGVzLnNxbCAtZCAke1RFU1REQn0KCjcuIENyZWF0ZSBUT00gdGFibGVzCgoJ
cHNxbCAtYyAiY3JlYXRlIHNjaGVtYSAke1RPTVNDSEVNQX07IiAtZCAke1RF
U1REQn0KCXBzcWwgLWYgY3JlYXRlX3RvbV90YWJsZXMuc3FsIC0tc2luZ2xl
LXRyYW5zYWN0aW9uIC12IFRPTV9TQ0hFTUE9JyR7VE9NU0NIRU1BfScgLWQg
JHtURVNUREJ9Cgo4LiBMb2FkIFRPTSBkYXRhIGludG8gdGFyZ2V0IGRhdGFi
YXNlCgoJZS5nLgoJcHNxbCAtZiBsb2FkX2RhdGFfZm9yX3RvbS5zcWwgLS1z
aW5nbGUtdHJhbnNhY3Rpb24gIC12IFRPTV9TQ0hFTUE9JyR7VE9NU0NIRU1B
fScgLWQgJHtURVNUREJ9Cgo5LiBDcmVhdGUgbWFwcGluZyBiZXR3ZWVuIHRh
cmdldCBjYXRhbG9nIGFuZCBzb3VyY2Ugc3RhdHMKCglwc3FsIC1mIGdldF9t
YXBwaW5nX2Zvcl90b20uc3FsIC12IFRPTV9TQ0hFTUE9JHtUT01TQ0hFTUF9
IC1kICR7VEVTVERCfQoKCVdlIG5lZWQgdG8gYmUgYWJsZSB0byBtYXRjaCB1
cCBvYmplY3RzIGJldHdlZW4gc291cmNlIGFuZCB0YXJnZXQuIFRoaXMKCXNj
cmlwdCBtYXRjaGVzIHVwIG9iamVjdHMgdGhhdCBoYXZlIG1hdGNoaW5nIHNj
aGVtYSBhbmQgdGFibGVuYW1lcy4gSWYKCXlvdSBoYXZlIGEgZGlmZmVyZW50
IG9yIG1vcmUgY29tcGxleCBtYXRjaGluZyBhbGdvcml0aG0sIHJ1biBpdCBu
b3cuCgoxMC4gU2V0dXAgVE9NIHBsdWdpbgoKICAgIEVpdGhlciBzZXQgZm9y
IGFsbCB1c2VycyB2aWEgcG9zdGdyZXNxbC5jb25mCgoJICAgc2hhcmVkX3By
ZWxvYWRfbGlicmFyaWVzID0gJyRsaWJkaXIvdG9tX2hvb2tzJwoKCW9yIHNl
dCBmb3IgaW5kaXZpZHVhbCBzZXNzaW9ucyB1c2luZwoKCSAgTE9BRCAnJGxp
YmRpci90b21faG9va3MnOwoKMTEuIEVYUExBSU4geW91ciBxdWVyaWVzCgoK
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Y29udHJpYi9UT00vY3JlYXRlX3RvbV90YWJsZXMuc3FsAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADAwMDA3NTUAMDAwMTc1MAAwMDAwMTQ0ADAwMDAwMDAzNDM0
ADExMDQ2NDIwNDMyADAxNjU3MgAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHNyaWdn
cwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXNlcnMAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAtLQotLSBUYWJsZXMgZm9yIFRyYW5zcG9ydGFi
bGUgT3B0aW1pemVyIE1vZGUKLS0KLS0gc2ltb25AMm5kcXVhZHJhbnQuY29t
CgpTRVQgc2VhcmNoX3BhdGg9OlRPTV9TQ0hFTUE7ClNFVCBjbGllbnRfbWlu
X21lc3NhZ2VzPUVSUk9SOwoKRFJPUCBUQUJMRSBJRiBFWElTVFMgdG9tX21h
cHBpbmc7CkNSRUFURSBUQUJMRSB0b21fbWFwcGluZyAoCiAgICBsb2NhbF9y
ZWxpZCBvaWQgbm90IG51bGwsCglzY2hlbWFuYW1lIG5hbWUgbm90IG51bGws
CglyZWxuYW1lIG5hbWUgbm90IG51bGwKKTsKCkNPTU1FTlQgb24gVEFCTEUg
dG9tX21hcHBpbmcgSVMgCidNYXBwaW5nIGJldHdlZW4gbG9jYWwgY2F0YWxv
ZyBlbnRyaWVzIGFuZCB0b21fcGdfc3RhdGlzdGljIHRhYmxlJzsKCkFMVEVS
IFRBQkxFIHRvbV9tYXBwaW5nIEFERCBQUklNQVJZIEtFWSAobG9jYWxfcmVs
aWQpOwoKLS0KLS0gVGFibGVzLCBJbmRleGVzCi0tCkRST1AgVEFCTEUgSUYg
RVhJU1RTIHRvbV9wZ19jbGFzczsKQ1JFQVRFIFRBQkxFIHRvbV9wZ19jbGFz
cyAoCglzY2hlbWFuYW1lIG5hbWUgbm90IG51bGwsCglyZWxuYW1lIG5hbWUg
bm90IG51bGwsCgludW1iZXJfOGtibG9ja3MgaW50ZWdlciBub3QgbnVsbCwK
CW51bWJlcl90dXBsZXMgYmlnaW50IG5vdCBudWxsKTsKCkNPTU1FTlQgb24g
VEFCTEUgdG9tX3BnX2NsYXNzIElTIAonTWFwcGluZyBiZXR3ZWVuIGxvY2Fs
IGNhdGFsb2cgZW50cmllcyBhbmQgdG9tX3BnX3N0YXRpc3RpYyB0YWJsZSc7
CgpBTFRFUiBUQUJMRSB0b21fcGdfY2xhc3MgQUREIFBSSU1BUlkgS0VZIChz
Y2hlbWFuYW1lLCByZWxuYW1lKTsKCi0tCi0tIFN0YXRzIGZvciBUYWJsZXMg
b25seSBhdCBwcmVzZW50Ci0tCkRST1AgVEFCTEUgSUYgRVhJU1RTIHRvbV9w
Z19zdGF0aXN0aWM7CkNSRUFURSBUQUJMRSB0b21fcGdfc3RhdGlzdGljICgK
CXNjaGVtYW5hbWUgbmFtZSBub3QgbnVsbCwKCXJlbG5hbWUgbmFtZSBub3Qg
bnVsbCwKCWF0dG51bSBzbWFsbGludCBub3QgbnVsbCwKICAgIHN0YW51bGxm
cmFjIHJlYWwgTk9UIE5VTEwsCiAgICBzdGF3aWR0aCBpbnRlZ2VyIE5PVCBO
VUxMLAkJLyogV2UgZXhwZWN0IHRoaXMgdG8gYmUgY29sdW1uIDUgKi8KICAg
IHN0YWRpc3RpbmN0IHJlYWwgTk9UIE5VTEwsCiAgICBzdGFraW5kMSBzbWFs
bGludCBOT1QgTlVMTCwKICAgIHN0YWtpbmQyIHNtYWxsaW50IE5PVCBOVUxM
LAogICAgc3Rha2luZDMgc21hbGxpbnQgTk9UIE5VTEwsCiAgICBzdGFraW5k
NCBzbWFsbGludCBOT1QgTlVMTCwKICAgIHN0YW9wMSBvaWQgTk9UIE5VTEws
CiAgICBzdGFvcDIgb2lkIE5PVCBOVUxMLAogICAgc3Rhb3AzIG9pZCBOT1Qg
TlVMTCwKICAgIHN0YW9wNCBvaWQgTk9UIE5VTEwsCiAgICBzdGFudW1iZXJz
MSByZWFsW10sCiAgICBzdGFudW1iZXJzMiByZWFsW10sCiAgICBzdGFudW1i
ZXJzMyByZWFsW10sCiAgICBzdGFudW1iZXJzNCByZWFsW10sCiAgICBzdGF2
YWx1ZXMxIHRleHQsCiAgICBzdGF2YWx1ZXMyIHRleHQsCiAgICBzdGF2YWx1
ZXMzIHRleHQsCiAgICBzdGF2YWx1ZXM0IHRleHQKKTsKCkNPTU1FTlQgb24g
VEFCTEUgdG9tX3BnX3N0YXRpc3RpYyBJUyAKJ0V4dGVybmFsIGRhdGEgdGFr
ZW4gZnJvbSByZW1vdGUgcGdfc3RhdGlzdGljIHRhYmxlcyBwbHVzIG9iamVj
dG5hbWVzJzsKCkFMVEVSIFRBQkxFIHRvbV9wZ19zdGF0aXN0aWMgQUREIFBS
SU1BUlkgS0VZICAoc2NoZW1hbmFtZSwgcmVsbmFtZSwgYXR0bnVtKTsKClJF
U0VUIGNsaWVudF9taW5fbWVzc2FnZXM7CgotLQotLSBFbmQgb2YgdGFibGVz
IGZvciBUcmFuc3BvcnRhYmxlIE9wdGltaXplciBNb2RlCi0tCgAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGNvbnRy
aWIvVE9NL01ha2VmaWxlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAwMDAwNzU1ADAwMDE3NTAAMDAwMDE0NAAwMDAwMDAwMDQ0NgAxMTA0
MTU3NTEwNwAwMTQwNDIAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIABzcmlnZ3MAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzZXJzAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAIyAkUG9zdGdyZVNRTCQKCk1PRFVMRVMgPSB0b21faG9v
a3MKT0JKUwk9IHRvbV9ob29rcy5zbwoKaWZkZWYgVVNFX1BHWFMKUEdfQ09O
RklHID0gcGdfY29uZmlnClBHWFMgOj0gJChzaGVsbCAkKFBHX0NPTkZJRykg
LS1wZ3hzKQkKaW5jbHVkZSAkKFBHWFMpCmVsc2UKc3ViZGlyID0gY29udHJp
Yi9UT00KdG9wX2J1aWxkZGlyID0gLi4vLi4KaW5jbHVkZSAkKHRvcF9idWls
ZGRpcikvc3JjL01ha2VmaWxlLmdsb2JhbAppbmNsdWRlICQodG9wX3NyY2Rp
cikvY29udHJpYi9jb250cmliLWdsb2JhbC5tawplbmRpZgoKAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

--=-tUvbn5EHTHuZ9RWtZFHf
Content-Type: text/plain
Content-Disposition: inline
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable


--=20
Sent via pgsql-patches mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-patches

--=-tUvbn5EHTHuZ9RWtZFHf--