//********************************************************
//
// Assignment 10 - Linked Lists, Typedef, and Macros
//
// Name: John Semenuk
//
// Class: C Programming, Spring 2026
//
// Date: April 20, 2026
//
//********************************************************
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
// 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 TAX_STATE_SIZE 3
#define FED_TAX_RATE 0.25
#define FIRST_NAME_SIZE 10
#define LAST_NAME_SIZE 10
// 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,o) (w * (h - o))
#define CALC_OT_PAY(w,o) (o * (OT_RATE * w))
#define CALC_MIN(v,m) ((v < m) ? v : m)
#define CALC_MAX(v,m) ((v > m) ? v : m)
// structures
struct name {
char firstName[ FIRST_NAME_SIZE] ;
char lastName[ LAST_NAME_SIZE] ;
} ;
typedef struct employee {
struct name empName;
char taxState[ TAX_STATE_SIZE] ;
long int clockNumber;
float wageRate, hours, overtimeHrs;
float grossPay, stateTax, fedTax, netPay;
struct employee * next;
} EMPLOYEE;
typedef struct totals {
float total_wageRate, total_hours, total_overtimeHrs;
float total_grossPay, total_stateTax, total_fedTax, total_netPay;
} TOTALS;
typedef struct min_max {
float min_wageRate, min_hours, min_overtimeHrs;
float min_grossPay, min_stateTax, min_fedTax, min_netPay;
float max_wageRate, max_hours, max_overtimeHrs;
float max_grossPay, max_stateTax, max_fedTax, max_netPay;
} MIN_MAX;
// prototypes
EMPLOYEE * getEmpData( void ) ;
int isEmployeeSize( EMPLOYEE * ) ;
void calcOvertimeHrs( EMPLOYEE * ) ;
void calcGrossPay( EMPLOYEE * ) ;
void calcStateTax( EMPLOYEE * ) ;
void calcFedTax( EMPLOYEE * ) ;
void calcNetPay( EMPLOYEE * ) ;
void calcEmployeeTotals( EMPLOYEE *, TOTALS * ) ;
void calcEmployeeMinMax( EMPLOYEE *, MIN_MAX * ) ;
void printHeader( void ) ;
void printEmp( EMPLOYEE * ) ;
void printEmpStatistics( TOTALS *, MIN_MAX *, int ) ;
//********************************************************
int main( ) {
EMPLOYEE * head_ptr;
int size;
TOTALS totals = { 0 } ;
MIN_MAX minmax = { 0 } ;
head_ptr = getEmpData( ) ;
size = isEmployeeSize( head_ptr) ;
if ( size <= 0 ) {
return 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 ;
}
//********************************************************
EMPLOYEE * getEmpData( void ) {
EMPLOYEE * head = NULL, * curr = NULL;
char cont = 'y' ;
while ( cont == 'y' || cont == 'Y' ) {
EMPLOYEE
* node
= malloc ( sizeof ( EMPLOYEE
) ) ;
printf ( "First name: " ) ; scanf ( "%s" , node
-> empName.
firstName ) ; printf ( "Last name: " ) ; scanf ( "%s" , node
-> empName.
lastName ) ;
node-> next = NULL;
if ( ! head) head = node;
else curr-> next = node;
curr = node;
printf ( "Add another? (y/n): " ) ; }
return head;
}
//********************************************************
int isEmployeeSize( EMPLOYEE * h) {
int count = 0 ;
while ( h) { count++; h = h-> next; }
return count;
}
//********************************************************
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) {
float rate = DEFAULT_STATE_TAX_RATE;
if ( ! strcmp ( h
-> taxState
, "MA" ) ) rate
= MA_TAX_RATE
; else if ( ! strcmp ( h
-> taxState
, "VT" ) ) rate
= VT_TAX_RATE
; else if ( ! strcmp ( h
-> taxState
, "NH" ) ) rate
= NH_TAX_RATE
; else if ( ! strcmp ( h
-> taxState
, "CA" ) ) rate
= CA_TAX_RATE
;
h-> stateTax = CALC_STATE_TAX( h-> grossPay, 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) ;
}
//********************************************************
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;
}
}
//********************************************************
void calcEmployeeMinMax( EMPLOYEE * h, MIN_MAX * m) {
* m = ( MIN_MAX) {
h-> wageRate, h-> hours, h-> overtimeHrs, h-> grossPay, h-> stateTax, h-> fedTax, h-> netPay,
h-> wageRate, h-> hours, h-> overtimeHrs, h-> grossPay, h-> stateTax, h-> fedTax, h-> netPay
} ;
for ( h = h-> next; h; h = h-> next) {
m-> min_wageRate = CALC_MIN( h-> wageRate, m-> min_wageRate) ;
m-> max_wageRate = CALC_MAX( h-> wageRate, m-> max_wageRate) ;
m-> min_hours = CALC_MIN( h-> hours, m-> min_hours) ;
m-> max_hours = CALC_MAX( h-> hours, m-> max_hours) ;
m-> min_overtimeHrs = CALC_MIN( h-> overtimeHrs, m-> min_overtimeHrs) ;
m-> max_overtimeHrs = CALC_MAX( h-> overtimeHrs, m-> max_overtimeHrs) ;
m-> min_grossPay = CALC_MIN( h-> grossPay, m-> min_grossPay) ;
m-> max_grossPay = CALC_MAX( h-> grossPay, m-> max_grossPay) ;
m-> min_stateTax = CALC_MIN( h-> stateTax, m-> min_stateTax) ;
m-> max_stateTax = CALC_MAX( h-> stateTax, m-> max_stateTax) ;
m-> min_fedTax = CALC_MIN( h-> fedTax, m-> min_fedTax) ;
m-> max_fedTax = CALC_MAX( h-> fedTax, m-> max_fedTax) ;
m-> min_netPay = CALC_MIN( h-> netPay, m-> min_netPay) ;
m-> max_netPay = CALC_MAX( h-> netPay, m-> max_netPay) ;
}
}
//********************************************************
void printHeader( void ) {
printf ( "\n *** Pay Calculator ***\n " ) ; }
//********************************************************
void printEmp( EMPLOYEE * h) {
for ( ; h; h = h-> next)
h-> empName.firstName ,
h-> empName.lastName ,
h-> netPay) ;
}
//********************************************************
void printEmpStatistics( TOTALS * t, MIN_MAX * m, int n) {
printf ( "\n Totals Net: %.2f" , t
-> total_netPay
) ; printf ( "\n Min Net: %.2f" , m
-> min_netPay
) ; printf ( "\n Max Net: %.2f\n " , m
-> max_netPay
) ; }
Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLwovLyBBc3NpZ25tZW50IDEwIC0gTGlua2VkIExpc3RzLCBUeXBlZGVmLCBhbmQgTWFjcm9zCi8vCi8vIE5hbWU6IEpvaG4gU2VtZW51awovLwovLyBDbGFzczogQyBQcm9ncmFtbWluZywgU3ByaW5nIDIwMjYKLy8KLy8gRGF0ZTogQXByaWwgMjAsIDIwMjYKLy8KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCi8vIGNvbnN0YW50cwojZGVmaW5lIFNURF9IT1VSUyA0MC4wCiNkZWZpbmUgT1RfUkFURSAxLjUKI2RlZmluZSBNQV9UQVhfUkFURSAwLjA1CiNkZWZpbmUgTkhfVEFYX1JBVEUgMC4wCiNkZWZpbmUgVlRfVEFYX1JBVEUgMC4wNgojZGVmaW5lIENBX1RBWF9SQVRFIDAuMDcKI2RlZmluZSBERUZBVUxUX1NUQVRFX1RBWF9SQVRFIDAuMDgKI2RlZmluZSBUQVhfU1RBVEVfU0laRSAzCiNkZWZpbmUgRkVEX1RBWF9SQVRFIDAuMjUKI2RlZmluZSBGSVJTVF9OQU1FX1NJWkUgMTAKI2RlZmluZSBMQVNUX05BTUVfU0laRSAxMAoKLy8gbWFjcm9zCiNkZWZpbmUgQ0FMQ19PVF9IT1VSUyhoKSAoKGggPiBTVERfSE9VUlMpID8gaCAtIFNURF9IT1VSUyA6IDApCiNkZWZpbmUgQ0FMQ19TVEFURV9UQVgocCxyKSAocCAqIHIpCiNkZWZpbmUgQ0FMQ19GRURfVEFYKHApIChwICogRkVEX1RBWF9SQVRFKQojZGVmaW5lIENBTENfTkVUX1BBWShwLHMsZikgKHAgLSAocyArIGYpKQojZGVmaW5lIENBTENfTk9STUFMX1BBWSh3LGgsbykgKHcgKiAoaCAtIG8pKQojZGVmaW5lIENBTENfT1RfUEFZKHcsbykgKG8gKiAoT1RfUkFURSAqIHcpKQojZGVmaW5lIENBTENfTUlOKHYsbSkgKCh2IDwgbSkgPyB2IDogbSkKI2RlZmluZSBDQUxDX01BWCh2LG0pICgodiA+IG0pID8gdiA6IG0pCgovLyBzdHJ1Y3R1cmVzCnN0cnVjdCBuYW1lIHsKICAgIGNoYXIgZmlyc3ROYW1lW0ZJUlNUX05BTUVfU0laRV07CiAgICBjaGFyIGxhc3ROYW1lW0xBU1RfTkFNRV9TSVpFXTsKfTsKCnR5cGVkZWYgc3RydWN0IGVtcGxveWVlIHsKICAgIHN0cnVjdCBuYW1lIGVtcE5hbWU7CiAgICBjaGFyIHRheFN0YXRlW1RBWF9TVEFURV9TSVpFXTsKICAgIGxvbmcgaW50IGNsb2NrTnVtYmVyOwogICAgZmxvYXQgd2FnZVJhdGUsIGhvdXJzLCBvdmVydGltZUhyczsKICAgIGZsb2F0IGdyb3NzUGF5LCBzdGF0ZVRheCwgZmVkVGF4LCBuZXRQYXk7CiAgICBzdHJ1Y3QgZW1wbG95ZWUgKm5leHQ7Cn0gRU1QTE9ZRUU7Cgp0eXBlZGVmIHN0cnVjdCB0b3RhbHMgewogICAgZmxvYXQgdG90YWxfd2FnZVJhdGUsIHRvdGFsX2hvdXJzLCB0b3RhbF9vdmVydGltZUhyczsKICAgIGZsb2F0IHRvdGFsX2dyb3NzUGF5LCB0b3RhbF9zdGF0ZVRheCwgdG90YWxfZmVkVGF4LCB0b3RhbF9uZXRQYXk7Cn0gVE9UQUxTOwoKdHlwZWRlZiBzdHJ1Y3QgbWluX21heCB7CiAgICBmbG9hdCBtaW5fd2FnZVJhdGUsIG1pbl9ob3VycywgbWluX292ZXJ0aW1lSHJzOwogICAgZmxvYXQgbWluX2dyb3NzUGF5LCBtaW5fc3RhdGVUYXgsIG1pbl9mZWRUYXgsIG1pbl9uZXRQYXk7CiAgICBmbG9hdCBtYXhfd2FnZVJhdGUsIG1heF9ob3VycywgbWF4X292ZXJ0aW1lSHJzOwogICAgZmxvYXQgbWF4X2dyb3NzUGF5LCBtYXhfc3RhdGVUYXgsIG1heF9mZWRUYXgsIG1heF9uZXRQYXk7Cn0gTUlOX01BWDsKCi8vIHByb3RvdHlwZXMKRU1QTE9ZRUUgKiBnZXRFbXBEYXRhKHZvaWQpOwppbnQgaXNFbXBsb3llZVNpemUoRU1QTE9ZRUUgKik7CnZvaWQgY2FsY092ZXJ0aW1lSHJzKEVNUExPWUVFICopOwp2b2lkIGNhbGNHcm9zc1BheShFTVBMT1lFRSAqKTsKdm9pZCBjYWxjU3RhdGVUYXgoRU1QTE9ZRUUgKik7CnZvaWQgY2FsY0ZlZFRheChFTVBMT1lFRSAqKTsKdm9pZCBjYWxjTmV0UGF5KEVNUExPWUVFICopOwp2b2lkIGNhbGNFbXBsb3llZVRvdGFscyhFTVBMT1lFRSAqLCBUT1RBTFMgKik7CnZvaWQgY2FsY0VtcGxveWVlTWluTWF4KEVNUExPWUVFICosIE1JTl9NQVggKik7CnZvaWQgcHJpbnRIZWFkZXIodm9pZCk7CnZvaWQgcHJpbnRFbXAoRU1QTE9ZRUUgKik7CnZvaWQgcHJpbnRFbXBTdGF0aXN0aWNzKFRPVEFMUyAqLCBNSU5fTUFYICosIGludCk7CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgppbnQgbWFpbigpIHsKICAgIEVNUExPWUVFICpoZWFkX3B0cjsKICAgIGludCBzaXplOwoKICAgIFRPVEFMUyB0b3RhbHMgPSB7MH07CiAgICBNSU5fTUFYIG1pbm1heCA9IHswfTsKCiAgICBoZWFkX3B0ciA9IGdldEVtcERhdGEoKTsKICAgIHNpemUgPSBpc0VtcGxveWVlU2l6ZShoZWFkX3B0cik7CgogICAgaWYgKHNpemUgPD0gMCkgewogICAgICAgIHByaW50ZigiXG5ObyBkYXRhLlxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgY2FsY092ZXJ0aW1lSHJzKGhlYWRfcHRyKTsKICAgIGNhbGNHcm9zc1BheShoZWFkX3B0cik7CiAgICBjYWxjU3RhdGVUYXgoaGVhZF9wdHIpOwogICAgY2FsY0ZlZFRheChoZWFkX3B0cik7CiAgICBjYWxjTmV0UGF5KGhlYWRfcHRyKTsKCiAgICBjYWxjRW1wbG95ZWVUb3RhbHMoaGVhZF9wdHIsICZ0b3RhbHMpOwogICAgY2FsY0VtcGxveWVlTWluTWF4KGhlYWRfcHRyLCAmbWlubWF4KTsKCiAgICBwcmludEhlYWRlcigpOwogICAgcHJpbnRFbXAoaGVhZF9wdHIpOwogICAgcHJpbnRFbXBTdGF0aXN0aWNzKCZ0b3RhbHMsICZtaW5tYXgsIHNpemUpOwoKICAgIHByaW50ZigiXG5cbiAqKiogRW5kIG9mIFByb2dyYW0gKioqXG4iKTsKICAgIHJldHVybiAwOwp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgpFTVBMT1lFRSAqIGdldEVtcERhdGEodm9pZCkgewogICAgRU1QTE9ZRUUgKmhlYWQgPSBOVUxMLCAqY3VyciA9IE5VTEw7CiAgICBjaGFyIGNvbnQgPSAneSc7CgogICAgd2hpbGUgKGNvbnQgPT0gJ3knIHx8IGNvbnQgPT0gJ1knKSB7CiAgICAgICAgRU1QTE9ZRUUgKm5vZGUgPSBtYWxsb2Moc2l6ZW9mKEVNUExPWUVFKSk7CgogICAgICAgIHByaW50ZigiRmlyc3QgbmFtZTogIik7IHNjYW5mKCIlcyIsIG5vZGUtPmVtcE5hbWUuZmlyc3ROYW1lKTsKICAgICAgICBwcmludGYoIkxhc3QgbmFtZTogIik7IHNjYW5mKCIlcyIsIG5vZGUtPmVtcE5hbWUubGFzdE5hbWUpOwogICAgICAgIHByaW50ZigiU3RhdGU6ICIpOyBzY2FuZigiJXMiLCBub2RlLT50YXhTdGF0ZSk7CiAgICAgICAgcHJpbnRmKCJDbG9jayM6ICIpOyBzY2FuZigiJWxpIiwgJm5vZGUtPmNsb2NrTnVtYmVyKTsKICAgICAgICBwcmludGYoIldhZ2U6ICIpOyBzY2FuZigiJWYiLCAmbm9kZS0+d2FnZVJhdGUpOwogICAgICAgIHByaW50ZigiSG91cnM6ICIpOyBzY2FuZigiJWYiLCAmbm9kZS0+aG91cnMpOwoKICAgICAgICBub2RlLT5uZXh0ID0gTlVMTDsKCiAgICAgICAgaWYgKCFoZWFkKSBoZWFkID0gbm9kZTsKICAgICAgICBlbHNlIGN1cnItPm5leHQgPSBub2RlOwoKICAgICAgICBjdXJyID0gbm9kZTsKCiAgICAgICAgcHJpbnRmKCJBZGQgYW5vdGhlcj8gKHkvbik6ICIpOwogICAgICAgIHNjYW5mKCIgJWMiLCAmY29udCk7CiAgICB9CiAgICByZXR1cm4gaGVhZDsKfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKaW50IGlzRW1wbG95ZWVTaXplKEVNUExPWUVFICpoKSB7CiAgICBpbnQgY291bnQgPSAwOwogICAgd2hpbGUgKGgpIHsgY291bnQrKzsgaCA9IGgtPm5leHQ7IH0KICAgIHJldHVybiBjb3VudDsKfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKdm9pZCBjYWxjT3ZlcnRpbWVIcnMoRU1QTE9ZRUUgKmgpIHsKICAgIGZvciAoOyBoOyBoID0gaC0+bmV4dCkKICAgICAgICBoLT5vdmVydGltZUhycyA9IENBTENfT1RfSE9VUlMoaC0+aG91cnMpOwp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgp2b2lkIGNhbGNHcm9zc1BheShFTVBMT1lFRSAqaCkgewogICAgZm9yICg7IGg7IGggPSBoLT5uZXh0KQogICAgICAgIGgtPmdyb3NzUGF5ID0KICAgICAgICAgICAgQ0FMQ19OT1JNQUxfUEFZKGgtPndhZ2VSYXRlLGgtPmhvdXJzLGgtPm92ZXJ0aW1lSHJzKSArCiAgICAgICAgICAgIENBTENfT1RfUEFZKGgtPndhZ2VSYXRlLGgtPm92ZXJ0aW1lSHJzKTsKfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKdm9pZCBjYWxjU3RhdGVUYXgoRU1QTE9ZRUUgKmgpIHsKICAgIGZvciAoOyBoOyBoID0gaC0+bmV4dCkgewogICAgICAgIGZsb2F0IHJhdGUgPSBERUZBVUxUX1NUQVRFX1RBWF9SQVRFOwoKICAgICAgICBpZiAoIXN0cmNtcChoLT50YXhTdGF0ZSwiTUEiKSkgcmF0ZSA9IE1BX1RBWF9SQVRFOwogICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoaC0+dGF4U3RhdGUsIlZUIikpIHJhdGUgPSBWVF9UQVhfUkFURTsKICAgICAgICBlbHNlIGlmICghc3RyY21wKGgtPnRheFN0YXRlLCJOSCIpKSByYXRlID0gTkhfVEFYX1JBVEU7CiAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChoLT50YXhTdGF0ZSwiQ0EiKSkgcmF0ZSA9IENBX1RBWF9SQVRFOwoKICAgICAgICBoLT5zdGF0ZVRheCA9IENBTENfU1RBVEVfVEFYKGgtPmdyb3NzUGF5LCByYXRlKTsKICAgIH0KfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKdm9pZCBjYWxjRmVkVGF4KEVNUExPWUVFICpoKSB7CiAgICBmb3IgKDsgaDsgaCA9IGgtPm5leHQpCiAgICAgICAgaC0+ZmVkVGF4ID0gQ0FMQ19GRURfVEFYKGgtPmdyb3NzUGF5KTsKfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKdm9pZCBjYWxjTmV0UGF5KEVNUExPWUVFICpoKSB7CiAgICBmb3IgKDsgaDsgaCA9IGgtPm5leHQpCiAgICAgICAgaC0+bmV0UGF5ID0gQ0FMQ19ORVRfUEFZKGgtPmdyb3NzUGF5LGgtPnN0YXRlVGF4LGgtPmZlZFRheCk7Cn0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCnZvaWQgY2FsY0VtcGxveWVlVG90YWxzKEVNUExPWUVFICpoLCBUT1RBTFMgKnQpIHsKICAgIGZvciAoOyBoOyBoID0gaC0+bmV4dCkgewogICAgICAgIHQtPnRvdGFsX3dhZ2VSYXRlICs9IGgtPndhZ2VSYXRlOwogICAgICAgIHQtPnRvdGFsX2hvdXJzICs9IGgtPmhvdXJzOwogICAgICAgIHQtPnRvdGFsX292ZXJ0aW1lSHJzICs9IGgtPm92ZXJ0aW1lSHJzOwogICAgICAgIHQtPnRvdGFsX2dyb3NzUGF5ICs9IGgtPmdyb3NzUGF5OwogICAgICAgIHQtPnRvdGFsX3N0YXRlVGF4ICs9IGgtPnN0YXRlVGF4OwogICAgICAgIHQtPnRvdGFsX2ZlZFRheCArPSBoLT5mZWRUYXg7CiAgICAgICAgdC0+dG90YWxfbmV0UGF5ICs9IGgtPm5ldFBheTsKICAgIH0KfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKdm9pZCBjYWxjRW1wbG95ZWVNaW5NYXgoRU1QTE9ZRUUgKmgsIE1JTl9NQVggKm0pIHsKICAgICptID0gKE1JTl9NQVgpewogICAgICAgIGgtPndhZ2VSYXRlLGgtPmhvdXJzLGgtPm92ZXJ0aW1lSHJzLGgtPmdyb3NzUGF5LGgtPnN0YXRlVGF4LGgtPmZlZFRheCxoLT5uZXRQYXksCiAgICAgICAgaC0+d2FnZVJhdGUsaC0+aG91cnMsaC0+b3ZlcnRpbWVIcnMsaC0+Z3Jvc3NQYXksaC0+c3RhdGVUYXgsaC0+ZmVkVGF4LGgtPm5ldFBheQogICAgfTsKCiAgICBmb3IgKGggPSBoLT5uZXh0OyBoOyBoID0gaC0+bmV4dCkgewogICAgICAgIG0tPm1pbl93YWdlUmF0ZSA9IENBTENfTUlOKGgtPndhZ2VSYXRlLG0tPm1pbl93YWdlUmF0ZSk7CiAgICAgICAgbS0+bWF4X3dhZ2VSYXRlID0gQ0FMQ19NQVgoaC0+d2FnZVJhdGUsbS0+bWF4X3dhZ2VSYXRlKTsKCiAgICAgICAgbS0+bWluX2hvdXJzID0gQ0FMQ19NSU4oaC0+aG91cnMsbS0+bWluX2hvdXJzKTsKICAgICAgICBtLT5tYXhfaG91cnMgPSBDQUxDX01BWChoLT5ob3VycyxtLT5tYXhfaG91cnMpOwoKICAgICAgICBtLT5taW5fb3ZlcnRpbWVIcnMgPSBDQUxDX01JTihoLT5vdmVydGltZUhycyxtLT5taW5fb3ZlcnRpbWVIcnMpOwogICAgICAgIG0tPm1heF9vdmVydGltZUhycyA9IENBTENfTUFYKGgtPm92ZXJ0aW1lSHJzLG0tPm1heF9vdmVydGltZUhycyk7CgogICAgICAgIG0tPm1pbl9ncm9zc1BheSA9IENBTENfTUlOKGgtPmdyb3NzUGF5LG0tPm1pbl9ncm9zc1BheSk7CiAgICAgICAgbS0+bWF4X2dyb3NzUGF5ID0gQ0FMQ19NQVgoaC0+Z3Jvc3NQYXksbS0+bWF4X2dyb3NzUGF5KTsKCiAgICAgICAgbS0+bWluX3N0YXRlVGF4ID0gQ0FMQ19NSU4oaC0+c3RhdGVUYXgsbS0+bWluX3N0YXRlVGF4KTsKICAgICAgICBtLT5tYXhfc3RhdGVUYXggPSBDQUxDX01BWChoLT5zdGF0ZVRheCxtLT5tYXhfc3RhdGVUYXgpOwoKICAgICAgICBtLT5taW5fZmVkVGF4ID0gQ0FMQ19NSU4oaC0+ZmVkVGF4LG0tPm1pbl9mZWRUYXgpOwogICAgICAgIG0tPm1heF9mZWRUYXggPSBDQUxDX01BWChoLT5mZWRUYXgsbS0+bWF4X2ZlZFRheCk7CgogICAgICAgIG0tPm1pbl9uZXRQYXkgPSBDQUxDX01JTihoLT5uZXRQYXksbS0+bWluX25ldFBheSk7CiAgICAgICAgbS0+bWF4X25ldFBheSA9IENBTENfTUFYKGgtPm5ldFBheSxtLT5tYXhfbmV0UGF5KTsKICAgIH0KfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKdm9pZCBwcmludEhlYWRlcih2b2lkKSB7CiAgICBwcmludGYoIlxuKioqIFBheSBDYWxjdWxhdG9yICoqKlxuIik7Cn0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCnZvaWQgcHJpbnRFbXAoRU1QTE9ZRUUgKmgpIHsKICAgIGZvciAoOyBoOyBoID0gaC0+bmV4dCkKICAgICAgICBwcmludGYoIiVzICVzIE5ldDogJS4yZlxuIiwKICAgICAgICAgICAgaC0+ZW1wTmFtZS5maXJzdE5hbWUsCiAgICAgICAgICAgIGgtPmVtcE5hbWUubGFzdE5hbWUsCiAgICAgICAgICAgIGgtPm5ldFBheSk7Cn0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCnZvaWQgcHJpbnRFbXBTdGF0aXN0aWNzKFRPVEFMUyAqdCwgTUlOX01BWCAqbSwgaW50IG4pIHsKICAgIHByaW50ZigiXG5Ub3RhbHMgTmV0OiAlLjJmIiwgdC0+dG90YWxfbmV0UGF5KTsKICAgIHByaW50ZigiXG5NaW4gTmV0OiAlLjJmIiwgbS0+bWluX25ldFBheSk7CiAgICBwcmludGYoIlxuTWF4IE5ldDogJS4yZlxuIiwgbS0+bWF4X25ldFBheSk7Cn0=