//********************************************************
//
// Assignment 10 - Linked Lists, Typedef, and Macros
//
// Name: John Semenuk
//
// Class: C Programming, <replace with Semester and Year>
//
// Date: April 17, 2026
//
// Description: Program which determines overtime and
// gross pay for a set of employees with outputs sent
// to standard output (the screen).
//
// This assignment also adds the employee name, their tax state,
// and calculates the state tax, federal tax, and net pay. It
// also calculates totals, averages, minimum, and maximum values.
//
// Array and Structure references have all been replaced with
// pointer references to speed up the processing of this code.
// A linked list has been created and deployed to dynamically
// allocate and process employees as needed.
//
// It will also take advantage of the C Preprocessor features,
// in particular with using macros, and will replace all
// struct type references in the code with a typedef alias
// reference.
//
// Call by Reference design (using pointers)
//
//********************************************************
// necessary header files
#include <stdio.h>
#include <string.h>
#include <ctype.h> // for char functions
#include <stdlib.h> // for malloc
// define constants
#define STD_HOURS 40.0
#define OT_RATE 1.5
#define MA_TAX_RATE 0.05
#define NH_TAX_RATE 0.0
#define VT_TAX_RATE 0.06
#define CA_TAX_RATE 0.07
#define DEFAULT_STATE_TAX_RATE 0.08
#define NAME_SIZE 20
#define TAX_STATE_SIZE 3
#define FED_TAX_RATE 0.25
#define FIRST_NAME_SIZE 10
#define LAST_NAME_SIZE 10
// define macros
#define CALC_OT_HOURS(h) ((h > STD_HOURS) ? (h - STD_HOURS) : 0)
#define CALC_STATE_TAX(p,r) ((p)*(r))
#define CALC_FED_TAX(p) ((p)*FED_TAX_RATE)
#define CALC_NET_PAY(p,s,f) ((p)-((s)+(f)))
#define CALC_NORMAL_PAY(w,h,ot) ((w)*((h)-(ot)))
#define CALC_OT_PAY(w,ot) ((ot)*(OT_RATE*(w)))
#define CALC_MIN(v,m) ((v)<(m)?(v):(m))
#define CALC_MAX(v,m) ((v)>(m)?(v):(m))
// Define a global structure type to store an employee name
// ... note how one could easily extend this to other parts
// parts of a name: Middle, Nickname, Prefix, Suffix, etc.
struct name {
char firstName[ FIRST_NAME_SIZE] ;
char lastName[ LAST_NAME_SIZE] ;
} ;
// Define a global structure type to pass employee data between functions
// Note that the structure type is global, but you don't want a variable
// of that type to be global. Best to declare a variable of that type
// in a function like main or another function and pass as needed.
// Note the "next" member has been added as a pointer to structure employee.
// This allows us to point to another data item of this same type,
// allowing us to set up and traverse through all the linked
// list nodes, with each node containing the employee information below.
// Also note the use of typedef to create an alias for struct employee
typedef struct employee {
struct name empName;
char taxState[ TAX_STATE_SIZE] ;
long int clockNumber;
float wageRate;
float hours;
float overtimeHrs;
float grossPay;
float stateTax;
float fedTax;
float netPay;
struct employee * next;
} EMPLOYEE;
// This structure type defines the totals of all floating point items
// so they can be totaled and used also to calculate averages
// Also note the use of typedef to create an alias for struct totals
typedef struct totals {
float total_wageRate;
float total_hours;
float total_overtimeHrs;
float total_grossPay;
float total_stateTax;
float total_fedTax;
float total_netPay;
} TOTALS;
// This structure type defines the min and max values of all floating
// point items so they can be display in our final report
// Also note the use of typedef to create an alias for struct min_max
typedef struct min_max {
float min_wageRate, min_hours, min_overtimeHrs, min_grossPay, min_stateTax, min_fedTax, min_netPay;
float max_wageRate, max_hours, max_overtimeHrs, max_grossPay, max_stateTax, max_fedTax, max_netPay;
} MIN_MAX;
// Define prototypes here for each function except main
//
// Note the use of the typedef alias values throughout
// the rest of this program, starting with the fucntions
// prototypes
//
// EMPLOYEE instead of struct employee
// TOTALS instead of struct totals
// MIN_MAX instead of struct min_max
// prototypes
EMPLOYEE * getEmpData( void ) ;
int isEmployeeSize( EMPLOYEE * head_ptr) ;
void calcOvertimeHrs( EMPLOYEE * head_ptr) ;
void calcGrossPay( EMPLOYEE * head_ptr) ;
void calcStateTax( EMPLOYEE * head_ptr) ;
void calcFedTax( EMPLOYEE * head_ptr) ;
void calcNetPay( EMPLOYEE * head_ptr) ;
void calcEmployeeTotals( EMPLOYEE * head_ptr, TOTALS * t) ;
void calcEmployeeMinMax( EMPLOYEE * head_ptr, MIN_MAX * m) ;
void printHeader( void ) ;
void printEmp( EMPLOYEE * head_ptr) ;
void printEmpStatistics( TOTALS * t, MIN_MAX * m, int size) ;
// MAIN
int main( )
{
// ******************************************************************
// Set up head pointer in the main function to point to the
// start of the dynamically allocated linked list nodes that will be
// created and stored in the Heap area.
// ******************************************************************
EMPLOYEE * head_ptr; // always points to first linked list node
int size; // number of employees processed
// set up structure to store totals and initialize all to zero
TOTALS totals = { 0 , 0 , 0 , 0 , 0 , 0 , 0 } ;
MIN_MAX mm = { 0 } ;
head_ptr = getEmpData( ) ;
size = isEmployeeSize( head_ptr) ;
if ( size <= 0 )
{
printf ( "\n **** No employees ****\n " ) ; return 0 ;
}
calcOvertimeHrs( head_ptr) ;
calcGrossPay( head_ptr) ;
calcStateTax( head_ptr) ;
calcFedTax( head_ptr) ;
calcNetPay( head_ptr) ;
calcEmployeeTotals( head_ptr, & totals) ;
calcEmployeeMinMax( head_ptr, & mm) ;
printHeader( ) ;
printEmp( head_ptr) ;
printEmpStatistics( & totals, & mm, size) ;
printf ( "\n \n *** End of Program *** \n " ) ; return 0 ;
}
// ================= INPUT =================
EMPLOYEE * getEmpData( void )
{
EMPLOYEE * head, * cur;
char ans[ 10 ] ;
int more = 1 ;
head
= malloc ( sizeof ( EMPLOYEE
) ) ; cur = head;
while ( more)
{
scanf ( "%s" , cur
-> empName.
firstName ) ;
scanf ( "%s" , cur
-> empName.
lastName ) ;
scanf ( "%s" , cur
-> taxState
) ;
scanf ( "%li" , & cur
-> clockNumber
) ;
scanf ( "%f" , & cur
-> wageRate
) ;
scanf ( "%f" , & cur
-> hours
) ;
{
cur-> next = NULL;
more = 0 ;
}
else
{
cur
-> next
= malloc ( sizeof ( EMPLOYEE
) ) ; cur = cur-> next;
}
}
return head;
}
// ================= SIZE =================
int isEmployeeSize( EMPLOYEE * h)
{
int c = 0 ;
for ( ; h; h = h-> next) c++;
return c;
}
// ================= HEADER =================
void printHeader( void )
{
printf ( "\n \n *** Pay Calculator ***\n \n " ) ; printf ( "---------------------------------------------------------------------------------\n " ) ; printf ( "Name Tax Clock# Wage Hours OT Gross State Fed Net\n " ) ; printf ( " State Pay Tax Tax Pay\n " ) ; printf ( "---------------------------------------------------------------------------------\n " ) ; }
// ================= PRINT EMP =================
void printEmp( EMPLOYEE * h)
{
char name[ 30 ] ;
for ( ; h; h = h-> next)
{
strcpy ( name
, h
-> empName.
firstName ) ; strcat ( name
, h
-> empName.
lastName ) ;
printf ( "\n %-20.20s %-2s %06li %5.2f %5.1f %4.1f %7.2f %6.2f %7.2f %7.2f" , name,
h-> taxState,
h-> clockNumber,
h-> wageRate,
h-> hours,
h-> overtimeHrs,
h-> grossPay,
h-> stateTax,
h-> fedTax,
h-> netPay) ;
}
}
// ================= CALCULATIONS =================
void calcOvertimeHrs( EMPLOYEE * h)
{
for ( ; h; h = h-> next)
h-> overtimeHrs = CALC_OT_HOURS( h-> hours) ;
}
void calcGrossPay( EMPLOYEE * h)
{
for ( ; h; h = h-> next)
h-> grossPay = CALC_NORMAL_PAY( h-> wageRate, h-> hours, h-> overtimeHrs)
+ CALC_OT_PAY( h-> wageRate, h-> overtimeHrs) ;
}
void calcStateTax( EMPLOYEE * h)
{
for ( ; h; h = h-> next)
{
if ( ! strcmp ( h
-> taxState
, "MA" ) ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, MA_TAX_RATE) ;
else if ( ! strcmp ( h
-> taxState
, "NH" ) ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, NH_TAX_RATE) ;
else if ( ! strcmp ( h
-> taxState
, "VT" ) ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, VT_TAX_RATE) ;
else if ( ! strcmp ( h
-> taxState
, "CA" ) ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, CA_TAX_RATE) ;
else
h-> stateTax = CALC_STATE_TAX( h-> grossPay, DEFAULT_STATE_TAX_RATE) ;
}
}
void calcFedTax( EMPLOYEE * h)
{
for ( ; h; h = h-> next)
h-> fedTax = CALC_FED_TAX( h-> grossPay) ;
}
void calcNetPay( EMPLOYEE * h)
{
for ( ; h; h = h-> next)
h-> netPay = CALC_NET_PAY( h-> grossPay, h-> stateTax, h-> fedTax) ;
}
// ================= TOTALS =================
void calcEmployeeTotals( EMPLOYEE * h, TOTALS * t)
{
for ( ; h; h = h-> next)
{
t-> total_wageRate += h-> wageRate;
t-> total_hours += h-> hours;
t-> total_overtimeHrs += h-> overtimeHrs;
t-> total_grossPay += h-> grossPay;
t-> total_stateTax += h-> stateTax;
t-> total_fedTax += h-> fedTax;
t-> total_netPay += h-> netPay;
}
}
// ================= MIN MAX =================
void calcEmployeeMinMax( EMPLOYEE * h, MIN_MAX * m)
{
EMPLOYEE * c = h;
m-> min_wageRate = m-> max_wageRate = c-> wageRate;
m-> min_hours = m-> max_hours = c-> hours;
m-> min_overtimeHrs = m-> max_overtimeHrs = c-> overtimeHrs;
m-> min_grossPay = m-> max_grossPay = c-> grossPay;
m-> min_stateTax = m-> max_stateTax = c-> stateTax;
m-> min_fedTax = m-> max_fedTax = c-> fedTax;
m-> min_netPay = m-> max_netPay = c-> netPay;
for ( c = c-> next; c; c = c-> next)
{
m-> min_wageRate = CALC_MIN( c-> wageRate, m-> min_wageRate) ;
m-> max_wageRate = CALC_MAX( c-> wageRate, m-> max_wageRate) ;
m-> min_hours = CALC_MIN( c-> hours, m-> min_hours) ;
m-> max_hours = CALC_MAX( c-> hours, m-> max_hours) ;
m-> min_overtimeHrs = CALC_MIN( c-> overtimeHrs, m-> min_overtimeHrs) ;
m-> max_overtimeHrs = CALC_MAX( c-> overtimeHrs, m-> max_overtimeHrs) ;
m-> min_grossPay = CALC_MIN( c-> grossPay, m-> min_grossPay) ;
m-> max_grossPay = CALC_MAX( c-> grossPay, m-> max_grossPay) ;
m-> min_stateTax = CALC_MIN( c-> stateTax, m-> min_stateTax) ;
m-> max_stateTax = CALC_MAX( c-> stateTax, m-> max_stateTax) ;
m-> min_fedTax = CALC_MIN( c-> fedTax, m-> min_fedTax) ;
m-> max_fedTax = CALC_MAX( c-> fedTax, m-> max_fedTax) ;
m-> min_netPay = CALC_MIN( c-> netPay, m-> min_netPay) ;
m-> max_netPay = CALC_MAX( c-> netPay, m-> max_netPay) ;
}
}
// ================= STATS =================
void printEmpStatistics( TOTALS * t, MIN_MAX * m, int size)
{
printf ( "\n ---------------------------------------------------------------------------------" ) ;
printf ( "\n Totals: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f" , t-> total_wageRate,
t-> total_hours,
t-> total_overtimeHrs,
t-> total_grossPay,
t-> total_stateTax,
t-> total_fedTax,
t-> total_netPay) ;
printf ( "\n Averages: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f" , t-> total_wageRate/ size,
t-> total_hours/ size,
t-> total_overtimeHrs/ size,
t-> total_grossPay/ size,
t-> total_stateTax/ size,
t-> total_fedTax/ size,
t-> total_netPay/ size) ;
printf ( "\n Minimum: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f" , m-> min_wageRate,
m-> min_hours,
m-> min_overtimeHrs,
m-> min_grossPay,
m-> min_stateTax,
m-> min_fedTax,
m-> min_netPay) ;
printf ( "\n Maximum: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f" , m-> max_wageRate,
m-> max_hours,
m-> max_overtimeHrs,
m-> max_grossPay,
m-> max_stateTax,
m-> max_fedTax,
m-> max_netPay) ;
printf ( "\n \n The total employees processed was: %d\n " , size
) ; }
Ci8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8KLy8gQXNzaWdubWVudCAxMCAtIExpbmtlZCBMaXN0cywgVHlwZWRlZiwgYW5kIE1hY3JvcwovLwovLyBOYW1lOiBKb2huIFNlbWVudWsKLy8KLy8gQ2xhc3M6IEMgUHJvZ3JhbW1pbmcsIDxyZXBsYWNlIHdpdGggU2VtZXN0ZXIgYW5kIFllYXI+Ci8vCi8vIERhdGU6IEFwcmlsIDE3LCAyMDI2Ci8vCi8vIERlc2NyaXB0aW9uOiBQcm9ncmFtIHdoaWNoIGRldGVybWluZXMgb3ZlcnRpbWUgYW5kIAovLyBncm9zcyBwYXkgZm9yIGEgc2V0IG9mIGVtcGxveWVlcyB3aXRoIG91dHB1dHMgc2VudCAKLy8gdG8gc3RhbmRhcmQgb3V0cHV0ICh0aGUgc2NyZWVuKS4KLy8KLy8gVGhpcyBhc3NpZ25tZW50IGFsc28gYWRkcyB0aGUgZW1wbG95ZWUgbmFtZSwgdGhlaXIgdGF4IHN0YXRlLAovLyBhbmQgY2FsY3VsYXRlcyB0aGUgc3RhdGUgdGF4LCBmZWRlcmFsIHRheCwgYW5kIG5ldCBwYXkuICAgSXQKLy8gYWxzbyBjYWxjdWxhdGVzIHRvdGFscywgYXZlcmFnZXMsIG1pbmltdW0sIGFuZCBtYXhpbXVtIHZhbHVlcy4KLy8KLy8gQXJyYXkgYW5kIFN0cnVjdHVyZSByZWZlcmVuY2VzIGhhdmUgYWxsIGJlZW4gcmVwbGFjZWQgd2l0aAovLyBwb2ludGVyIHJlZmVyZW5jZXMgdG8gc3BlZWQgdXAgdGhlIHByb2Nlc3Npbmcgb2YgdGhpcyBjb2RlLgovLyBBIGxpbmtlZCBsaXN0IGhhcyBiZWVuIGNyZWF0ZWQgYW5kIGRlcGxveWVkIHRvIGR5bmFtaWNhbGx5Ci8vIGFsbG9jYXRlIGFuZCBwcm9jZXNzIGVtcGxveWVlcyBhcyBuZWVkZWQuCi8vCi8vIEl0IHdpbGwgYWxzbyB0YWtlIGFkdmFudGFnZSBvZiB0aGUgQyBQcmVwcm9jZXNzb3IgZmVhdHVyZXMsCi8vIGluIHBhcnRpY3VsYXIgd2l0aCB1c2luZyBtYWNyb3MsIGFuZCB3aWxsIHJlcGxhY2UgYWxsIAovLyBzdHJ1Y3QgdHlwZSByZWZlcmVuY2VzIGluIHRoZSBjb2RlIHdpdGggYSB0eXBlZGVmIGFsaWFzCi8vIHJlZmVyZW5jZS4KLy8KLy8gQ2FsbCBieSBSZWZlcmVuY2UgZGVzaWduICh1c2luZyBwb2ludGVycykKLy8KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKLy8gbmVjZXNzYXJ5IGhlYWRlciBmaWxlcwojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4gIC8vIGZvciBjaGFyIGZ1bmN0aW9ucwojaW5jbHVkZSA8c3RkbGliLmg+IC8vIGZvciBtYWxsb2MKCi8vIGRlZmluZSBjb25zdGFudHMKI2RlZmluZSBTVERfSE9VUlMgNDAuMAojZGVmaW5lIE9UX1JBVEUgMS41CiNkZWZpbmUgTUFfVEFYX1JBVEUgMC4wNQojZGVmaW5lIE5IX1RBWF9SQVRFIDAuMAojZGVmaW5lIFZUX1RBWF9SQVRFIDAuMDYKI2RlZmluZSBDQV9UQVhfUkFURSAwLjA3CiNkZWZpbmUgREVGQVVMVF9TVEFURV9UQVhfUkFURSAwLjA4CiNkZWZpbmUgTkFNRV9TSVpFIDIwCiNkZWZpbmUgVEFYX1NUQVRFX1NJWkUgMwojZGVmaW5lIEZFRF9UQVhfUkFURSAwLjI1CiNkZWZpbmUgRklSU1RfTkFNRV9TSVpFIDEwCiNkZWZpbmUgTEFTVF9OQU1FX1NJWkUgMTAKCi8vIGRlZmluZSBtYWNyb3MKI2RlZmluZSBDQUxDX09UX0hPVVJTKGgpICgoaCA+IFNURF9IT1VSUykgPyAoaCAtIFNURF9IT1VSUykgOiAwKQojZGVmaW5lIENBTENfU1RBVEVfVEFYKHAscikgKChwKSoocikpCiNkZWZpbmUgQ0FMQ19GRURfVEFYKHApICgocCkqRkVEX1RBWF9SQVRFKQojZGVmaW5lIENBTENfTkVUX1BBWShwLHMsZikgKChwKS0oKHMpKyhmKSkpCgojZGVmaW5lIENBTENfTk9STUFMX1BBWSh3LGgsb3QpICgodykqKChoKS0ob3QpKSkKI2RlZmluZSBDQUxDX09UX1BBWSh3LG90KSAoKG90KSooT1RfUkFURSoodykpKQoKI2RlZmluZSBDQUxDX01JTih2LG0pICgodik8KG0pPyh2KToobSkpCiNkZWZpbmUgQ0FMQ19NQVgodixtKSAoKHYpPihtKT8odik6KG0pKQoKLy8gRGVmaW5lIGEgZ2xvYmFsIHN0cnVjdHVyZSB0eXBlIHRvIHN0b3JlIGFuIGVtcGxveWVlIG5hbWUKLy8gLi4uIG5vdGUgaG93IG9uZSBjb3VsZCBlYXNpbHkgZXh0ZW5kIHRoaXMgdG8gb3RoZXIgcGFydHMKLy8gcGFydHMgb2YgYSBuYW1lOiAgTWlkZGxlLCBOaWNrbmFtZSwgUHJlZml4LCBTdWZmaXgsIGV0Yy4Kc3RydWN0IG5hbWUgewogICAgY2hhciBmaXJzdE5hbWVbRklSU1RfTkFNRV9TSVpFXTsKICAgIGNoYXIgbGFzdE5hbWVbTEFTVF9OQU1FX1NJWkVdOwp9OwoKLy8gRGVmaW5lIGEgZ2xvYmFsIHN0cnVjdHVyZSB0eXBlIHRvIHBhc3MgZW1wbG95ZWUgZGF0YSBiZXR3ZWVuIGZ1bmN0aW9ucwovLyBOb3RlIHRoYXQgdGhlIHN0cnVjdHVyZSB0eXBlIGlzIGdsb2JhbCwgYnV0IHlvdSBkb24ndCB3YW50IGEgdmFyaWFibGUKLy8gb2YgdGhhdCB0eXBlIHRvIGJlIGdsb2JhbC4gQmVzdCB0byBkZWNsYXJlIGEgdmFyaWFibGUgb2YgdGhhdCB0eXBlCi8vIGluIGEgZnVuY3Rpb24gbGlrZSBtYWluIG9yIGFub3RoZXIgZnVuY3Rpb24gYW5kIHBhc3MgYXMgbmVlZGVkLgoKLy8gTm90ZSB0aGUgIm5leHQiIG1lbWJlciBoYXMgYmVlbiBhZGRlZCBhcyBhIHBvaW50ZXIgdG8gc3RydWN0dXJlIGVtcGxveWVlLgovLyBUaGlzIGFsbG93cyB1cyB0byBwb2ludCB0byBhbm90aGVyIGRhdGEgaXRlbSBvZiB0aGlzIHNhbWUgdHlwZSwgCi8vIGFsbG93aW5nIHVzIHRvIHNldCB1cCBhbmQgdHJhdmVyc2UgdGhyb3VnaCBhbGwgdGhlIGxpbmtlZCAKLy8gbGlzdCBub2Rlcywgd2l0aCBlYWNoIG5vZGUgY29udGFpbmluZyB0aGUgZW1wbG95ZWUgaW5mb3JtYXRpb24gYmVsb3cuCgovLyBBbHNvIG5vdGUgdGhlIHVzZSBvZiB0eXBlZGVmIHRvIGNyZWF0ZSBhbiBhbGlhcyBmb3Igc3RydWN0IGVtcGxveWVlCgp0eXBlZGVmIHN0cnVjdCBlbXBsb3llZSB7CiAgICBzdHJ1Y3QgbmFtZSBlbXBOYW1lOwogICAgY2hhciB0YXhTdGF0ZVtUQVhfU1RBVEVfU0laRV07CiAgICBsb25nIGludCBjbG9ja051bWJlcjsKICAgIGZsb2F0IHdhZ2VSYXRlOwogICAgZmxvYXQgaG91cnM7CiAgICBmbG9hdCBvdmVydGltZUhyczsKICAgIGZsb2F0IGdyb3NzUGF5OwogICAgZmxvYXQgc3RhdGVUYXg7CiAgICBmbG9hdCBmZWRUYXg7CiAgICBmbG9hdCBuZXRQYXk7CiAgICBzdHJ1Y3QgZW1wbG95ZWUgKm5leHQ7Cn0gRU1QTE9ZRUU7CgovLyBUaGlzIHN0cnVjdHVyZSB0eXBlIGRlZmluZXMgdGhlIHRvdGFscyBvZiBhbGwgZmxvYXRpbmcgcG9pbnQgaXRlbXMKLy8gc28gdGhleSBjYW4gYmUgdG90YWxlZCBhbmQgdXNlZCBhbHNvIHRvIGNhbGN1bGF0ZSBhdmVyYWdlcwoKLy8gQWxzbyBub3RlIHRoZSB1c2Ugb2YgdHlwZWRlZiB0byBjcmVhdGUgYW4gYWxpYXMgZm9yIHN0cnVjdCB0b3RhbHMKCgp0eXBlZGVmIHN0cnVjdCB0b3RhbHMgewogICAgZmxvYXQgdG90YWxfd2FnZVJhdGU7CiAgICBmbG9hdCB0b3RhbF9ob3VyczsKICAgIGZsb2F0IHRvdGFsX292ZXJ0aW1lSHJzOwogICAgZmxvYXQgdG90YWxfZ3Jvc3NQYXk7CiAgICBmbG9hdCB0b3RhbF9zdGF0ZVRheDsKICAgIGZsb2F0IHRvdGFsX2ZlZFRheDsKICAgIGZsb2F0IHRvdGFsX25ldFBheTsKfSBUT1RBTFM7CgovLyBUaGlzIHN0cnVjdHVyZSB0eXBlIGRlZmluZXMgdGhlIG1pbiBhbmQgbWF4IHZhbHVlcyBvZiBhbGwgZmxvYXRpbmcKLy8gcG9pbnQgaXRlbXMgc28gdGhleSBjYW4gYmUgZGlzcGxheSBpbiBvdXIgZmluYWwgcmVwb3J0CgovLyBBbHNvIG5vdGUgdGhlIHVzZSBvZiB0eXBlZGVmIHRvIGNyZWF0ZSBhbiBhbGlhcyBmb3Igc3RydWN0IG1pbl9tYXgKCnR5cGVkZWYgc3RydWN0IG1pbl9tYXggewogICAgZmxvYXQgbWluX3dhZ2VSYXRlLCBtaW5faG91cnMsIG1pbl9vdmVydGltZUhycywgbWluX2dyb3NzUGF5LCBtaW5fc3RhdGVUYXgsIG1pbl9mZWRUYXgsIG1pbl9uZXRQYXk7CiAgICBmbG9hdCBtYXhfd2FnZVJhdGUsIG1heF9ob3VycywgbWF4X292ZXJ0aW1lSHJzLCBtYXhfZ3Jvc3NQYXksIG1heF9zdGF0ZVRheCwgbWF4X2ZlZFRheCwgbWF4X25ldFBheTsKfSBNSU5fTUFYOwoKLy8gRGVmaW5lIHByb3RvdHlwZXMgaGVyZSBmb3IgZWFjaCBmdW5jdGlvbiBleGNlcHQgbWFpbgovLwovLyBOb3RlIHRoZSB1c2Ugb2YgdGhlIHR5cGVkZWYgYWxpYXMgdmFsdWVzIHRocm91Z2hvdXQKLy8gdGhlIHJlc3Qgb2YgdGhpcyBwcm9ncmFtLCBzdGFydGluZyB3aXRoIHRoZSBmdWNudGlvbnMKLy8gcHJvdG90eXBlcwovLwovLyAgICAgRU1QTE9ZRUUgaW5zdGVhZCBvZiBzdHJ1Y3QgZW1wbG95ZWUKLy8gICAgIFRPVEFMUyBpbnN0ZWFkIG9mIHN0cnVjdCB0b3RhbHMKLy8gICAgIE1JTl9NQVggaW5zdGVhZCBvZiBzdHJ1Y3QgbWluX21heAoKLy8gcHJvdG90eXBlcwpFTVBMT1lFRSAqZ2V0RW1wRGF0YSh2b2lkKTsKaW50IGlzRW1wbG95ZWVTaXplKEVNUExPWUVFICpoZWFkX3B0cik7Cgp2b2lkIGNhbGNPdmVydGltZUhycyhFTVBMT1lFRSAqaGVhZF9wdHIpOwp2b2lkIGNhbGNHcm9zc1BheShFTVBMT1lFRSAqaGVhZF9wdHIpOwp2b2lkIGNhbGNTdGF0ZVRheChFTVBMT1lFRSAqaGVhZF9wdHIpOwp2b2lkIGNhbGNGZWRUYXgoRU1QTE9ZRUUgKmhlYWRfcHRyKTsKdm9pZCBjYWxjTmV0UGF5KEVNUExPWUVFICpoZWFkX3B0cik7Cgp2b2lkIGNhbGNFbXBsb3llZVRvdGFscyhFTVBMT1lFRSAqaGVhZF9wdHIsIFRPVEFMUyAqdCk7CnZvaWQgY2FsY0VtcGxveWVlTWluTWF4KEVNUExPWUVFICpoZWFkX3B0ciwgTUlOX01BWCAqbSk7Cgp2b2lkIHByaW50SGVhZGVyKHZvaWQpOwp2b2lkIHByaW50RW1wKEVNUExPWUVFICpoZWFkX3B0cik7CnZvaWQgcHJpbnRFbXBTdGF0aXN0aWNzKFRPVEFMUyAqdCwgTUlOX01BWCAqbSwgaW50IHNpemUpOwoKLy8gTUFJTgppbnQgbWFpbigpCnsKICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgLy8gU2V0IHVwIGhlYWQgcG9pbnRlciBpbiB0aGUgbWFpbiBmdW5jdGlvbiB0byBwb2ludCB0byB0aGUKICAgIC8vIHN0YXJ0IG9mIHRoZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbGlua2VkIGxpc3Qgbm9kZXMgdGhhdCB3aWxsIGJlIAogICAgLy8gY3JlYXRlZCBhbmQgc3RvcmVkIGluIHRoZSBIZWFwIGFyZWEuCiAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIAogICAgRU1QTE9ZRUUgKmhlYWRfcHRyOyAvLyBhbHdheXMgcG9pbnRzIHRvIGZpcnN0IGxpbmtlZCBsaXN0IG5vZGUKICAgIGludCBzaXplOyAvLyBudW1iZXIgb2YgZW1wbG95ZWVzIHByb2Nlc3NlZAogICAgCiAgICAvLyBzZXQgdXAgc3RydWN0dXJlIHRvIHN0b3JlIHRvdGFscyBhbmQgaW5pdGlhbGl6ZSBhbGwgdG8gemVybwogICAgCiAgICBUT1RBTFMgdG90YWxzID0gezAsMCwwLDAsMCwwLDB9OwogICAgTUlOX01BWCBtbSA9IHswfTsKCiAgICBoZWFkX3B0ciA9IGdldEVtcERhdGEoKTsKICAgIHNpemUgPSBpc0VtcGxveWVlU2l6ZShoZWFkX3B0cik7CgogICAgaWYgKHNpemUgPD0gMCkKICAgIHsKICAgICAgICBwcmludGYoIlxuKioqKiBObyBlbXBsb3llZXMgKioqKlxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgY2FsY092ZXJ0aW1lSHJzKGhlYWRfcHRyKTsKICAgIGNhbGNHcm9zc1BheShoZWFkX3B0cik7CiAgICBjYWxjU3RhdGVUYXgoaGVhZF9wdHIpOwogICAgY2FsY0ZlZFRheChoZWFkX3B0cik7CiAgICBjYWxjTmV0UGF5KGhlYWRfcHRyKTsKCiAgICBjYWxjRW1wbG95ZWVUb3RhbHMoaGVhZF9wdHIsICZ0b3RhbHMpOwogICAgY2FsY0VtcGxveWVlTWluTWF4KGhlYWRfcHRyLCAmbW0pOwoKICAgIHByaW50SGVhZGVyKCk7CiAgICBwcmludEVtcChoZWFkX3B0cik7CiAgICBwcmludEVtcFN0YXRpc3RpY3MoJnRvdGFscywgJm1tLCBzaXplKTsKCiAgICBwcmludGYoIlxuXG4gKioqIEVuZCBvZiBQcm9ncmFtICoqKiBcbiIpOwogICAgcmV0dXJuIDA7Cn0KCi8vID09PT09PT09PT09PT09PT09IElOUFVUID09PT09PT09PT09PT09PT09CkVNUExPWUVFICpnZXRFbXBEYXRhKHZvaWQpCnsKICAgIEVNUExPWUVFICpoZWFkLCAqY3VyOwogICAgY2hhciBhbnNbMTBdOwogICAgaW50IG1vcmUgPSAxOwoKICAgIGhlYWQgPSBtYWxsb2Moc2l6ZW9mKEVNUExPWUVFKSk7CiAgICBjdXIgPSBoZWFkOwoKICAgIHdoaWxlIChtb3JlKQogICAgewogICAgICAgIHByaW50ZigiXG5GaXJzdCBuYW1lOiAiKTsKICAgICAgICBzY2FuZigiJXMiLCBjdXItPmVtcE5hbWUuZmlyc3ROYW1lKTsKCiAgICAgICAgcHJpbnRmKCJMYXN0IG5hbWU6ICIpOwogICAgICAgIHNjYW5mKCIlcyIsIGN1ci0+ZW1wTmFtZS5sYXN0TmFtZSk7CgogICAgICAgIHByaW50ZigiU3RhdGU6ICIpOwogICAgICAgIHNjYW5mKCIlcyIsIGN1ci0+dGF4U3RhdGUpOwoKICAgICAgICBwcmludGYoIkNsb2NrICM6ICIpOwogICAgICAgIHNjYW5mKCIlbGkiLCAmY3VyLT5jbG9ja051bWJlcik7CgogICAgICAgIHByaW50ZigiV2FnZTogIik7CiAgICAgICAgc2NhbmYoIiVmIiwgJmN1ci0+d2FnZVJhdGUpOwoKICAgICAgICBwcmludGYoIkhvdXJzOiAiKTsKICAgICAgICBzY2FuZigiJWYiLCAmY3VyLT5ob3Vycyk7CgogICAgICAgIHByaW50ZigiTW9yZT8gKHkvbik6ICIpOwogICAgICAgIHNjYW5mKCIlcyIsIGFucyk7CgogICAgICAgIGlmICh0b3VwcGVyKGFuc1swXSkgIT0gJ1knKQogICAgICAgIHsKICAgICAgICAgICAgY3VyLT5uZXh0ID0gTlVMTDsKICAgICAgICAgICAgbW9yZSA9IDA7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGN1ci0+bmV4dCA9IG1hbGxvYyhzaXplb2YoRU1QTE9ZRUUpKTsKICAgICAgICAgICAgY3VyID0gY3VyLT5uZXh0OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaGVhZDsKfQoKLy8gPT09PT09PT09PT09PT09PT0gU0laRSA9PT09PT09PT09PT09PT09PQppbnQgaXNFbXBsb3llZVNpemUoRU1QTE9ZRUUgKmgpCnsKICAgIGludCBjID0gMDsKICAgIGZvciAoOyBoOyBoID0gaC0+bmV4dCkgYysrOwogICAgcmV0dXJuIGM7Cn0KCi8vID09PT09PT09PT09PT09PT09IEhFQURFUiA9PT09PT09PT09PT09PT09PQp2b2lkIHByaW50SGVhZGVyKHZvaWQpCnsKICAgIHByaW50ZigiXG5cbioqKiBQYXkgQ2FsY3VsYXRvciAqKipcblxuIik7CiAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICBwcmludGYoIk5hbWUgICAgICAgICAgICAgICAgVGF4ICBDbG9jayMgIFdhZ2UgICBIb3VycyAgT1QgICBHcm9zcyAgIFN0YXRlICBGZWQgICAgICBOZXRcbiIpOwogICAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5ICAgICBUYXggICAgVGF4ICAgICAgUGF5XG4iKTsKICAgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKfQoKLy8gPT09PT09PT09PT09PT09PT0gUFJJTlQgRU1QID09PT09PT09PT09PT09PT09CnZvaWQgcHJpbnRFbXAoRU1QTE9ZRUUgKmgpCnsKICAgIGNoYXIgbmFtZVszMF07CgogICAgZm9yICg7IGg7IGggPSBoLT5uZXh0KQogICAgewogICAgICAgIHN0cmNweShuYW1lLCBoLT5lbXBOYW1lLmZpcnN0TmFtZSk7CiAgICAgICAgc3RyY2F0KG5hbWUsICIgIik7CiAgICAgICAgc3RyY2F0KG5hbWUsIGgtPmVtcE5hbWUubGFzdE5hbWUpOwoKICAgICAgICBwcmludGYoIlxuJS0yMC4yMHMgJS0ycyAgJTA2bGkgICU1LjJmICAlNS4xZiAgJTQuMWYgICU3LjJmICAlNi4yZiAgJTcuMmYgICU3LjJmIiwKICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgaC0+dGF4U3RhdGUsCiAgICAgICAgICAgIGgtPmNsb2NrTnVtYmVyLAogICAgICAgICAgICBoLT53YWdlUmF0ZSwKICAgICAgICAgICAgaC0+aG91cnMsCiAgICAgICAgICAgIGgtPm92ZXJ0aW1lSHJzLAogICAgICAgICAgICBoLT5ncm9zc1BheSwKICAgICAgICAgICAgaC0+c3RhdGVUYXgsCiAgICAgICAgICAgIGgtPmZlZFRheCwKICAgICAgICAgICAgaC0+bmV0UGF5KTsKICAgIH0KfQoKLy8gPT09PT09PT09PT09PT09PT0gQ0FMQ1VMQVRJT05TID09PT09PT09PT09PT09PT09CnZvaWQgY2FsY092ZXJ0aW1lSHJzKEVNUExPWUVFICpoKQp7CiAgICBmb3IgKDsgaDsgaCA9IGgtPm5leHQpCiAgICAgICAgaC0+b3ZlcnRpbWVIcnMgPSBDQUxDX09UX0hPVVJTKGgtPmhvdXJzKTsKfQoKdm9pZCBjYWxjR3Jvc3NQYXkoRU1QTE9ZRUUgKmgpCnsKICAgIGZvciAoOyBoOyBoID0gaC0+bmV4dCkKICAgICAgICBoLT5ncm9zc1BheSA9IENBTENfTk9STUFMX1BBWShoLT53YWdlUmF0ZSxoLT5ob3VycyxoLT5vdmVydGltZUhycykKICAgICAgICAgICAgICAgICAgICArIENBTENfT1RfUEFZKGgtPndhZ2VSYXRlLGgtPm92ZXJ0aW1lSHJzKTsKfQoKdm9pZCBjYWxjU3RhdGVUYXgoRU1QTE9ZRUUgKmgpCnsKICAgIGZvciAoOyBoOyBoID0gaC0+bmV4dCkKICAgIHsKICAgICAgICBpZiAoIXN0cmNtcChoLT50YXhTdGF0ZSwiTUEiKSkKICAgICAgICAgICAgaC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoLT5ncm9zc1BheSxNQV9UQVhfUkFURSk7CiAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChoLT50YXhTdGF0ZSwiTkgiKSkKICAgICAgICAgICAgaC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoLT5ncm9zc1BheSxOSF9UQVhfUkFURSk7CiAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChoLT50YXhTdGF0ZSwiVlQiKSkKICAgICAgICAgICAgaC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoLT5ncm9zc1BheSxWVF9UQVhfUkFURSk7CiAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChoLT50YXhTdGF0ZSwiQ0EiKSkKICAgICAgICAgICAgaC0+c3RhdGVUYXggPSBDQUxDX1NUQVRFX1RBWChoLT5ncm9zc1BheSxDQV9UQVhfUkFURSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBoLT5zdGF0ZVRheCA9IENBTENfU1RBVEVfVEFYKGgtPmdyb3NzUGF5LERFRkFVTFRfU1RBVEVfVEFYX1JBVEUpOwogICAgfQp9Cgp2b2lkIGNhbGNGZWRUYXgoRU1QTE9ZRUUgKmgpCnsKICAgIGZvciAoOyBoOyBoID0gaC0+bmV4dCkKICAgICAgICBoLT5mZWRUYXggPSBDQUxDX0ZFRF9UQVgoaC0+Z3Jvc3NQYXkpOwp9Cgp2b2lkIGNhbGNOZXRQYXkoRU1QTE9ZRUUgKmgpCnsKICAgIGZvciAoOyBoOyBoID0gaC0+bmV4dCkKICAgICAgICBoLT5uZXRQYXkgPSBDQUxDX05FVF9QQVkoaC0+Z3Jvc3NQYXksaC0+c3RhdGVUYXgsaC0+ZmVkVGF4KTsKfQoKLy8gPT09PT09PT09PT09PT09PT0gVE9UQUxTID09PT09PT09PT09PT09PT09CnZvaWQgY2FsY0VtcGxveWVlVG90YWxzKEVNUExPWUVFICpoLCBUT1RBTFMgKnQpCnsKICAgIGZvciAoOyBoOyBoID0gaC0+bmV4dCkKICAgIHsKICAgICAgICB0LT50b3RhbF93YWdlUmF0ZSArPSBoLT53YWdlUmF0ZTsKICAgICAgICB0LT50b3RhbF9ob3VycyArPSBoLT5ob3VyczsKICAgICAgICB0LT50b3RhbF9vdmVydGltZUhycyArPSBoLT5vdmVydGltZUhyczsKICAgICAgICB0LT50b3RhbF9ncm9zc1BheSArPSBoLT5ncm9zc1BheTsKICAgICAgICB0LT50b3RhbF9zdGF0ZVRheCArPSBoLT5zdGF0ZVRheDsKICAgICAgICB0LT50b3RhbF9mZWRUYXggKz0gaC0+ZmVkVGF4OwogICAgICAgIHQtPnRvdGFsX25ldFBheSArPSBoLT5uZXRQYXk7CiAgICB9Cn0KCi8vID09PT09PT09PT09PT09PT09IE1JTiBNQVggPT09PT09PT09PT09PT09PT0Kdm9pZCBjYWxjRW1wbG95ZWVNaW5NYXgoRU1QTE9ZRUUgKmgsIE1JTl9NQVggKm0pCnsKICAgIEVNUExPWUVFICpjID0gaDsKCiAgICBtLT5taW5fd2FnZVJhdGUgPSBtLT5tYXhfd2FnZVJhdGUgPSBjLT53YWdlUmF0ZTsKICAgIG0tPm1pbl9ob3VycyA9IG0tPm1heF9ob3VycyA9IGMtPmhvdXJzOwogICAgbS0+bWluX292ZXJ0aW1lSHJzID0gbS0+bWF4X292ZXJ0aW1lSHJzID0gYy0+b3ZlcnRpbWVIcnM7CiAgICBtLT5taW5fZ3Jvc3NQYXkgPSBtLT5tYXhfZ3Jvc3NQYXkgPSBjLT5ncm9zc1BheTsKICAgIG0tPm1pbl9zdGF0ZVRheCA9IG0tPm1heF9zdGF0ZVRheCA9IGMtPnN0YXRlVGF4OwogICAgbS0+bWluX2ZlZFRheCA9IG0tPm1heF9mZWRUYXggPSBjLT5mZWRUYXg7CiAgICBtLT5taW5fbmV0UGF5ID0gbS0+bWF4X25ldFBheSA9IGMtPm5ldFBheTsKCiAgICBmb3IgKGMgPSBjLT5uZXh0OyBjOyBjID0gYy0+bmV4dCkKICAgIHsKICAgICAgICBtLT5taW5fd2FnZVJhdGUgPSBDQUxDX01JTihjLT53YWdlUmF0ZSxtLT5taW5fd2FnZVJhdGUpOwogICAgICAgIG0tPm1heF93YWdlUmF0ZSA9IENBTENfTUFYKGMtPndhZ2VSYXRlLG0tPm1heF93YWdlUmF0ZSk7CgogICAgICAgIG0tPm1pbl9ob3VycyA9IENBTENfTUlOKGMtPmhvdXJzLG0tPm1pbl9ob3Vycyk7CiAgICAgICAgbS0+bWF4X2hvdXJzID0gQ0FMQ19NQVgoYy0+aG91cnMsbS0+bWF4X2hvdXJzKTsKCiAgICAgICAgbS0+bWluX292ZXJ0aW1lSHJzID0gQ0FMQ19NSU4oYy0+b3ZlcnRpbWVIcnMsbS0+bWluX292ZXJ0aW1lSHJzKTsKICAgICAgICBtLT5tYXhfb3ZlcnRpbWVIcnMgPSBDQUxDX01BWChjLT5vdmVydGltZUhycyxtLT5tYXhfb3ZlcnRpbWVIcnMpOwoKICAgICAgICBtLT5taW5fZ3Jvc3NQYXkgPSBDQUxDX01JTihjLT5ncm9zc1BheSxtLT5taW5fZ3Jvc3NQYXkpOwogICAgICAgIG0tPm1heF9ncm9zc1BheSA9IENBTENfTUFYKGMtPmdyb3NzUGF5LG0tPm1heF9ncm9zc1BheSk7CgogICAgICAgIG0tPm1pbl9zdGF0ZVRheCA9IENBTENfTUlOKGMtPnN0YXRlVGF4LG0tPm1pbl9zdGF0ZVRheCk7CiAgICAgICAgbS0+bWF4X3N0YXRlVGF4ID0gQ0FMQ19NQVgoYy0+c3RhdGVUYXgsbS0+bWF4X3N0YXRlVGF4KTsKCiAgICAgICAgbS0+bWluX2ZlZFRheCA9IENBTENfTUlOKGMtPmZlZFRheCxtLT5taW5fZmVkVGF4KTsKICAgICAgICBtLT5tYXhfZmVkVGF4ID0gQ0FMQ19NQVgoYy0+ZmVkVGF4LG0tPm1heF9mZWRUYXgpOwoKICAgICAgICBtLT5taW5fbmV0UGF5ID0gQ0FMQ19NSU4oYy0+bmV0UGF5LG0tPm1pbl9uZXRQYXkpOwogICAgICAgIG0tPm1heF9uZXRQYXkgPSBDQUxDX01BWChjLT5uZXRQYXksbS0+bWF4X25ldFBheSk7CiAgICB9Cn0KCi8vID09PT09PT09PT09PT09PT09IFNUQVRTID09PT09PT09PT09PT09PT09CnZvaWQgcHJpbnRFbXBTdGF0aXN0aWNzKFRPVEFMUyAqdCwgTUlOX01BWCAqbSwgaW50IHNpemUpCnsKICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKCiAgICBwcmludGYoIlxuVG90YWxzOiAgICAgICAgICAgICAgICAgICAgICAgICAgJTUuMmYgJTUuMWYgJTUuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmYiLAogICAgICAgIHQtPnRvdGFsX3dhZ2VSYXRlLAogICAgICAgIHQtPnRvdGFsX2hvdXJzLAogICAgICAgIHQtPnRvdGFsX292ZXJ0aW1lSHJzLAogICAgICAgIHQtPnRvdGFsX2dyb3NzUGF5LAogICAgICAgIHQtPnRvdGFsX3N0YXRlVGF4LAogICAgICAgIHQtPnRvdGFsX2ZlZFRheCwKICAgICAgICB0LT50b3RhbF9uZXRQYXkpOwoKICAgIHByaW50ZigiXG5BdmVyYWdlczogICAgICAgICAgICAgICAgICAgICAgICAlNS4yZiAlNS4xZiAlNS4xZiAlNy4yZiAlNi4yZiAlNy4yZiAlOC4yZiIsCiAgICAgICAgdC0+dG90YWxfd2FnZVJhdGUvc2l6ZSwKICAgICAgICB0LT50b3RhbF9ob3Vycy9zaXplLAogICAgICAgIHQtPnRvdGFsX292ZXJ0aW1lSHJzL3NpemUsCiAgICAgICAgdC0+dG90YWxfZ3Jvc3NQYXkvc2l6ZSwKICAgICAgICB0LT50b3RhbF9zdGF0ZVRheC9zaXplLAogICAgICAgIHQtPnRvdGFsX2ZlZFRheC9zaXplLAogICAgICAgIHQtPnRvdGFsX25ldFBheS9zaXplKTsKCiAgICBwcmludGYoIlxuTWluaW11bTogICAgICAgICAgICAgICAgICAgICAgICAgJTUuMmYgJTUuMWYgJTUuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmYiLAogICAgICAgIG0tPm1pbl93YWdlUmF0ZSwKICAgICAgICBtLT5taW5faG91cnMsCiAgICAgICAgbS0+bWluX292ZXJ0aW1lSHJzLAogICAgICAgIG0tPm1pbl9ncm9zc1BheSwKICAgICAgICBtLT5taW5fc3RhdGVUYXgsCiAgICAgICAgbS0+bWluX2ZlZFRheCwKICAgICAgICBtLT5taW5fbmV0UGF5KTsKCiAgICBwcmludGYoIlxuTWF4aW11bTogICAgICAgICAgICAgICAgICAgICAgICAgJTUuMmYgJTUuMWYgJTUuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmYiLAogICAgICAgIG0tPm1heF93YWdlUmF0ZSwKICAgICAgICBtLT5tYXhfaG91cnMsCiAgICAgICAgbS0+bWF4X292ZXJ0aW1lSHJzLAogICAgICAgIG0tPm1heF9ncm9zc1BheSwKICAgICAgICBtLT5tYXhfc3RhdGVUYXgsCiAgICAgICAgbS0+bWF4X2ZlZFRheCwKICAgICAgICBtLT5tYXhfbmV0UGF5KTsKCiAgICBwcmludGYoIlxuXG5UaGUgdG90YWwgZW1wbG95ZWVzIHByb2Nlc3NlZCB3YXM6ICVkXG4iLCBzaXplKTsKfQ==