//********************************************************
//
// Assignment 10 - Linked Lists, Typedef, and Macros
//
// Name S. C
//
// Class: C Programming, Spring 2026
//
// Date: April 18, 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>
#include <stdlib.h>
#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 FED_TAX_RATE 0.25
#define FIRST_NAME_SIZE 10
#define LAST_NAME_SIZE 10
#define TAX_STATE_SIZE 3
//---------------- MACROS ----------------
#define CALC_OT_HOURS(h) ((h > STD_HOURS) ? (h - STD_HOURS) : 0)
#define CALC_STATE_TAX(pay, rate) (pay * rate)
#define CALC_FED_TAX(pay) (pay * FED_TAX_RATE)
#define CALC_NET_PAY(pay, st, ft) (pay - (st + ft))
#define CALC_MIN(val, min) ((val < min) ? val : min)
#define CALC_MAX(val, max) ((val > max) ? val : max)
//---------------- STRUCTS ----------------
typedef struct name {
char firstName[ FIRST_NAME_SIZE] ;
char lastName[ LAST_NAME_SIZE] ;
} NAME;
typedef struct employee {
NAME empName;
char taxState[ TAX_STATE_SIZE] ;
long clockNumber;
float wageRate;
float hours;
float overtimeHrs;
float grossPay;
float stateTax;
float fedTax;
float netPay;
struct employee * next;
} EMPLOYEE;
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;
typedef struct min_max {
float min_wageRate;
float min_hours;
float min_overtimeHrs;
float min_grossPay;
float min_stateTax;
float min_fedTax;
float min_netPay;
float max_wageRate;
float max_hours;
float max_overtimeHrs;
float max_grossPay;
float max_stateTax;
float max_fedTax;
float max_netPay;
} MIN_MAX;
//---------------- PROTOTYPES ----------------
EMPLOYEE * getEmpData( void ) ;
int isEmployeeSize( EMPLOYEE * head) ;
void calcOvertimeHrs( EMPLOYEE * head) ;
void calcGrossPay( EMPLOYEE * head) ;
void calcStateTax( EMPLOYEE * head) ;
void calcFedTax( EMPLOYEE * head) ;
void calcNetPay( EMPLOYEE * head) ;
void calcEmployeeTotals( EMPLOYEE * head, TOTALS * t) ;
void calcEmployeeMinMax( EMPLOYEE * head, MIN_MAX * m) ;
void printHeader( void ) ;
void printEmp( EMPLOYEE * head) ;
void printEmpStatistics( TOTALS * t, MIN_MAX * m, int size) ;
//---------------- MAIN ----------------
int main( ) {
EMPLOYEE * head_ptr;
int size;
TOTALS totals = { 0 } ;
MIN_MAX minmax = { 0 } ;
head_ptr = getEmpData( ) ;
size = isEmployeeSize( head_ptr) ;
if ( size > 0 ) {
calcOvertimeHrs( head_ptr) ;
calcGrossPay( head_ptr) ;
calcStateTax( head_ptr) ;
calcFedTax( head_ptr) ;
calcNetPay( head_ptr) ;
calcEmployeeTotals( head_ptr, & totals) ;
calcEmployeeMinMax( head_ptr, & minmax) ;
printHeader( ) ;
printEmp( head_ptr) ;
printEmpStatistics( & totals, & minmax, size) ;
}
printf ( "\n \n *** End of Program *** \n " ) ; return 0 ;
}
//---------------- INPUT (NO PROMPTS) ----------------
EMPLOYEE * getEmpData( void ) {
EMPLOYEE * head = NULL, * current = NULL;
char ans;
while ( 1 ) {
EMPLOYEE
* node
= malloc ( sizeof ( EMPLOYEE
) ) ;
scanf ( "%s" , node
-> empName.
firstName ) ; scanf ( "%s" , node
-> empName.
lastName ) ; scanf ( "%s" , node
-> taxState
) ; scanf ( "%ld" , & node
-> clockNumber
) ; scanf ( "%f" , & node
-> wageRate
) ; scanf ( "%f" , & node
-> hours
) ;
node-> next = NULL;
if ( ! head)
head = node;
else
current-> next = node;
current = node;
break ;
}
return head;
}
//---------------- SIZE ----------------
int isEmployeeSize( EMPLOYEE * head) {
int count = 0 ;
while ( head) {
count++;
head = head-> next;
}
return count;
}
//---------------- CALCULATIONS ----------------
void calcOvertimeHrs( EMPLOYEE * h) {
while ( h) {
h-> overtimeHrs = CALC_OT_HOURS( h-> hours) ;
h = h-> next;
}
}
void calcGrossPay( EMPLOYEE * h) {
while ( h) {
float normal = h-> wageRate * ( h-> hours - h-> overtimeHrs) ;
float ot = h-> overtimeHrs * ( h-> wageRate * OT_RATE) ;
h-> grossPay = normal + ot;
h = h-> next;
}
}
void calcStateTax( EMPLOYEE * h) {
while ( h) {
if ( strcmp ( h
-> taxState
, "MA" ) == 0 ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, MA_TAX_RATE) ;
else if ( strcmp ( h
-> taxState
, "NH" ) == 0 ) h-> stateTax = 0 ;
else if ( strcmp ( h
-> taxState
, "VT" ) == 0 ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, VT_TAX_RATE) ;
else if ( strcmp ( h
-> taxState
, "CA" ) == 0 ) h-> stateTax = CALC_STATE_TAX( h-> grossPay, CA_TAX_RATE) ;
else
h-> stateTax = CALC_STATE_TAX( h-> grossPay, DEFAULT_STATE_TAX_RATE) ;
h = h-> next;
}
}
// FIXED MACRO USED
void calcFedTax( EMPLOYEE * h) {
while ( h) {
h-> fedTax = CALC_FED_TAX( h-> grossPay) ;
h = h-> next;
}
}
void calcNetPay( EMPLOYEE * h) {
while ( h) {
h-> netPay = CALC_NET_PAY( h-> grossPay, h-> stateTax, h-> fedTax) ;
h = h-> next;
}
}
//---------------- TOTALS ----------------
void calcEmployeeTotals( EMPLOYEE * h, TOTALS * t) {
while ( h) {
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;
h = h-> next;
}
}
//---------------- MIN/MAX ----------------
void calcEmployeeMinMax( EMPLOYEE * h, MIN_MAX * m) {
EMPLOYEE * p = h;
m-> min_wageRate = m-> max_wageRate = p-> wageRate;
m-> min_hours = m-> max_hours = p-> hours;
m-> min_overtimeHrs = m-> max_overtimeHrs = p-> overtimeHrs;
m-> min_grossPay = m-> max_grossPay = p-> grossPay;
m-> min_stateTax = m-> max_stateTax = p-> stateTax;
m-> min_fedTax = m-> max_fedTax = p-> fedTax;
m-> min_netPay = m-> max_netPay = p-> netPay;
p = p-> next;
while ( p) {
m-> min_wageRate = CALC_MIN( p-> wageRate, m-> min_wageRate) ;
m-> max_wageRate = CALC_MAX( p-> wageRate, m-> max_wageRate) ;
m-> min_hours = CALC_MIN( p-> hours, m-> min_hours) ;
m-> max_hours = CALC_MAX( p-> hours, m-> max_hours) ;
m-> min_overtimeHrs = CALC_MIN( p-> overtimeHrs, m-> min_overtimeHrs) ;
m-> max_overtimeHrs = CALC_MAX( p-> overtimeHrs, m-> max_overtimeHrs) ;
m-> min_grossPay = CALC_MIN( p-> grossPay, m-> min_grossPay) ;
m-> max_grossPay = CALC_MAX( p-> grossPay, m-> max_grossPay) ;
m-> min_stateTax = CALC_MIN( p-> stateTax, m-> min_stateTax) ;
m-> max_stateTax = CALC_MAX( p-> stateTax, m-> max_stateTax) ;
m-> min_fedTax = CALC_MIN( p-> fedTax, m-> min_fedTax) ;
m-> max_fedTax = CALC_MAX( p-> fedTax, m-> max_fedTax) ;
m-> min_netPay = CALC_MIN( p-> netPay, m-> min_netPay) ;
m-> max_netPay = CALC_MAX( p-> netPay, m-> max_netPay) ;
p = p-> next;
}
}
//---------------- OUTPUT FIXED FORMAT ----------------
void printHeader( void ) {
printf ( "\n *** Pay Calculator ***\n " ) ;
printf ( "\n ---------------------------------------------------------------------------------" ) ; printf ( "\n Name Tax Clock# Wage Hours OT Gross State Fed Net" ) ; printf ( "\n State Pay Tax Tax Pay" ) ; printf ( "\n ---------------------------------------------------------------------------------" ) ; }
void printEmp( EMPLOYEE * h) {
while ( h) {
char name[ 25 ] ;
strcpy ( name
, h
-> empName.
firstName ) ; strcat ( name
, h
-> empName.
lastName ) ;
printf ( "\n %-20.20s %-2.2s %06ld %5.2f %4.1f %4.1f %7.2f %6.2f %7.2f %8.2f" , name, h-> taxState, h-> clockNumber,
h-> wageRate, h-> hours, h-> overtimeHrs,
h-> grossPay, h-> stateTax, h-> fedTax, h-> netPay) ;
h = h-> next;
}
}
//---------------- 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
) ; }
Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLwovLyBBc3NpZ25tZW50IDEwIC0gTGlua2VkIExpc3RzLCBUeXBlZGVmLCBhbmQgTWFjcm9zCi8vCi8vIE5hbWUgUy4gQwovLwovLyBDbGFzczogQyBQcm9ncmFtbWluZywgU3ByaW5nIDIwMjYKLy8KLy8gRGF0ZTogQXByaWwgMTgsIDIwMjYKLy8KLy8gRGVzY3JpcHRpb246IFByb2dyYW0gd2hpY2ggZGV0ZXJtaW5lcyBvdmVydGltZSBhbmQgCi8vIGdyb3NzIHBheSBmb3IgYSBzZXQgb2YgZW1wbG95ZWVzIHdpdGggb3V0cHV0cyBzZW50IAovLyB0byBzdGFuZGFyZCBvdXRwdXQgKHRoZSBzY3JlZW4pLgovLwovLyBUaGlzIGFzc2lnbm1lbnQgYWxzbyBhZGRzIHRoZSBlbXBsb3llZSBuYW1lLCB0aGVpciB0YXggc3RhdGUsCi8vIGFuZCBjYWxjdWxhdGVzIHRoZSBzdGF0ZSB0YXgsIGZlZGVyYWwgdGF4LCBhbmQgbmV0IHBheS4gICBJdAovLyBhbHNvIGNhbGN1bGF0ZXMgdG90YWxzLCBhdmVyYWdlcywgbWluaW11bSwgYW5kIG1heGltdW0gdmFsdWVzLgovLwovLyBBcnJheSBhbmQgU3RydWN0dXJlIHJlZmVyZW5jZXMgaGF2ZSBhbGwgYmVlbiByZXBsYWNlZCB3aXRoCi8vIHBvaW50ZXIgcmVmZXJlbmNlcyB0byBzcGVlZCB1cCB0aGUgcHJvY2Vzc2luZyBvZiB0aGlzIGNvZGUuCi8vIEEgbGlua2VkIGxpc3QgaGFzIGJlZW4gY3JlYXRlZCBhbmQgZGVwbG95ZWQgdG8gZHluYW1pY2FsbHkKLy8gYWxsb2NhdGUgYW5kIHByb2Nlc3MgZW1wbG95ZWVzIGFzIG5lZWRlZC4KLy8KLy8gSXQgd2lsbCBhbHNvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBDIFByZXByb2Nlc3NvciBmZWF0dXJlcywKLy8gaW4gcGFydGljdWxhciB3aXRoIHVzaW5nIG1hY3JvcywgYW5kIHdpbGwgcmVwbGFjZSBhbGwgCi8vIHN0cnVjdCB0eXBlIHJlZmVyZW5jZXMgaW4gdGhlIGNvZGUgd2l0aCBhIHR5cGVkZWYgYWxpYXMKLy8gcmVmZXJlbmNlLgovLwovLyBDYWxsIGJ5IFJlZmVyZW5jZSBkZXNpZ24gKHVzaW5nIHBvaW50ZXJzKQovLwovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgovLyBuZWNlc3NhcnkgaGVhZGVyIGZpbGVzCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgojZGVmaW5lIFNURF9IT1VSUyA0MC4wCiNkZWZpbmUgT1RfUkFURSAxLjUKCiNkZWZpbmUgTUFfVEFYX1JBVEUgMC4wNQojZGVmaW5lIE5IX1RBWF9SQVRFIDAuMAojZGVmaW5lIFZUX1RBWF9SQVRFIDAuMDYKI2RlZmluZSBDQV9UQVhfUkFURSAwLjA3CiNkZWZpbmUgREVGQVVMVF9TVEFURV9UQVhfUkFURSAwLjA4CgojZGVmaW5lIEZFRF9UQVhfUkFURSAwLjI1CgojZGVmaW5lIEZJUlNUX05BTUVfU0laRSAxMAojZGVmaW5lIExBU1RfTkFNRV9TSVpFIDEwCiNkZWZpbmUgVEFYX1NUQVRFX1NJWkUgMwoKLy8tLS0tLS0tLS0tLS0tLS0tIE1BQ1JPUyAtLS0tLS0tLS0tLS0tLS0tCgojZGVmaW5lIENBTENfT1RfSE9VUlMoaCkgKChoID4gU1REX0hPVVJTKSA/IChoIC0gU1REX0hPVVJTKSA6IDApCiNkZWZpbmUgQ0FMQ19TVEFURV9UQVgocGF5LCByYXRlKSAocGF5ICogcmF0ZSkKI2RlZmluZSBDQUxDX0ZFRF9UQVgocGF5KSAocGF5ICogRkVEX1RBWF9SQVRFKQojZGVmaW5lIENBTENfTkVUX1BBWShwYXksIHN0LCBmdCkgKHBheSAtIChzdCArIGZ0KSkKCiNkZWZpbmUgQ0FMQ19NSU4odmFsLCBtaW4pICgodmFsIDwgbWluKSA/IHZhbCA6IG1pbikKI2RlZmluZSBDQUxDX01BWCh2YWwsIG1heCkgKCh2YWwgPiBtYXgpID8gdmFsIDogbWF4KQoKLy8tLS0tLS0tLS0tLS0tLS0tIFNUUlVDVFMgLS0tLS0tLS0tLS0tLS0tLQoKdHlwZWRlZiBzdHJ1Y3QgbmFtZSB7CiAgICBjaGFyIGZpcnN0TmFtZVtGSVJTVF9OQU1FX1NJWkVdOwogICAgY2hhciBsYXN0TmFtZVtMQVNUX05BTUVfU0laRV07Cn0gTkFNRTsKCnR5cGVkZWYgc3RydWN0IGVtcGxveWVlIHsKICAgIE5BTUUgZW1wTmFtZTsKICAgIGNoYXIgdGF4U3RhdGVbVEFYX1NUQVRFX1NJWkVdOwogICAgbG9uZyBjbG9ja051bWJlcjsKICAgIGZsb2F0IHdhZ2VSYXRlOwogICAgZmxvYXQgaG91cnM7CiAgICBmbG9hdCBvdmVydGltZUhyczsKICAgIGZsb2F0IGdyb3NzUGF5OwogICAgZmxvYXQgc3RhdGVUYXg7CiAgICBmbG9hdCBmZWRUYXg7CiAgICBmbG9hdCBuZXRQYXk7CiAgICBzdHJ1Y3QgZW1wbG95ZWUgKm5leHQ7Cn0gRU1QTE9ZRUU7Cgp0eXBlZGVmIHN0cnVjdCB0b3RhbHMgewogICAgZmxvYXQgdG90YWxfd2FnZVJhdGU7CiAgICBmbG9hdCB0b3RhbF9ob3VyczsKICAgIGZsb2F0IHRvdGFsX292ZXJ0aW1lSHJzOwogICAgZmxvYXQgdG90YWxfZ3Jvc3NQYXk7CiAgICBmbG9hdCB0b3RhbF9zdGF0ZVRheDsKICAgIGZsb2F0IHRvdGFsX2ZlZFRheDsKICAgIGZsb2F0IHRvdGFsX25ldFBheTsKfSBUT1RBTFM7Cgp0eXBlZGVmIHN0cnVjdCBtaW5fbWF4IHsKICAgIGZsb2F0IG1pbl93YWdlUmF0ZTsKICAgIGZsb2F0IG1pbl9ob3VyczsKICAgIGZsb2F0IG1pbl9vdmVydGltZUhyczsKICAgIGZsb2F0IG1pbl9ncm9zc1BheTsKICAgIGZsb2F0IG1pbl9zdGF0ZVRheDsKICAgIGZsb2F0IG1pbl9mZWRUYXg7CiAgICBmbG9hdCBtaW5fbmV0UGF5OwoKICAgIGZsb2F0IG1heF93YWdlUmF0ZTsKICAgIGZsb2F0IG1heF9ob3VyczsKICAgIGZsb2F0IG1heF9vdmVydGltZUhyczsKICAgIGZsb2F0IG1heF9ncm9zc1BheTsKICAgIGZsb2F0IG1heF9zdGF0ZVRheDsKICAgIGZsb2F0IG1heF9mZWRUYXg7CiAgICBmbG9hdCBtYXhfbmV0UGF5Owp9IE1JTl9NQVg7CgovLy0tLS0tLS0tLS0tLS0tLS0gUFJPVE9UWVBFUyAtLS0tLS0tLS0tLS0tLS0tCgpFTVBMT1lFRSAqZ2V0RW1wRGF0YSh2b2lkKTsKaW50IGlzRW1wbG95ZWVTaXplKEVNUExPWUVFICpoZWFkKTsKdm9pZCBjYWxjT3ZlcnRpbWVIcnMoRU1QTE9ZRUUgKmhlYWQpOwp2b2lkIGNhbGNHcm9zc1BheShFTVBMT1lFRSAqaGVhZCk7CnZvaWQgY2FsY1N0YXRlVGF4KEVNUExPWUVFICpoZWFkKTsKdm9pZCBjYWxjRmVkVGF4KEVNUExPWUVFICpoZWFkKTsKdm9pZCBjYWxjTmV0UGF5KEVNUExPWUVFICpoZWFkKTsKdm9pZCBjYWxjRW1wbG95ZWVUb3RhbHMoRU1QTE9ZRUUgKmhlYWQsIFRPVEFMUyAqdCk7CnZvaWQgY2FsY0VtcGxveWVlTWluTWF4KEVNUExPWUVFICpoZWFkLCBNSU5fTUFYICptKTsKdm9pZCBwcmludEhlYWRlcih2b2lkKTsKdm9pZCBwcmludEVtcChFTVBMT1lFRSAqaGVhZCk7CnZvaWQgcHJpbnRFbXBTdGF0aXN0aWNzKFRPVEFMUyAqdCwgTUlOX01BWCAqbSwgaW50IHNpemUpOwoKLy8tLS0tLS0tLS0tLS0tLS0tIE1BSU4gLS0tLS0tLS0tLS0tLS0tLQoKaW50IG1haW4oKSB7CgogICAgRU1QTE9ZRUUgKmhlYWRfcHRyOwogICAgaW50IHNpemU7CgogICAgVE9UQUxTIHRvdGFscyA9IHswfTsKICAgIE1JTl9NQVggbWlubWF4ID0gezB9OwoKICAgIGhlYWRfcHRyID0gZ2V0RW1wRGF0YSgpOwogICAgc2l6ZSA9IGlzRW1wbG95ZWVTaXplKGhlYWRfcHRyKTsKCiAgICBpZiAoc2l6ZSA+IDApIHsKCiAgICAgICAgY2FsY092ZXJ0aW1lSHJzKGhlYWRfcHRyKTsKICAgICAgICBjYWxjR3Jvc3NQYXkoaGVhZF9wdHIpOwogICAgICAgIGNhbGNTdGF0ZVRheChoZWFkX3B0cik7CiAgICAgICAgY2FsY0ZlZFRheChoZWFkX3B0cik7CiAgICAgICAgY2FsY05ldFBheShoZWFkX3B0cik7CgogICAgICAgIGNhbGNFbXBsb3llZVRvdGFscyhoZWFkX3B0ciwgJnRvdGFscyk7CiAgICAgICAgY2FsY0VtcGxveWVlTWluTWF4KGhlYWRfcHRyLCAmbWlubWF4KTsKCiAgICAgICAgcHJpbnRIZWFkZXIoKTsKICAgICAgICBwcmludEVtcChoZWFkX3B0cik7CiAgICAgICAgcHJpbnRFbXBTdGF0aXN0aWNzKCZ0b3RhbHMsICZtaW5tYXgsIHNpemUpOwogICAgfQoKICAgIHByaW50ZigiXG5cbiAqKiogRW5kIG9mIFByb2dyYW0gKioqIFxuIik7CiAgICByZXR1cm4gMDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tIElOUFVUIChOTyBQUk9NUFRTKSAtLS0tLS0tLS0tLS0tLS0tCgpFTVBMT1lFRSAqZ2V0RW1wRGF0YSh2b2lkKSB7CgogICAgRU1QTE9ZRUUgKmhlYWQgPSBOVUxMLCAqY3VycmVudCA9IE5VTEw7CiAgICBjaGFyIGFuczsKCiAgICB3aGlsZSAoMSkgewoKICAgICAgICBFTVBMT1lFRSAqbm9kZSA9IG1hbGxvYyhzaXplb2YoRU1QTE9ZRUUpKTsKCiAgICAgICAgc2NhbmYoIiVzIiwgbm9kZS0+ZW1wTmFtZS5maXJzdE5hbWUpOwogICAgICAgIHNjYW5mKCIlcyIsIG5vZGUtPmVtcE5hbWUubGFzdE5hbWUpOwogICAgICAgIHNjYW5mKCIlcyIsIG5vZGUtPnRheFN0YXRlKTsKICAgICAgICBzY2FuZigiJWxkIiwgJm5vZGUtPmNsb2NrTnVtYmVyKTsKICAgICAgICBzY2FuZigiJWYiLCAmbm9kZS0+d2FnZVJhdGUpOwogICAgICAgIHNjYW5mKCIlZiIsICZub2RlLT5ob3Vycyk7CgogICAgICAgIG5vZGUtPm5leHQgPSBOVUxMOwoKICAgICAgICBpZiAoIWhlYWQpCiAgICAgICAgICAgIGhlYWQgPSBub2RlOwogICAgICAgIGVsc2UKICAgICAgICAgICAgY3VycmVudC0+bmV4dCA9IG5vZGU7CgogICAgICAgIGN1cnJlbnQgPSBub2RlOwoKICAgICAgICBzY2FuZigiICVjIiwgJmFucyk7CiAgICAgICAgaWYgKHRvdXBwZXIoYW5zKSAhPSAnWScpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiBoZWFkOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0gU0laRSAtLS0tLS0tLS0tLS0tLS0tCgppbnQgaXNFbXBsb3llZVNpemUoRU1QTE9ZRUUgKmhlYWQpIHsKICAgIGludCBjb3VudCA9IDA7CiAgICB3aGlsZSAoaGVhZCkgewogICAgICAgIGNvdW50Kys7CiAgICAgICAgaGVhZCA9IGhlYWQtPm5leHQ7CiAgICB9CiAgICByZXR1cm4gY291bnQ7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLSBDQUxDVUxBVElPTlMgLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBjYWxjT3ZlcnRpbWVIcnMoRU1QTE9ZRUUgKmgpIHsKICAgIHdoaWxlIChoKSB7CiAgICAgICAgaC0+b3ZlcnRpbWVIcnMgPSBDQUxDX09UX0hPVVJTKGgtPmhvdXJzKTsKICAgICAgICBoID0gaC0+bmV4dDsKICAgIH0KfQoKdm9pZCBjYWxjR3Jvc3NQYXkoRU1QTE9ZRUUgKmgpIHsKICAgIHdoaWxlIChoKSB7CiAgICAgICAgZmxvYXQgbm9ybWFsID0gaC0+d2FnZVJhdGUgKiAoaC0+aG91cnMgLSBoLT5vdmVydGltZUhycyk7CiAgICAgICAgZmxvYXQgb3QgPSBoLT5vdmVydGltZUhycyAqIChoLT53YWdlUmF0ZSAqIE9UX1JBVEUpOwogICAgICAgIGgtPmdyb3NzUGF5ID0gbm9ybWFsICsgb3Q7CiAgICAgICAgaCA9IGgtPm5leHQ7CiAgICB9Cn0KCnZvaWQgY2FsY1N0YXRlVGF4KEVNUExPWUVFICpoKSB7CiAgICB3aGlsZSAoaCkgewoKICAgICAgICBpZiAoc3RyY21wKGgtPnRheFN0YXRlLCAiTUEiKSA9PSAwKQogICAgICAgICAgICBoLT5zdGF0ZVRheCA9IENBTENfU1RBVEVfVEFYKGgtPmdyb3NzUGF5LCBNQV9UQVhfUkFURSk7CiAgICAgICAgZWxzZSBpZiAoc3RyY21wKGgtPnRheFN0YXRlLCAiTkgiKSA9PSAwKQogICAgICAgICAgICBoLT5zdGF0ZVRheCA9IDA7CiAgICAgICAgZWxzZSBpZiAoc3RyY21wKGgtPnRheFN0YXRlLCAiVlQiKSA9PSAwKQogICAgICAgICAgICBoLT5zdGF0ZVRheCA9IENBTENfU1RBVEVfVEFYKGgtPmdyb3NzUGF5LCBWVF9UQVhfUkFURSk7CiAgICAgICAgZWxzZSBpZiAoc3RyY21wKGgtPnRheFN0YXRlLCAiQ0EiKSA9PSAwKQogICAgICAgICAgICBoLT5zdGF0ZVRheCA9IENBTENfU1RBVEVfVEFYKGgtPmdyb3NzUGF5LCBDQV9UQVhfUkFURSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBoLT5zdGF0ZVRheCA9IENBTENfU1RBVEVfVEFYKGgtPmdyb3NzUGF5LCBERUZBVUxUX1NUQVRFX1RBWF9SQVRFKTsKCiAgICAgICAgaCA9IGgtPm5leHQ7CiAgICB9Cn0KCi8vIEZJWEVEIE1BQ1JPIFVTRUQKdm9pZCBjYWxjRmVkVGF4KEVNUExPWUVFICpoKSB7CiAgICB3aGlsZSAoaCkgewogICAgICAgIGgtPmZlZFRheCA9IENBTENfRkVEX1RBWChoLT5ncm9zc1BheSk7CiAgICAgICAgaCA9IGgtPm5leHQ7CiAgICB9Cn0KCnZvaWQgY2FsY05ldFBheShFTVBMT1lFRSAqaCkgewogICAgd2hpbGUgKGgpIHsKICAgICAgICBoLT5uZXRQYXkgPSBDQUxDX05FVF9QQVkoaC0+Z3Jvc3NQYXksIGgtPnN0YXRlVGF4LCBoLT5mZWRUYXgpOwogICAgICAgIGggPSBoLT5uZXh0OwogICAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0gVE9UQUxTIC0tLS0tLS0tLS0tLS0tLS0KCnZvaWQgY2FsY0VtcGxveWVlVG90YWxzKEVNUExPWUVFICpoLCBUT1RBTFMgKnQpIHsKICAgIHdoaWxlIChoKSB7CiAgICAgICAgdC0+dG90YWxfd2FnZVJhdGUgKz0gaC0+d2FnZVJhdGU7CiAgICAgICAgdC0+dG90YWxfaG91cnMgKz0gaC0+aG91cnM7CiAgICAgICAgdC0+dG90YWxfb3ZlcnRpbWVIcnMgKz0gaC0+b3ZlcnRpbWVIcnM7CiAgICAgICAgdC0+dG90YWxfZ3Jvc3NQYXkgKz0gaC0+Z3Jvc3NQYXk7CiAgICAgICAgdC0+dG90YWxfc3RhdGVUYXggKz0gaC0+c3RhdGVUYXg7CiAgICAgICAgdC0+dG90YWxfZmVkVGF4ICs9IGgtPmZlZFRheDsKICAgICAgICB0LT50b3RhbF9uZXRQYXkgKz0gaC0+bmV0UGF5OwogICAgICAgIGggPSBoLT5uZXh0OwogICAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0gTUlOL01BWCAtLS0tLS0tLS0tLS0tLS0tCgp2b2lkIGNhbGNFbXBsb3llZU1pbk1heChFTVBMT1lFRSAqaCwgTUlOX01BWCAqbSkgewoKICAgIEVNUExPWUVFICpwID0gaDsKCiAgICBtLT5taW5fd2FnZVJhdGUgPSBtLT5tYXhfd2FnZVJhdGUgPSBwLT53YWdlUmF0ZTsKICAgIG0tPm1pbl9ob3VycyA9IG0tPm1heF9ob3VycyA9IHAtPmhvdXJzOwogICAgbS0+bWluX292ZXJ0aW1lSHJzID0gbS0+bWF4X292ZXJ0aW1lSHJzID0gcC0+b3ZlcnRpbWVIcnM7CiAgICBtLT5taW5fZ3Jvc3NQYXkgPSBtLT5tYXhfZ3Jvc3NQYXkgPSBwLT5ncm9zc1BheTsKICAgIG0tPm1pbl9zdGF0ZVRheCA9IG0tPm1heF9zdGF0ZVRheCA9IHAtPnN0YXRlVGF4OwogICAgbS0+bWluX2ZlZFRheCA9IG0tPm1heF9mZWRUYXggPSBwLT5mZWRUYXg7CiAgICBtLT5taW5fbmV0UGF5ID0gbS0+bWF4X25ldFBheSA9IHAtPm5ldFBheTsKCiAgICBwID0gcC0+bmV4dDsKCiAgICB3aGlsZSAocCkgewoKICAgICAgICBtLT5taW5fd2FnZVJhdGUgPSBDQUxDX01JTihwLT53YWdlUmF0ZSwgbS0+bWluX3dhZ2VSYXRlKTsKICAgICAgICBtLT5tYXhfd2FnZVJhdGUgPSBDQUxDX01BWChwLT53YWdlUmF0ZSwgbS0+bWF4X3dhZ2VSYXRlKTsKCiAgICAgICAgbS0+bWluX2hvdXJzID0gQ0FMQ19NSU4ocC0+aG91cnMsIG0tPm1pbl9ob3Vycyk7CiAgICAgICAgbS0+bWF4X2hvdXJzID0gQ0FMQ19NQVgocC0+aG91cnMsIG0tPm1heF9ob3Vycyk7CgogICAgICAgIG0tPm1pbl9vdmVydGltZUhycyA9IENBTENfTUlOKHAtPm92ZXJ0aW1lSHJzLCBtLT5taW5fb3ZlcnRpbWVIcnMpOwogICAgICAgIG0tPm1heF9vdmVydGltZUhycyA9IENBTENfTUFYKHAtPm92ZXJ0aW1lSHJzLCBtLT5tYXhfb3ZlcnRpbWVIcnMpOwoKICAgICAgICBtLT5taW5fZ3Jvc3NQYXkgPSBDQUxDX01JTihwLT5ncm9zc1BheSwgbS0+bWluX2dyb3NzUGF5KTsKICAgICAgICBtLT5tYXhfZ3Jvc3NQYXkgPSBDQUxDX01BWChwLT5ncm9zc1BheSwgbS0+bWF4X2dyb3NzUGF5KTsKCiAgICAgICAgbS0+bWluX3N0YXRlVGF4ID0gQ0FMQ19NSU4ocC0+c3RhdGVUYXgsIG0tPm1pbl9zdGF0ZVRheCk7CiAgICAgICAgbS0+bWF4X3N0YXRlVGF4ID0gQ0FMQ19NQVgocC0+c3RhdGVUYXgsIG0tPm1heF9zdGF0ZVRheCk7CgogICAgICAgIG0tPm1pbl9mZWRUYXggPSBDQUxDX01JTihwLT5mZWRUYXgsIG0tPm1pbl9mZWRUYXgpOwogICAgICAgIG0tPm1heF9mZWRUYXggPSBDQUxDX01BWChwLT5mZWRUYXgsIG0tPm1heF9mZWRUYXgpOwoKICAgICAgICBtLT5taW5fbmV0UGF5ID0gQ0FMQ19NSU4ocC0+bmV0UGF5LCBtLT5taW5fbmV0UGF5KTsKICAgICAgICBtLT5tYXhfbmV0UGF5ID0gQ0FMQ19NQVgocC0+bmV0UGF5LCBtLT5tYXhfbmV0UGF5KTsKCiAgICAgICAgcCA9IHAtPm5leHQ7CiAgICB9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLSBPVVRQVVQgRklYRUQgRk9STUFUIC0tLS0tLS0tLS0tLS0tLS0KCnZvaWQgcHJpbnRIZWFkZXIodm9pZCkgewoKICAgIHByaW50ZigiXG4qKiogUGF5IENhbGN1bGF0b3IgKioqXG4iKTsKCiAgICBwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CiAgICBwcmludGYoIlxuTmFtZSAgICAgICAgICAgICAgICBUYXggIENsb2NrIyAgV2FnZSAgIEhvdXJzICBPVCAgIEdyb3NzICAgU3RhdGUgIEZlZCAgICAgIE5ldCIpOwogICAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXkgICAgIFRheCAgICBUYXggICAgICBQYXkiKTsKICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKfQoKdm9pZCBwcmludEVtcChFTVBMT1lFRSAqaCkgewoKICAgIHdoaWxlIChoKSB7CgogICAgICAgIGNoYXIgbmFtZVsyNV07CiAgICAgICAgc3RyY3B5KG5hbWUsIGgtPmVtcE5hbWUuZmlyc3ROYW1lKTsKICAgICAgICBzdHJjYXQobmFtZSwgIiAiKTsKICAgICAgICBzdHJjYXQobmFtZSwgaC0+ZW1wTmFtZS5sYXN0TmFtZSk7CgogICAgICAgIHByaW50ZigiXG4lLTIwLjIwcyAlLTIuMnMgICUwNmxkICAlNS4yZiAgJTQuMWYgICU0LjFmICAlNy4yZiAlNi4yZiAlNy4yZiAlOC4yZiIsCiAgICAgICAgICAgIG5hbWUsIGgtPnRheFN0YXRlLCBoLT5jbG9ja051bWJlciwKICAgICAgICAgICAgaC0+d2FnZVJhdGUsIGgtPmhvdXJzLCBoLT5vdmVydGltZUhycywKICAgICAgICAgICAgaC0+Z3Jvc3NQYXksIGgtPnN0YXRlVGF4LCBoLT5mZWRUYXgsIGgtPm5ldFBheSk7CgogICAgICAgIGggPSBoLT5uZXh0OwogICAgfQp9CgovLy0tLS0tLS0tLS0tLS0tLS0gU1RBVFMgLS0tLS0tLS0tLS0tLS0tLQoKdm9pZCBwcmludEVtcFN0YXRpc3RpY3MoVE9UQUxTICp0LCBNSU5fTUFYICptLCBpbnQgc2l6ZSkgewoKICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKCiAgICBwcmludGYoIlxuVG90YWxzOiAgICAgICAgICAgICAgICAgICAgICAgICAgJTUuMmYgJTUuMWYgJTUuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmYiLAogICAgICAgIHQtPnRvdGFsX3dhZ2VSYXRlLAogICAgICAgIHQtPnRvdGFsX2hvdXJzLAogICAgICAgIHQtPnRvdGFsX292ZXJ0aW1lSHJzLAogICAgICAgIHQtPnRvdGFsX2dyb3NzUGF5LAogICAgICAgIHQtPnRvdGFsX3N0YXRlVGF4LAogICAgICAgIHQtPnRvdGFsX2ZlZFRheCwKICAgICAgICB0LT50b3RhbF9uZXRQYXkpOwoKICAgIHByaW50ZigiXG5BdmVyYWdlczogICAgICAgICAgICAgICAgICAgICAgICAlNS4yZiAlNS4xZiAlNS4xZiAlNy4yZiAlNi4yZiAlNy4yZiAlOC4yZiIsCiAgICAgICAgdC0+dG90YWxfd2FnZVJhdGUvc2l6ZSwKICAgICAgICB0LT50b3RhbF9ob3Vycy9zaXplLAogICAgICAgIHQtPnRvdGFsX292ZXJ0aW1lSHJzL3NpemUsCiAgICAgICAgdC0+dG90YWxfZ3Jvc3NQYXkvc2l6ZSwKICAgICAgICB0LT50b3RhbF9zdGF0ZVRheC9zaXplLAogICAgICAgIHQtPnRvdGFsX2ZlZFRheC9zaXplLAogICAgICAgIHQtPnRvdGFsX25ldFBheS9zaXplKTsKCiAgICBwcmludGYoIlxuTWluaW11bTogICAgICAgICAgICAgICAgICAgICAgICAgJTUuMmYgJTUuMWYgJTUuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmYiLAogICAgICAgIG0tPm1pbl93YWdlUmF0ZSwKICAgICAgICBtLT5taW5faG91cnMsCiAgICAgICAgbS0+bWluX292ZXJ0aW1lSHJzLAogICAgICAgIG0tPm1pbl9ncm9zc1BheSwKICAgICAgICBtLT5taW5fc3RhdGVUYXgsCiAgICAgICAgbS0+bWluX2ZlZFRheCwKICAgICAgICBtLT5taW5fbmV0UGF5KTsKCiAgICBwcmludGYoIlxuTWF4aW11bTogICAgICAgICAgICAgICAgICAgICAgICAgJTUuMmYgJTUuMWYgJTUuMWYgJTcuMmYgJTYuMmYgJTcuMmYgJTguMmYiLAogICAgICAgIG0tPm1heF93YWdlUmF0ZSwKICAgICAgICBtLT5tYXhfaG91cnMsCiAgICAgICAgbS0+bWF4X292ZXJ0aW1lSHJzLAogICAgICAgIG0tPm1heF9ncm9zc1BheSwKICAgICAgICBtLT5tYXhfc3RhdGVUYXgsCiAgICAgICAgbS0+bWF4X2ZlZFRheCwKICAgICAgICBtLT5tYXhfbmV0UGF5KTsKCiAgICBwcmludGYoIlxuXG5UaGUgdG90YWwgZW1wbG95ZWVzIHByb2Nlc3NlZCB3YXM6ICVkXG4iLCBzaXplKTsKfQ==