//********************************************************
//
// Assignment 8 - Pointers
//
// Name: Seth Hin
//
// Class: C Programming, Spring 2026
//
// Date: April 04 2026
//
// Description: Program which determines overtime, gross pay,
// state tax, federal tax, and net pay for a set of employees.
// It also calculates totals, averages, minimum, and maximum
// values for all floating point employee data.
//
//********************************************************
#include <stdio.h>
#include <string.h>
#include <ctype.h>
//---------------- CONSTANTS ----------------//
#define SIZE 5
#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_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
//---------------- STRUCTURES ----------------//
struct name
{
char firstName[FIRST_NAME_SIZE];
char lastName[LAST_NAME_SIZE];
};
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 totals
{
float total_wageRate;
float total_hours;
float total_overtimeHrs;
float total_grossPay;
float total_stateTax;
float total_fedTax;
float total_netPay;
};
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;
};
//---------------- FUNCTION PROTOTYPES ----------------//
void getHours(struct employee *, int);
void calcOvertimeHrs(struct employee *, int);
void calcGrossPay(struct employee *, int);
void calcStateTax(struct employee *, int);
void calcFedTax(struct employee *, int);
void calcNetPay(struct employee *, int);
void printHeader(void);
void printEmp(struct employee *, int);
void calcEmployeeTotals(struct employee *, struct totals *, int);
void calcEmployeeMinMax(struct employee *, struct min_max *, int);
void printEmpStatistics(struct totals *, struct min_max *, int);
//---------------- MAIN ----------------//
int main()
{
struct employee employeeData[SIZE] = {
{ {"Connie", "Cobol"}, "MA", 98401, 10.60},
{ {"Mary", "Apl"}, "NH", 526488, 9.75 },
{ {"Frank", "Fortran"}, "VT", 765349, 10.50 },
{ {"Jeff", "Ada"}, "NY", 34645, 12.25 },
{ {"Anton", "Pascal"},"CA",127615, 8.35 }
};
struct employee *emp_ptr;
emp_ptr = employeeData;
struct totals employeeTotals = {0};
struct totals *emp_totals_ptr = &employeeTotals;
struct min_max employeeMinMax = {0};
struct min_max *emp_minMax_ptr = &employeeMinMax;
getHours(emp_ptr, SIZE);
calcOvertimeHrs(emp_ptr, SIZE);
calcGrossPay(emp_ptr, SIZE);
calcStateTax(emp_ptr, SIZE);
calcFedTax(emp_ptr, SIZE);
calcNetPay(emp_ptr, SIZE);
calcEmployeeTotals(emp_ptr, emp_totals_ptr, SIZE);
calcEmployeeMinMax(emp_ptr, emp_minMax_ptr, SIZE);
printHeader();
printEmp(emp_ptr, SIZE);
printEmpStatistics(emp_totals_ptr, emp_minMax_ptr, SIZE);
return 0;
}
//**************************************************************
// Function: getHours
// Purpose: Reads hours worked
// Parameters: emp_ptr (pointer), size
//**************************************************************
void getHours(struct employee *emp_ptr, int size)
{
for (int i = 0; i < size; i++)
{
printf("\nEnter hours worked by emp # %06li: ", emp_ptr
[i
].
clockNumber); scanf("%f", &emp_ptr
[i
].
hours); }
}
//**************************************************************
void calcOvertimeHrs(struct employee *emp_ptr, int size)
{
for (int i = 0; i < size; i++)
{
if (emp_ptr[i].hours > STD_HOURS)
emp_ptr[i].overtimeHrs = emp_ptr[i].hours - STD_HOURS;
else
emp_ptr[i].overtimeHrs = 0;
}
}
//**************************************************************
void calcGrossPay(struct employee *emp_ptr, int size)
{
for (int i = 0; i < size; i++)
{
float normal = (emp_ptr[i].hours - emp_ptr[i].overtimeHrs) * emp_ptr[i].wageRate;
float overtime = emp_ptr[i].overtimeHrs * OT_RATE * emp_ptr[i].wageRate;
emp_ptr[i].grossPay = normal + overtime;
}
}
//**************************************************************
void calcStateTax(struct employee *emp_ptr, int size)
{
for (int i = 0; i < size; i++)
{
if (strcmp(emp_ptr
[i
].
taxState, "MA") == 0) emp_ptr[i].stateTax = emp_ptr[i].grossPay * MA_TAX_RATE;
else if (strcmp(emp_ptr
[i
].
taxState, "NH") == 0) emp_ptr[i].stateTax = emp_ptr[i].grossPay * NH_TAX_RATE;
else if (strcmp(emp_ptr
[i
].
taxState, "VT") == 0) emp_ptr[i].stateTax = emp_ptr[i].grossPay * VT_TAX_RATE;
else if (strcmp(emp_ptr
[i
].
taxState, "CA") == 0) emp_ptr[i].stateTax = emp_ptr[i].grossPay * CA_TAX_RATE;
else
emp_ptr[i].stateTax = emp_ptr[i].grossPay * DEFAULT_TAX_RATE;
}
}
//**************************************************************
void calcFedTax(struct employee *emp_ptr, int size)
{
for (int i = 0; i < size; i++)
{
emp_ptr[i].fedTax = emp_ptr[i].grossPay * FED_TAX_RATE;
}
}
//**************************************************************
void calcNetPay(struct employee *emp_ptr, int size)
{
for (int i = 0; i < size; i++)
{
emp_ptr[i].netPay = emp_ptr[i].grossPay - (emp_ptr[i].stateTax + emp_ptr[i].fedTax);
}
}
//**************************************************************
void printHeader(void)
{
printf("\n\n*** Pay Calculator ***\n"); printf("\n---------------------------------------------------------------------------------"); printf("\nName Tax Clock# Wage Hours OT Gross State Fed Net"); printf("\n State Pay Tax Tax Pay"); printf("\n---------------------------------------------------------------------------------"); }
//**************************************************************
void printEmp(struct employee *emp_ptr, int size)
{
char name[25];
for (int i = 0; i < size; i++)
{
strcpy(name
, emp_ptr
[i
].
empName.
firstName); strcat(name
, emp_ptr
[i
].
empName.
lastName);
printf("\n%-20s %-2s %06li %6.2f %6.1f %5.1f %7.2f %6.2f %7.2f %8.2f", name, emp_ptr[i].taxState, emp_ptr[i].clockNumber,
emp_ptr[i].wageRate, emp_ptr[i].hours,
emp_ptr[i].overtimeHrs, emp_ptr[i].grossPay,
emp_ptr[i].stateTax, emp_ptr[i].fedTax,
emp_ptr[i].netPay);
}
}
//**************************************************************
void calcEmployeeTotals(struct employee *emp_ptr, struct totals *tot_ptr, int size)
{
for (int i = 0; i < size; i++)
{
tot_ptr->total_wageRate += emp_ptr[i].wageRate;
tot_ptr->total_hours += emp_ptr[i].hours;
tot_ptr->total_overtimeHrs += emp_ptr[i].overtimeHrs;
tot_ptr->total_grossPay += emp_ptr[i].grossPay;
tot_ptr->total_stateTax += emp_ptr[i].stateTax;
tot_ptr->total_fedTax += emp_ptr[i].fedTax;
tot_ptr->total_netPay += emp_ptr[i].netPay;
}
}
//**************************************************************
void calcEmployeeMinMax(struct employee *emp_ptr, struct min_max *m, int size)
{
*m = (struct min_max){
emp_ptr[0].wageRate, emp_ptr[0].hours, emp_ptr[0].overtimeHrs, emp_ptr[0].grossPay, emp_ptr[0].stateTax, emp_ptr[0].fedTax, emp_ptr[0].netPay,
emp_ptr[0].wageRate, emp_ptr[0].hours, emp_ptr[0].overtimeHrs, emp_ptr[0].grossPay, emp_ptr[0].stateTax, emp_ptr[0].fedTax, emp_ptr[0].netPay
};
for (int i = 1; i < size; i++)
{
if (emp_ptr[i].wageRate < m->min_wageRate) m->min_wageRate = emp_ptr[i].wageRate;
if (emp_ptr[i].wageRate > m->max_wageRate) m->max_wageRate = emp_ptr[i].wageRate;
if (emp_ptr[i].hours < m->min_hours) m->min_hours = emp_ptr[i].hours;
if (emp_ptr[i].hours > m->max_hours) m->max_hours = emp_ptr[i].hours;
if (emp_ptr[i].overtimeHrs < m->min_overtimeHrs) m->min_overtimeHrs = emp_ptr[i].overtimeHrs;
if (emp_ptr[i].overtimeHrs > m->max_overtimeHrs) m->max_overtimeHrs = emp_ptr[i].overtimeHrs;
if (emp_ptr[i].grossPay < m->min_grossPay) m->min_grossPay = emp_ptr[i].grossPay;
if (emp_ptr[i].grossPay > m->max_grossPay) m->max_grossPay = emp_ptr[i].grossPay;
if (emp_ptr[i].stateTax < m->min_stateTax) m->min_stateTax = emp_ptr[i].stateTax;
if (emp_ptr[i].stateTax > m->max_stateTax) m->max_stateTax = emp_ptr[i].stateTax;
if (emp_ptr[i].fedTax < m->min_fedTax) m->min_fedTax = emp_ptr[i].fedTax;
if (emp_ptr[i].fedTax > m->max_fedTax) m->max_fedTax = emp_ptr[i].fedTax;
if (emp_ptr[i].netPay < m->min_netPay) m->min_netPay = emp_ptr[i].netPay;
if (emp_ptr[i].netPay > m->max_netPay) m->max_netPay = emp_ptr[i].netPay;
}
}
//**************************************************************
void printEmpStatistics(struct totals *t, struct min_max *m, int size)
{
printf("\n---------------------------------------------------------------------------------");
printf("\nTotals: %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("\nAverages: %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("\nMinimum: %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("\nMaximum: %5.2f %5.1f %5.1f %7.2f %6.2f %7.2f %8.2f\n", m->max_wageRate, m->max_hours, m->max_overtimeHrs,
m->max_grossPay, m->max_stateTax, m->max_fedTax, m->max_netPay);
}
Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLwovLyBBc3NpZ25tZW50IDggLSBQb2ludGVycwovLwovLyBOYW1lOiBTZXRoIEhpbgovLwovLyBDbGFzczogQyBQcm9ncmFtbWluZywgU3ByaW5nIDIwMjYKLy8KLy8gRGF0ZTogQXByaWwgMDQgMjAyNgovLwovLyBEZXNjcmlwdGlvbjogUHJvZ3JhbSB3aGljaCBkZXRlcm1pbmVzIG92ZXJ0aW1lLCBncm9zcyBwYXksCi8vIHN0YXRlIHRheCwgZmVkZXJhbCB0YXgsIGFuZCBuZXQgcGF5IGZvciBhIHNldCBvZiBlbXBsb3llZXMuCi8vIEl0IGFsc28gY2FsY3VsYXRlcyB0b3RhbHMsIGF2ZXJhZ2VzLCBtaW5pbXVtLCBhbmQgbWF4aW11bQovLyB2YWx1ZXMgZm9yIGFsbCBmbG9hdGluZyBwb2ludCBlbXBsb3llZSBkYXRhLgovLwovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCi8vLS0tLS0tLS0tLS0tLS0tLSBDT05TVEFOVFMgLS0tLS0tLS0tLS0tLS0tLS8vCiNkZWZpbmUgU0laRSA1CiNkZWZpbmUgU1REX0hPVVJTIDQwLjAKI2RlZmluZSBPVF9SQVRFIDEuNQojZGVmaW5lIE1BX1RBWF9SQVRFIDAuMDUKI2RlZmluZSBOSF9UQVhfUkFURSAwLjAKI2RlZmluZSBWVF9UQVhfUkFURSAwLjA2CiNkZWZpbmUgQ0FfVEFYX1JBVEUgMC4wNwojZGVmaW5lIERFRkFVTFRfVEFYX1JBVEUgMC4wOAojZGVmaW5lIFRBWF9TVEFURV9TSVpFIDMKI2RlZmluZSBGRURfVEFYX1JBVEUgMC4yNQojZGVmaW5lIEZJUlNUX05BTUVfU0laRSAxMAojZGVmaW5lIExBU1RfTkFNRV9TSVpFIDEwCgovLy0tLS0tLS0tLS0tLS0tLS0gU1RSVUNUVVJFUyAtLS0tLS0tLS0tLS0tLS0tLy8Kc3RydWN0IG5hbWUKewogICAgY2hhciBmaXJzdE5hbWVbRklSU1RfTkFNRV9TSVpFXTsKICAgIGNoYXIgbGFzdE5hbWVbTEFTVF9OQU1FX1NJWkVdOwp9OwoKc3RydWN0IGVtcGxveWVlCnsKICAgIHN0cnVjdCBuYW1lIGVtcE5hbWU7CiAgICBjaGFyIHRheFN0YXRlW1RBWF9TVEFURV9TSVpFXTsKICAgIGxvbmcgaW50IGNsb2NrTnVtYmVyOwogICAgZmxvYXQgd2FnZVJhdGU7CiAgICBmbG9hdCBob3VyczsKICAgIGZsb2F0IG92ZXJ0aW1lSHJzOwogICAgZmxvYXQgZ3Jvc3NQYXk7CiAgICBmbG9hdCBzdGF0ZVRheDsKICAgIGZsb2F0IGZlZFRheDsKICAgIGZsb2F0IG5ldFBheTsKfTsKCnN0cnVjdCB0b3RhbHMKewogICAgZmxvYXQgdG90YWxfd2FnZVJhdGU7CiAgICBmbG9hdCB0b3RhbF9ob3VyczsKICAgIGZsb2F0IHRvdGFsX292ZXJ0aW1lSHJzOwogICAgZmxvYXQgdG90YWxfZ3Jvc3NQYXk7CiAgICBmbG9hdCB0b3RhbF9zdGF0ZVRheDsKICAgIGZsb2F0IHRvdGFsX2ZlZFRheDsKICAgIGZsb2F0IHRvdGFsX25ldFBheTsKfTsKCnN0cnVjdCBtaW5fbWF4CnsKICAgIGZsb2F0IG1pbl93YWdlUmF0ZSwgbWluX2hvdXJzLCBtaW5fb3ZlcnRpbWVIcnMsIG1pbl9ncm9zc1BheSwgbWluX3N0YXRlVGF4LCBtaW5fZmVkVGF4LCBtaW5fbmV0UGF5OwogICAgZmxvYXQgbWF4X3dhZ2VSYXRlLCBtYXhfaG91cnMsIG1heF9vdmVydGltZUhycywgbWF4X2dyb3NzUGF5LCBtYXhfc3RhdGVUYXgsIG1heF9mZWRUYXgsIG1heF9uZXRQYXk7Cn07CgovLy0tLS0tLS0tLS0tLS0tLS0gRlVOQ1RJT04gUFJPVE9UWVBFUyAtLS0tLS0tLS0tLS0tLS0tLy8Kdm9pZCBnZXRIb3VycyhzdHJ1Y3QgZW1wbG95ZWUgKiwgaW50KTsKdm9pZCBjYWxjT3ZlcnRpbWVIcnMoc3RydWN0IGVtcGxveWVlICosIGludCk7CnZvaWQgY2FsY0dyb3NzUGF5KHN0cnVjdCBlbXBsb3llZSAqLCBpbnQpOwp2b2lkIGNhbGNTdGF0ZVRheChzdHJ1Y3QgZW1wbG95ZWUgKiwgaW50KTsKdm9pZCBjYWxjRmVkVGF4KHN0cnVjdCBlbXBsb3llZSAqLCBpbnQpOwp2b2lkIGNhbGNOZXRQYXkoc3RydWN0IGVtcGxveWVlICosIGludCk7CnZvaWQgcHJpbnRIZWFkZXIodm9pZCk7CnZvaWQgcHJpbnRFbXAoc3RydWN0IGVtcGxveWVlICosIGludCk7CnZvaWQgY2FsY0VtcGxveWVlVG90YWxzKHN0cnVjdCBlbXBsb3llZSAqLCBzdHJ1Y3QgdG90YWxzICosIGludCk7CnZvaWQgY2FsY0VtcGxveWVlTWluTWF4KHN0cnVjdCBlbXBsb3llZSAqLCBzdHJ1Y3QgbWluX21heCAqLCBpbnQpOwp2b2lkIHByaW50RW1wU3RhdGlzdGljcyhzdHJ1Y3QgdG90YWxzICosIHN0cnVjdCBtaW5fbWF4ICosIGludCk7CgovLy0tLS0tLS0tLS0tLS0tLS0gTUFJTiAtLS0tLS0tLS0tLS0tLS0tLy8KaW50IG1haW4oKQp7CiAgICBzdHJ1Y3QgZW1wbG95ZWUgZW1wbG95ZWVEYXRhW1NJWkVdID0gewogICAgICAgIHsgeyJDb25uaWUiLCAiQ29ib2wifSwgIk1BIiwgOTg0MDEsIDEwLjYwfSwKICAgICAgICB7IHsiTWFyeSIsICJBcGwifSwgIk5IIiwgNTI2NDg4LCA5Ljc1IH0sCiAgICAgICAgeyB7IkZyYW5rIiwgIkZvcnRyYW4ifSwgIlZUIiwgNzY1MzQ5LCAxMC41MCB9LAogICAgICAgIHsgeyJKZWZmIiwgIkFkYSJ9LCAiTlkiLCAzNDY0NSwgMTIuMjUgfSwKICAgICAgICB7IHsiQW50b24iLCAiUGFzY2FsIn0sIkNBIiwxMjc2MTUsIDguMzUgfQogICAgfTsKCiAgICBzdHJ1Y3QgZW1wbG95ZWUgKmVtcF9wdHI7CiAgICBlbXBfcHRyID0gZW1wbG95ZWVEYXRhOwoKICAgIHN0cnVjdCB0b3RhbHMgZW1wbG95ZWVUb3RhbHMgPSB7MH07CiAgICBzdHJ1Y3QgdG90YWxzICplbXBfdG90YWxzX3B0ciA9ICZlbXBsb3llZVRvdGFsczsKCiAgICBzdHJ1Y3QgbWluX21heCBlbXBsb3llZU1pbk1heCA9IHswfTsKICAgIHN0cnVjdCBtaW5fbWF4ICplbXBfbWluTWF4X3B0ciA9ICZlbXBsb3llZU1pbk1heDsKCiAgICBnZXRIb3VycyhlbXBfcHRyLCBTSVpFKTsKICAgIGNhbGNPdmVydGltZUhycyhlbXBfcHRyLCBTSVpFKTsKICAgIGNhbGNHcm9zc1BheShlbXBfcHRyLCBTSVpFKTsKICAgIGNhbGNTdGF0ZVRheChlbXBfcHRyLCBTSVpFKTsKICAgIGNhbGNGZWRUYXgoZW1wX3B0ciwgU0laRSk7CiAgICBjYWxjTmV0UGF5KGVtcF9wdHIsIFNJWkUpOwoKICAgIGNhbGNFbXBsb3llZVRvdGFscyhlbXBfcHRyLCBlbXBfdG90YWxzX3B0ciwgU0laRSk7CiAgICBjYWxjRW1wbG95ZWVNaW5NYXgoZW1wX3B0ciwgZW1wX21pbk1heF9wdHIsIFNJWkUpOwoKICAgIHByaW50SGVhZGVyKCk7CiAgICBwcmludEVtcChlbXBfcHRyLCBTSVpFKTsKICAgIHByaW50RW1wU3RhdGlzdGljcyhlbXBfdG90YWxzX3B0ciwgZW1wX21pbk1heF9wdHIsIFNJWkUpOwoKICAgIHJldHVybiAwOwp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vIEZ1bmN0aW9uOiBnZXRIb3VycwovLyBQdXJwb3NlOiBSZWFkcyBob3VycyB3b3JrZWQKLy8gUGFyYW1ldGVyczogZW1wX3B0ciAocG9pbnRlciksIHNpemUKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp2b2lkIGdldEhvdXJzKHN0cnVjdCBlbXBsb3llZSAqZW1wX3B0ciwgaW50IHNpemUpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgewogICAgICAgIHByaW50ZigiXG5FbnRlciBob3VycyB3b3JrZWQgYnkgZW1wICMgJTA2bGk6ICIsIGVtcF9wdHJbaV0uY2xvY2tOdW1iZXIpOwogICAgICAgIHNjYW5mKCIlZiIsICZlbXBfcHRyW2ldLmhvdXJzKTsKICAgIH0KfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp2b2lkIGNhbGNPdmVydGltZUhycyhzdHJ1Y3QgZW1wbG95ZWUgKmVtcF9wdHIsIGludCBzaXplKQp7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKICAgIHsKICAgICAgICBpZiAoZW1wX3B0cltpXS5ob3VycyA+IFNURF9IT1VSUykKICAgICAgICAgICAgZW1wX3B0cltpXS5vdmVydGltZUhycyA9IGVtcF9wdHJbaV0uaG91cnMgLSBTVERfSE9VUlM7CiAgICAgICAgZWxzZQogICAgICAgICAgICBlbXBfcHRyW2ldLm92ZXJ0aW1lSHJzID0gMDsKICAgIH0KfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp2b2lkIGNhbGNHcm9zc1BheShzdHJ1Y3QgZW1wbG95ZWUgKmVtcF9wdHIsIGludCBzaXplKQp7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKICAgIHsKICAgICAgICBmbG9hdCBub3JtYWwgPSAoZW1wX3B0cltpXS5ob3VycyAtIGVtcF9wdHJbaV0ub3ZlcnRpbWVIcnMpICogZW1wX3B0cltpXS53YWdlUmF0ZTsKICAgICAgICBmbG9hdCBvdmVydGltZSA9IGVtcF9wdHJbaV0ub3ZlcnRpbWVIcnMgKiBPVF9SQVRFICogZW1wX3B0cltpXS53YWdlUmF0ZTsKICAgICAgICBlbXBfcHRyW2ldLmdyb3NzUGF5ID0gbm9ybWFsICsgb3ZlcnRpbWU7CiAgICB9Cn0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKdm9pZCBjYWxjU3RhdGVUYXgoc3RydWN0IGVtcGxveWVlICplbXBfcHRyLCBpbnQgc2l6ZSkKewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICB7CiAgICAgICAgaWYgKHN0cmNtcChlbXBfcHRyW2ldLnRheFN0YXRlLCAiTUEiKSA9PSAwKQogICAgICAgICAgICBlbXBfcHRyW2ldLnN0YXRlVGF4ID0gZW1wX3B0cltpXS5ncm9zc1BheSAqIE1BX1RBWF9SQVRFOwogICAgICAgIGVsc2UgaWYgKHN0cmNtcChlbXBfcHRyW2ldLnRheFN0YXRlLCAiTkgiKSA9PSAwKQogICAgICAgICAgICBlbXBfcHRyW2ldLnN0YXRlVGF4ID0gZW1wX3B0cltpXS5ncm9zc1BheSAqIE5IX1RBWF9SQVRFOwogICAgICAgIGVsc2UgaWYgKHN0cmNtcChlbXBfcHRyW2ldLnRheFN0YXRlLCAiVlQiKSA9PSAwKQogICAgICAgICAgICBlbXBfcHRyW2ldLnN0YXRlVGF4ID0gZW1wX3B0cltpXS5ncm9zc1BheSAqIFZUX1RBWF9SQVRFOwogICAgICAgIGVsc2UgaWYgKHN0cmNtcChlbXBfcHRyW2ldLnRheFN0YXRlLCAiQ0EiKSA9PSAwKQogICAgICAgICAgICBlbXBfcHRyW2ldLnN0YXRlVGF4ID0gZW1wX3B0cltpXS5ncm9zc1BheSAqIENBX1RBWF9SQVRFOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZW1wX3B0cltpXS5zdGF0ZVRheCA9IGVtcF9wdHJbaV0uZ3Jvc3NQYXkgKiBERUZBVUxUX1RBWF9SQVRFOwogICAgfQp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnZvaWQgY2FsY0ZlZFRheChzdHJ1Y3QgZW1wbG95ZWUgKmVtcF9wdHIsIGludCBzaXplKQp7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKICAgIHsKICAgICAgICBlbXBfcHRyW2ldLmZlZFRheCA9IGVtcF9wdHJbaV0uZ3Jvc3NQYXkgKiBGRURfVEFYX1JBVEU7CiAgICB9Cn0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKdm9pZCBjYWxjTmV0UGF5KHN0cnVjdCBlbXBsb3llZSAqZW1wX3B0ciwgaW50IHNpemUpCnsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgewogICAgICAgIGVtcF9wdHJbaV0ubmV0UGF5ID0gZW1wX3B0cltpXS5ncm9zc1BheSAtIChlbXBfcHRyW2ldLnN0YXRlVGF4ICsgZW1wX3B0cltpXS5mZWRUYXgpOwogICAgfQp9CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnZvaWQgcHJpbnRIZWFkZXIodm9pZCkKewogICAgcHJpbnRmKCJcblxuKioqIFBheSBDYWxjdWxhdG9yICoqKlxuIik7CiAgICBwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CiAgICBwcmludGYoIlxuTmFtZSAgICAgICAgICAgICAgICBUYXggIENsb2NrIyAgV2FnZSAgIEhvdXJzICBPVCAgIEdyb3NzICAgU3RhdGUgIEZlZCAgICAgIE5ldCIpOwogICAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXkgICAgIFRheCAgICBUYXggICAgICBQYXkiKTsKICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp2b2lkIHByaW50RW1wKHN0cnVjdCBlbXBsb3llZSAqZW1wX3B0ciwgaW50IHNpemUpCnsKICAgIGNoYXIgbmFtZVsyNV07CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICB7CiAgICAgICAgc3RyY3B5KG5hbWUsIGVtcF9wdHJbaV0uZW1wTmFtZS5maXJzdE5hbWUpOwogICAgICAgIHN0cmNhdChuYW1lLCAiICIpOwogICAgICAgIHN0cmNhdChuYW1lLCBlbXBfcHRyW2ldLmVtcE5hbWUubGFzdE5hbWUpOwoKICAgICAgICBwcmludGYoIlxuJS0yMHMgJS0ycyAlMDZsaSAlNi4yZiAlNi4xZiAlNS4xZiAlNy4yZiAlNi4yZiAlNy4yZiAlOC4yZiIsCiAgICAgICAgICAgICAgIG5hbWUsIGVtcF9wdHJbaV0udGF4U3RhdGUsIGVtcF9wdHJbaV0uY2xvY2tOdW1iZXIsCiAgICAgICAgICAgICAgIGVtcF9wdHJbaV0ud2FnZVJhdGUsIGVtcF9wdHJbaV0uaG91cnMsCiAgICAgICAgICAgICAgIGVtcF9wdHJbaV0ub3ZlcnRpbWVIcnMsIGVtcF9wdHJbaV0uZ3Jvc3NQYXksCiAgICAgICAgICAgICAgIGVtcF9wdHJbaV0uc3RhdGVUYXgsIGVtcF9wdHJbaV0uZmVkVGF4LAogICAgICAgICAgICAgICBlbXBfcHRyW2ldLm5ldFBheSk7CiAgICB9Cn0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKdm9pZCBjYWxjRW1wbG95ZWVUb3RhbHMoc3RydWN0IGVtcGxveWVlICplbXBfcHRyLCBzdHJ1Y3QgdG90YWxzICp0b3RfcHRyLCBpbnQgc2l6ZSkKewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICB7CiAgICAgICAgdG90X3B0ci0+dG90YWxfd2FnZVJhdGUgKz0gZW1wX3B0cltpXS53YWdlUmF0ZTsKICAgICAgICB0b3RfcHRyLT50b3RhbF9ob3VycyArPSBlbXBfcHRyW2ldLmhvdXJzOwogICAgICAgIHRvdF9wdHItPnRvdGFsX292ZXJ0aW1lSHJzICs9IGVtcF9wdHJbaV0ub3ZlcnRpbWVIcnM7CiAgICAgICAgdG90X3B0ci0+dG90YWxfZ3Jvc3NQYXkgKz0gZW1wX3B0cltpXS5ncm9zc1BheTsKICAgICAgICB0b3RfcHRyLT50b3RhbF9zdGF0ZVRheCArPSBlbXBfcHRyW2ldLnN0YXRlVGF4OwogICAgICAgIHRvdF9wdHItPnRvdGFsX2ZlZFRheCArPSBlbXBfcHRyW2ldLmZlZFRheDsKICAgICAgICB0b3RfcHRyLT50b3RhbF9uZXRQYXkgKz0gZW1wX3B0cltpXS5uZXRQYXk7CiAgICB9Cn0KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKdm9pZCBjYWxjRW1wbG95ZWVNaW5NYXgoc3RydWN0IGVtcGxveWVlICplbXBfcHRyLCBzdHJ1Y3QgbWluX21heCAqbSwgaW50IHNpemUpCnsKICAgICptID0gKHN0cnVjdCBtaW5fbWF4KXsKICAgICAgICBlbXBfcHRyWzBdLndhZ2VSYXRlLCBlbXBfcHRyWzBdLmhvdXJzLCBlbXBfcHRyWzBdLm92ZXJ0aW1lSHJzLCBlbXBfcHRyWzBdLmdyb3NzUGF5LCBlbXBfcHRyWzBdLnN0YXRlVGF4LCBlbXBfcHRyWzBdLmZlZFRheCwgZW1wX3B0clswXS5uZXRQYXksCiAgICAgICAgZW1wX3B0clswXS53YWdlUmF0ZSwgZW1wX3B0clswXS5ob3VycywgZW1wX3B0clswXS5vdmVydGltZUhycywgZW1wX3B0clswXS5ncm9zc1BheSwgZW1wX3B0clswXS5zdGF0ZVRheCwgZW1wX3B0clswXS5mZWRUYXgsIGVtcF9wdHJbMF0ubmV0UGF5CiAgICB9OwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQogICAgewogICAgICAgIGlmIChlbXBfcHRyW2ldLndhZ2VSYXRlIDwgbS0+bWluX3dhZ2VSYXRlKSBtLT5taW5fd2FnZVJhdGUgPSBlbXBfcHRyW2ldLndhZ2VSYXRlOwogICAgICAgIGlmIChlbXBfcHRyW2ldLndhZ2VSYXRlID4gbS0+bWF4X3dhZ2VSYXRlKSBtLT5tYXhfd2FnZVJhdGUgPSBlbXBfcHRyW2ldLndhZ2VSYXRlOwoKICAgICAgICBpZiAoZW1wX3B0cltpXS5ob3VycyA8IG0tPm1pbl9ob3VycykgbS0+bWluX2hvdXJzID0gZW1wX3B0cltpXS5ob3VyczsKICAgICAgICBpZiAoZW1wX3B0cltpXS5ob3VycyA+IG0tPm1heF9ob3VycykgbS0+bWF4X2hvdXJzID0gZW1wX3B0cltpXS5ob3VyczsKCiAgICAgICAgaWYgKGVtcF9wdHJbaV0ub3ZlcnRpbWVIcnMgPCBtLT5taW5fb3ZlcnRpbWVIcnMpIG0tPm1pbl9vdmVydGltZUhycyA9IGVtcF9wdHJbaV0ub3ZlcnRpbWVIcnM7CiAgICAgICAgaWYgKGVtcF9wdHJbaV0ub3ZlcnRpbWVIcnMgPiBtLT5tYXhfb3ZlcnRpbWVIcnMpIG0tPm1heF9vdmVydGltZUhycyA9IGVtcF9wdHJbaV0ub3ZlcnRpbWVIcnM7CgogICAgICAgIGlmIChlbXBfcHRyW2ldLmdyb3NzUGF5IDwgbS0+bWluX2dyb3NzUGF5KSBtLT5taW5fZ3Jvc3NQYXkgPSBlbXBfcHRyW2ldLmdyb3NzUGF5OwogICAgICAgIGlmIChlbXBfcHRyW2ldLmdyb3NzUGF5ID4gbS0+bWF4X2dyb3NzUGF5KSBtLT5tYXhfZ3Jvc3NQYXkgPSBlbXBfcHRyW2ldLmdyb3NzUGF5OwoKICAgICAgICBpZiAoZW1wX3B0cltpXS5zdGF0ZVRheCA8IG0tPm1pbl9zdGF0ZVRheCkgbS0+bWluX3N0YXRlVGF4ID0gZW1wX3B0cltpXS5zdGF0ZVRheDsKICAgICAgICBpZiAoZW1wX3B0cltpXS5zdGF0ZVRheCA+IG0tPm1heF9zdGF0ZVRheCkgbS0+bWF4X3N0YXRlVGF4ID0gZW1wX3B0cltpXS5zdGF0ZVRheDsKCiAgICAgICAgaWYgKGVtcF9wdHJbaV0uZmVkVGF4IDwgbS0+bWluX2ZlZFRheCkgbS0+bWluX2ZlZFRheCA9IGVtcF9wdHJbaV0uZmVkVGF4OwogICAgICAgIGlmIChlbXBfcHRyW2ldLmZlZFRheCA+IG0tPm1heF9mZWRUYXgpIG0tPm1heF9mZWRUYXggPSBlbXBfcHRyW2ldLmZlZFRheDsKCiAgICAgICAgaWYgKGVtcF9wdHJbaV0ubmV0UGF5IDwgbS0+bWluX25ldFBheSkgbS0+bWluX25ldFBheSA9IGVtcF9wdHJbaV0ubmV0UGF5OwogICAgICAgIGlmIChlbXBfcHRyW2ldLm5ldFBheSA+IG0tPm1heF9uZXRQYXkpIG0tPm1heF9uZXRQYXkgPSBlbXBfcHRyW2ldLm5ldFBheTsKICAgIH0KfQoKLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgp2b2lkIHByaW50RW1wU3RhdGlzdGljcyhzdHJ1Y3QgdG90YWxzICp0LCBzdHJ1Y3QgbWluX21heCAqbSwgaW50IHNpemUpCnsKICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKCiAgICBwcmludGYoIlxuVG90YWxzOiAgICAgICAgICAgICAgICAgICAgICAgICAlNS4yZiAlNS4xZiAlNS4xZiAlNy4yZiAlNi4yZiAlNy4yZiAlOC4yZiIsCiAgICAgICAgICAgdC0+dG90YWxfd2FnZVJhdGUsIHQtPnRvdGFsX2hvdXJzLCB0LT50b3RhbF9vdmVydGltZUhycywKICAgICAgICAgICB0LT50b3RhbF9ncm9zc1BheSwgdC0+dG90YWxfc3RhdGVUYXgsIHQtPnRvdGFsX2ZlZFRheCwgdC0+dG90YWxfbmV0UGF5KTsKCiAgICBwcmludGYoIlxuQXZlcmFnZXM6ICAgICAgICAgICAgICAgICAgICAgICAlNS4yZiAlNS4xZiAlNS4xZiAlNy4yZiAlNi4yZiAlNy4yZiAlOC4yZiIsCiAgICAgICAgICAgdC0+dG90YWxfd2FnZVJhdGUvc2l6ZSwgdC0+dG90YWxfaG91cnMvc2l6ZSwgdC0+dG90YWxfb3ZlcnRpbWVIcnMvc2l6ZSwKICAgICAgICAgICB0LT50b3RhbF9ncm9zc1BheS9zaXplLCB0LT50b3RhbF9zdGF0ZVRheC9zaXplLCB0LT50b3RhbF9mZWRUYXgvc2l6ZSwgdC0+dG90YWxfbmV0UGF5L3NpemUpOwoKICAgIHByaW50ZigiXG5NaW5pbXVtOiAgICAgICAgICAgICAgICAgICAgICAgICU1LjJmICU1LjFmICU1LjFmICU3LjJmICU2LjJmICU3LjJmICU4LjJmIiwKICAgICAgICAgICBtLT5taW5fd2FnZVJhdGUsIG0tPm1pbl9ob3VycywgbS0+bWluX292ZXJ0aW1lSHJzLAogICAgICAgICAgIG0tPm1pbl9ncm9zc1BheSwgbS0+bWluX3N0YXRlVGF4LCBtLT5taW5fZmVkVGF4LCBtLT5taW5fbmV0UGF5KTsKCiAgICBwcmludGYoIlxuTWF4aW11bTogICAgICAgICAgICAgICAgICAgICAgICAlNS4yZiAlNS4xZiAlNS4xZiAlNy4yZiAlNi4yZiAlNy4yZiAlOC4yZlxuIiwKICAgICAgICAgICBtLT5tYXhfd2FnZVJhdGUsIG0tPm1heF9ob3VycywgbS0+bWF4X292ZXJ0aW1lSHJzLAogICAgICAgICAgIG0tPm1heF9ncm9zc1BheSwgbS0+bWF4X3N0YXRlVGF4LCBtLT5tYXhfZmVkVGF4LCBtLT5tYXhfbmV0UGF5KTsKfQ==