/* file: dbg_macros.h */
/*
DBG_L0 exits
DBG_L1 exits + calls
DBG_L2 exits + calls + returns (value)
DBG_L3 exits + calls + returns (address)
DBG_L4 exits + calls + returns (value + address)
DBG_L5 exits + calls + returns + args (value)
DBG_L6 exits + calls + returns + args (address)
DBG_L7 exits + calls + returns + args (value + address)
DBG_L8 exits + calls + returns + args + vars (value)
DBG_L9 exits + calls + returns + args + vars (address)
DBG_LA exits + calls + returns + args + vars (value + address)
*/
#ifndef _DBG_MACROS_H
#define _DBG_MACROS_H 1U
#include <stdio.h>
#include <stdlib.h>
#define __PRINT_HEADING( HEADING_STR, \
SPACE_NUM ) \
printf( "\t" HEADING_STR "%" #SPACE_NUM "s" "file: %s" "\n" \
"\t" " " "%" #SPACE_NUM "s" "function: %s" "\n", \
"", \
__FILE__, \
"", \
__FUNC__ )
#define __PRINT_NAME( SPACE_NUM, \
NAME ) \
printf( "\t" " " "%" #SPACE_NUM "s" "name: " #NAME "\n", \
"" )
#define __PRINT_LINE( SPACE_NUM ) \
printf( "\t" " " "%" #SPACE_NUM "s" "line: %d" "\n", \
"", \
__LINE__ )
#if ( defined( DBG_L0 ) || \
defined( DBG_L1 ) || \
defined( DBG_L2 ) || \
defined( DBG_L4 ) || \
defined( DBG_L5 ) || \
defined( DBG_L7 ) || \
defined( DBG_L8 ) || \
defined( DBG_LA ) )
#define __PRINT_VALUE( SPACE_NUM, \
CONV_SPEC_STR, \
VALUE ) \
printf( "\t" " " "%" #SPACE_NUM "s" "value: %" CONV_SPEC_STR "\n", \
"", \
VALUE )
#else
#define __PRINT_VALUE( SPACE_NUM, \
CONV_SPEC_STR, \
VALUE )
#endif
#if ( defined( DBG_L3 ) || \
defined( DBG_L4 ) || \
defined( DBG_L6 ) || \
defined( DBG_L7 ) || \
defined( DBG_L9 ) || \
defined( DBG_LA ) )
#define __PRINT_ADDRESS( SPACE_NUM, \
ADDRESS ) \
printf( "\t" " " "%" #SPACE_NUM "s" "address: %p" "\n", \
"", \
(void *)ADDRESS )
#else
#define __PRINT_ADDRESS( SPACE_NUM, \
ADDRESS )
#endif
#if ( defined( DBG_L0 ) || \
defined( DBG_L1 ) || \
defined( DBG_L2 ) || \
defined( DBG_L3 ) || \
defined( DBG_L4 ) || \
defined( DBG_L5 ) || \
defined( DBG_L6 ) || \
defined( DBG_L7 ) || \
defined( DBG_L8 ) || \
defined( DBG_L9 ) || \
defined( DBG_LA ) )
#define SET_FUNC_NAME( FUNC ) \
const char *__FUNC__ = #FUNC
#else
#define SET_FUNC_NAME( FUNC )
#endif
#if ( defined( DBG_L1 ) || \
defined( DBG_L2 ) || \
defined( DBG_L3 ) || \
defined( DBG_L4 ) || \
defined( DBG_L5 ) || \
defined( DBG_L6 ) || \
defined( DBG_L7 ) || \
defined( DBG_L8 ) || \
defined( DBG_L9 ) || \
defined( DBG_LA ) )
#define CALL_DUMP() \
__PRINT_HEADING( "[DBG|CALL]", \
1 )
#else
#define CALL_DUMP()
#endif
#if ( defined( DBG_L5 ) || \
defined( DBG_L6 ) || \
defined( DBG_L7 ) || \
defined( DBG_L8 ) || \
defined( DBG_L9 ) || \
defined( DBG_LA ) )
#define ARG_DUMP( ARG, \
CONV_SPEC_STR ) \
do \
{ \
__PRINT_HEADING( "[ DBG|ARG]", \
2 ); \
__PRINT_NAME( 2, \
ARG ); \
__PRINT_VALUE( 2, \
CONV_SPEC_STR, \
ARG ); \
__PRINT_ADDRESS( 2, \
&ARG ); \
} while ( 0 )
#define PTRARG_DUMP( ARG, \
CONV_SPEC_STR ) \
do \
{ \
__PRINT_HEADING( "[ DBG|ARG]", \
2 ); \
__PRINT_NAME( 2, \
ARG ); \
__PRINT_VALUE( 2, \
CONV_SPEC_STR, \
*ARG ); \
__PRINT_ADDRESS( 2, \
ARG ); \
} while ( 0 )
#else
#define ARG_DUMP( ARG, \
CONV_SPEC_STR )
#define PTRARG_DUMP( ARG, \
CONV_SPEC_STR )
#endif
#if ( defined( DBG_L8 ) || \
defined( DBG_L9 ) || \
defined( DBG_LA ) )
#define VAR_DUMP( VAR, \
CONV_SPEC_STR ) \
do \
{ \
__PRINT_HEADING( "[ DBG|VAR]", \
2 ); \
__PRINT_NAME( 2, \
VAR ); \
__PRINT_VALUE( 2, \
CONV_SPEC_STR, \
VAR ); \
__PRINT_ADDRESS( 2, \
&VAR ); \
} while ( 0 )
#define PTRVAR_DUMP( VAR, \
CONV_SPEC_STR ) \
do \
{ \
__PRINT_HEADING( "[ DBG|VAR]", \
2 ); \
__PRINT_NAME( 2, \
VAR ); \
__PRINT_VALUE( 2, \
CONV_SPEC_STR, \
*VAR ); \
__PRINT_ADDRESS( 2, \
VAR ); \
} while ( 0 )
#else
#define VAR_DUMP( VAR, \
CONV_SPEC_STR )
#define PTRVAR_DUMP( VAR, \
CONV_SPEC_STR )
#endif
#if ( defined( DBG_L2 ) || \
defined( DBG_L3 ) || \
defined( DBG_L4 ) || \
defined( DBG_L5 ) || \
defined( DBG_L6 ) || \
defined( DBG_L7 ) || \
defined( DBG_L8 ) || \
defined( DBG_L9 ) || \
defined( DBG_LA ) )
#define RET_DUMP( RET, \
CONV_SPEC_STR ) \
do \
{ \
__PRINT_HEADING( "[DBG|RET ]", \
1 ); \
__PRINT_LINE( 1 ); \
__PRINT_VALUE( 1, \
CONV_SPEC_STR, \
(RET) ); \
__PRINT_ADDRESS( 1, \
&(RET) ); \
\
return RET; \
} while ( 0 )
#define PTRRET_DUMP( RET, \
CONV_SPEC_STR ) \
do \
{ \
__PRINT_HEADING( "[DBG|RET ]", \
1 ); \
__PRINT_LINE( 1 ); \
__PRINT_VALUE( 1, \
CONV_SPEC_STR, \
*(RET) ); \
__PRINT_ADDRESS( 1, \
(RET) ); \
\
return RET; \
} while ( 0 )
#else
#define RET_DUMP( RET, \
CONV_SPEC_STR ) \
return RET
#define PTRRET_DUMP( RET, \
CONV_SPEC_STR ) \
return RET
#endif
#if ( defined( DBG_L0 ) || \
defined( DBG_L1 ) || \
defined( DBG_L2 ) || \
defined( DBG_L3 ) || \
defined( DBG_L4 ) || \
defined( DBG_L5 ) || \
defined( DBG_L6 ) || \
defined( DBG_L7 ) || \
defined( DBG_L8 ) || \
defined( DBG_L9 ) || \
defined( DBG_LA ) )
#define EXIT_DUMP( EXIT ) \
do \
{ \
__PRINT_HEADING( "[DBG|EXIT]", \
1 ); \
__PRINT_LINE( 1 ); \
__PRINT_VALUE( 1, \
"d", \
(EXIT) ); \
\
exit( EXIT ); \
} while ( 0 )
#else
#define EXIT_DUMP( EXIT ) \
exit( EXIT )
#endif
#endif
/* file: test.c */
#define DBG_LA
int operations( int a,
int b,
int * mul )
{
int add;
SET_FUNC_NAME( operations );
CALL_DUMP();
ARG_DUMP( a, "d" );
ARG_DUMP( b, "d" );
PTRARG_DUMP( mul, "d" );
add = a + b;
*mul = a * b;
RET_DUMP( add, "d" );
}
int main( void )
{
int a;
int b;
int add;
int mul;
SET_FUNC_NAME( main );
CALL_DUMP();
a = 3;
b = 2;
add = 0;
mul = 0;
add = operations( a,
b,
&mul );
EXIT_DUMP( 0 );
}
LyogZmlsZTogZGJnX21hY3Jvcy5oICovCi8qCkRCR19MMCAgIGV4aXRzCkRCR19MMSAgIGV4aXRzICsgY2FsbHMKREJHX0wyICAgZXhpdHMgKyBjYWxscyArIHJldHVybnMgICAgICAgICAgICAgICAodmFsdWUpCkRCR19MMyAgIGV4aXRzICsgY2FsbHMgKyByZXR1cm5zICAgICAgICAgICAgICAgKGFkZHJlc3MpCkRCR19MNCAgIGV4aXRzICsgY2FsbHMgKyByZXR1cm5zICAgICAgICAgICAgICAgKHZhbHVlICsgYWRkcmVzcykKREJHX0w1ICAgZXhpdHMgKyBjYWxscyArIHJldHVybnMgKyBhcmdzICAgICAgICAodmFsdWUpCkRCR19MNiAgIGV4aXRzICsgY2FsbHMgKyByZXR1cm5zICsgYXJncyAgICAgICAgKGFkZHJlc3MpCkRCR19MNyAgIGV4aXRzICsgY2FsbHMgKyByZXR1cm5zICsgYXJncyAgICAgICAgKHZhbHVlICsgYWRkcmVzcykKREJHX0w4ICAgZXhpdHMgKyBjYWxscyArIHJldHVybnMgKyBhcmdzICsgdmFycyAodmFsdWUpCkRCR19MOSAgIGV4aXRzICsgY2FsbHMgKyByZXR1cm5zICsgYXJncyArIHZhcnMgKGFkZHJlc3MpCkRCR19MQSAgIGV4aXRzICsgY2FsbHMgKyByZXR1cm5zICsgYXJncyArIHZhcnMgKHZhbHVlICsgYWRkcmVzcykKKi8KCgoKI2lmbmRlZiBfREJHX01BQ1JPU19ICiAgICAjZGVmaW5lIF9EQkdfTUFDUk9TX0ggMVUKIAogICAgI2luY2x1ZGUgPHN0ZGlvLmg+CiAgICAjaW5jbHVkZSA8c3RkbGliLmg+CiAKIAogCiAgICAgICAgI2RlZmluZSBfX1BSSU5UX0hFQURJTkcoIEhFQURJTkdfU1RSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBQ0VfTlVNICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgIHByaW50ZiggIlx0IiBIRUFESU5HX1NUUiAgIiUiICNTUEFDRV9OVU0gInMiICJmaWxlOiAgICAgICVzIiAgICAgICAgICAgICAgICJcbiIgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHQiICIgICAgICAgICAgIiAiJSIgI1NQQUNFX05VTSAicyIgImZ1bmN0aW9uOiAgJXMiICAgICAgICAgICAgICAgIlxuIiwgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ19fICkKIAogICAgICAgICNkZWZpbmUgX19QUklOVF9OQU1FKCBTUEFDRV9OVU0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BTUUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBwcmludGYoICJcdCIgIiAgICAgICAgICAiICIlIiAjU1BBQ0VfTlVNICJzIiAibmFtZTogICAgICAiICAgI05BTUUgICAgICAgICAiXG4iLCAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIgKQogCiAgICAgICAgI2RlZmluZSBfX1BSSU5UX0xJTkUoIFNQQUNFX05VTSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBwcmludGYoICJcdCIgIiAgICAgICAgICAiICIlIiAjU1BBQ0VfTlVNICJzIiAibGluZTogICAgICAlZCIgICAgICAgICAgICAgICAiXG4iLCAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXyApCgogICAgICAgICNpZiAoIGRlZmluZWQoIERCR19MMCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0wxICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDIgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MNCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0w1ICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDcgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MOCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0xBICkgKQogICAgICAgICAgICAjZGVmaW5lIF9fUFJJTlRfVkFMVUUoIFNQQUNFX05VTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVl9TUEVDX1NUUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoICJcdCIgIiAgICAgICAgICAiICIlIiAjU1BBQ0VfTlVNICJzIiAidmFsdWU6ICAgICAlIiAgQ09OVl9TUEVDX1NUUiAiXG4iLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSApCiAgICAgICAgI2Vsc2UKICAgICAgICAgICAgI2RlZmluZSBfX1BSSU5UX1ZBTFVFKCBTUEFDRV9OVU0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlZfU1BFQ19TVFIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUUgKQogICAgICAgICNlbmRpZgoKICAgICAgICAjaWYgKCBkZWZpbmVkKCBEQkdfTDMgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MNCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0w2ICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDcgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MOSApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0xBICkgKQogICAgICAgICAgICAjZGVmaW5lIF9fUFJJTlRfQUREUkVTUyggU1BBQ0VfTlVNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRERSRVNTICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCAiXHQiICIgICAgICAgICAgIiAiJSIgI1NQQUNFX05VTSAicyIgImFkZHJlc3M6ICAgJXAiICAgICAgICAgICAgICAgIlxuIiwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilBRERSRVNTICkKICAgICAgICAjZWxzZQogICAgICAgICAgICAjZGVmaW5lIF9fUFJJTlRfQUREUkVTUyggU1BBQ0VfTlVNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRERSRVNTICkKICAgICAgICAjZW5kaWYKIAogICAgICAgICNpZiAoIGRlZmluZWQoIERCR19MMCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0wxICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDIgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MMyApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0w0ICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDUgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MNiApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0w3ICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDggKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MOSApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0xBICkgKQogICAgICAgICAgICAjZGVmaW5lIFNFVF9GVU5DX05BTUUoIEZVTkMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKl9fRlVOQ19fID0gI0ZVTkMKICAgICAgICAjZWxzZQogICAgICAgICAgICAjZGVmaW5lIFNFVF9GVU5DX05BTUUoIEZVTkMgKQogICAgICAgICNlbmRpZgogCiAgICAgICAgI2lmICggZGVmaW5lZCggREJHX0wxICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDIgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MMyApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0w0ICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDUgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MNiApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0w3ICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDggKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MOSApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0xBICkgKQogICAgICAgICAgICAjZGVmaW5lIENBTExfRFVNUCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIF9fUFJJTlRfSEVBRElORyggIltEQkd8Q0FMTF0iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICkKICAgICAgICAjZWxzZQogICAgICAgICAgICAjZGVmaW5lIENBTExfRFVNUCgpCiAgICAgICAgI2VuZGlmCgogICAgICAgICNpZiAoIGRlZmluZWQoIERCR19MNSApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0w2ICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDcgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MOCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0w5ICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTEEgKSApCiAgICAgICAgICAgICNkZWZpbmUgQVJHX0RVTVAoIEFSRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVl9TUEVDX1NUUiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fUFJJTlRfSEVBRElORyggIlsgREJHfEFSR10iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSSU5UX05BTUUoIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJHICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUklOVF9WQUxVRSggMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05WX1NQRUNfU1RSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSRyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUklOVF9BRERSRVNTKCAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBUkcgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIDAgKQogCiAgICAgICAgICAgICNkZWZpbmUgUFRSQVJHX0RVTVAoIEFSRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVl9TUEVDX1NUUiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fUFJJTlRfSEVBRElORyggIlsgREJHfEFSR10iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSSU5UX05BTUUoIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJHICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUklOVF9WQUxVRSggMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05WX1NQRUNfU1RSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpBUkcgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUklOVF9BRERSRVNTKCAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSRyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIDAgKQogICAgICAgICNlbHNlCiAgICAgICAgICAgICNkZWZpbmUgQVJHX0RVTVAoIEFSRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVl9TUEVDX1NUUiApCiAKICAgICAgICAgICAgI2RlZmluZSBQVFJBUkdfRFVNUCggQVJHLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05WX1NQRUNfU1RSICkKICAgICAgICAjZW5kaWYKCiAgICAgICAgI2lmICggZGVmaW5lZCggREJHX0w4ICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDkgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MQSApICkKICAgICAgICAgICAgI2RlZmluZSBWQVJfRFVNUCggVkFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05WX1NQRUNfU1RSICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUklOVF9IRUFESU5HKCAiWyBEQkd8VkFSXSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fUFJJTlRfTkFNRSggMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVIgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSSU5UX1ZBTFVFKCAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlZfU1BFQ19TVFIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSSU5UX0FERFJFU1MoIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlZBUiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICggMCApCiAKICAgICAgICAgICAgI2RlZmluZSBQVFJWQVJfRFVNUCggVkFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05WX1NQRUNfU1RSICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUklOVF9IRUFESU5HKCAiWyBEQkd8VkFSXSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fUFJJTlRfTkFNRSggMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVIgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSSU5UX1ZBTFVFKCAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlZfU1BFQ19TVFIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlZBUiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSSU5UX0FERFJFU1MoIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICggMCApCiAgICAgICAgI2Vsc2UKICAgICAgICAgICAgI2RlZmluZSBWQVJfRFVNUCggVkFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05WX1NQRUNfU1RSICkKIAogICAgICAgICAgICAjZGVmaW5lIFBUUlZBUl9EVU1QKCBWQVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlZfU1BFQ19TVFIgKQogICAgICAgICNlbmRpZgogCiAgICAgICAgI2lmICggZGVmaW5lZCggREJHX0wyICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDMgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MNCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0w1ICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDYgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MNyApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0w4ICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDkgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MQSApICkKICAgICAgICAgICAgI2RlZmluZSBSRVRfRFVNUCggUkVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05WX1NQRUNfU1RSICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUklOVF9IRUFESU5HKCAiW0RCR3xSRVQgXSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fUFJJTlRfTElORSggMSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUklOVF9WQUxVRSggMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05WX1NQRUNfU1RSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRVQpICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUklOVF9BRERSRVNTKCAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoUkVUKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJFVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKCAwICkKIAogICAgICAgICAgICAjZGVmaW5lIFBUUlJFVF9EVU1QKCBSRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlZfU1BFQ19TVFIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSSU5UX0hFQURJTkcoICJbREJHfFJFVCBdIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUklOVF9MSU5FKCAxICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSSU5UX1ZBTFVFKCAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlZfU1BFQ19TVFIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihSRVQpICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX1BSSU5UX0FERFJFU1MoIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJFVCkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUkVUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIDAgKQogICAgICAgICNlbHNlCiAgICAgICAgICAgICNkZWZpbmUgUkVUX0RVTVAoIFJFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVl9TUEVDX1NUUiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUkVUCiAKICAgICAgICAgICAgI2RlZmluZSBQVFJSRVRfRFVNUCggUkVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05WX1NQRUNfU1RSICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSRVQKICAgICAgICAjZW5kaWYKIAogICAgICAgICNpZiAoIGRlZmluZWQoIERCR19MMCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0wxICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDIgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MMyApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0w0ICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDUgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MNiApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0w3ICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICBkZWZpbmVkKCBEQkdfTDggKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIGRlZmluZWQoIERCR19MOSApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgZGVmaW5lZCggREJHX0xBICkgKQogICAgICAgICAgICAjZGVmaW5lIEVYSVRfRFVNUCggRVhJVCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUklOVF9IRUFESU5HKCAiW0RCR3xFWElUXSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fUFJJTlRfTElORSggMSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUklOVF9WQUxVRSggMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFWElUKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KCBFWElUICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIDAgKQogICAgICAgICNlbHNlCiAgICAgICAgICAgICNkZWZpbmUgRVhJVF9EVU1QKCBFWElUICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCggRVhJVCApCiAgICAgICAgI2VuZGlmCiAKI2VuZGlmCiAKIAogCi8qIGZpbGU6IHRlc3QuYyAqLwojZGVmaW5lIERCR19MQQoKCgppbnQgb3BlcmF0aW9ucyggaW50ICAgYSwgCiAgICAgICAgICAgICAgICBpbnQgICBiLCAKICAgICAgICAgICAgICAgIGludCAqIG11bCApCnsKICAgIGludCBhZGQ7CiAKIAogICAgU0VUX0ZVTkNfTkFNRSggb3BlcmF0aW9ucyApOwogICAgQ0FMTF9EVU1QKCk7CiAgICBBUkdfRFVNUCggYSwgImQiICk7CiAgICBBUkdfRFVNUCggYiwgImQiICk7CiAgICBQVFJBUkdfRFVNUCggbXVsLCAiZCIgKTsKIAogICAgYWRkID0gYSArIGI7CiAgICAqbXVsID0gYSAqIGI7CiAKIAogICAgUkVUX0RVTVAoIGFkZCwgImQiICk7Cn0KIAogCiAKaW50IG1haW4oIHZvaWQgKQp7CiAgICBpbnQgYTsKICAgIGludCBiOwogICAgaW50IGFkZDsKICAgIGludCBtdWw7CiAKIAogICAgU0VUX0ZVTkNfTkFNRSggbWFpbiApOwogICAgQ0FMTF9EVU1QKCk7CiAKICAgIGEgPSAzOwogICAgYiA9IDI7CiAgICBhZGQgPSAwOwogICAgbXVsID0gMDsKICAgIGFkZCA9IG9wZXJhdGlvbnMoICBhLCAKICAgICAgICAgICAgICAgICAgIGIsIAogICAgICAgICAgICAgICAgICAmbXVsICk7CiAKIAogICAgRVhJVF9EVU1QKCAwICk7Cn0K