```json
{
  "sym_variables": [
    ("x0", "hours worked by Bill"),
    ("x1", "hours worked by Dale"),
    ("x2", "hours worked by John"),
    ("x3", "hours worked by Hank")
  ],
  "objective_function": "3*x0 + 8*x1 + 6*x2 + 1*x3",
  "constraints": [
    "9.48*x1 + 3.21*x3 >= 51",
    "7.1*x0 + 6.37*x2 >= 65",
    "6.37*x2 + 3.21*x3 >= 103",
    "7.1*x0 + 9.48*x1 + 3.21*x3 >= 60",
    "4.6*x1 + 3.76*x3 >= 64",
    "3.61*x2 + 3.76*x3 >= 41",
    "9.28*x0 + 3.61*x2 >= 36",
    "9.28*x0 + 4.6*x1 + 3.76*x3 >= 51",
    "9.28*x0 + 3.61*x2 + 3.76*x3 >= 51",
    "4.6*x1 + 3.61*x2 + 3.76*x3 >= 51",
    "9.28*x0 + 4.6*x1 + 3.76*x3 >= 51",
    "9.28*x0 + 3.61*x2 + 3.76*x3 >= 51",
    "4.6*x1 + 3.61*x2 + 3.76*x3 >= 51",
    "9.28*x0 + 4.6*x1 + 3.76*x3 >= 72",
    "9.28*x0 + 3.61*x2 + 3.76*x3 >= 72",
    "4.6*x1 + 3.61*x2 + 3.76*x3 >= 72",
    "4.65*x0 + 9.13*x1 >= 47",
    "4.65*x0 + 4.87*x3 >= 52",
    "4.65*x0 + 9.13*x1 + 1.4*x2 >= 58",
    "3.94*x0 + 8.66*x3 >= 60",
    "2.01*x1 + 3.3*x2 >= 37",
    "-9*x0 + 5*x2 + 4*x3 >= 0",
    "7.1*x0 + 6.37*x2 <= 388",
    "7.1*x0 + 9.48*x1 <= 266",
    "9.48*x1 + 6.37*x2 <= 275",
    "7.1*x0 + 3.21*x3 <= 373",
    "7.1*x0 + 6.37*x2 + 3.21*x3 <= 117",
    "7.1*x0 + 9.48*x1 + 3.21*x3 <= 176",
    "7.1*x0 + 9.48*x1 + 6.37*x2 <= 363",
    "7.1*x0 + 9.48*x1 + 6.37*x2 + 3.21*x3 <= 363",
    "9.28*x0 + 3.61*x2 <= 145",
    "4.6*x1 + 3.61*x2 <= 215",
    "4.6*x1 + 3.76*x3 <= 268",
    "9.28*x0 + 3.76*x3 <= 306",
    "9.28*x0 + 4.6*x1 + 3.61*x2 <= 179",
    "4.6*x1 + 3.61*x2 + 3.76*x3 <= 165",
    "9.28*x0 + 4.6*x1 + 3.61*x2 + 3.76*x3 <= 165",
    "4.65*x0 + 4.87*x3 <= 129",
    "1.4*x2 + 4.87*x3 <= 152",
    "4.65*x0 + 9.13*x1 <= 241",
    "4.65*x0 + 1.4*x2 + 4.87*x3 <= 154",
    "4.65*x0 + 9.13*x1 + 1.4*x2 + 4.87*x3 <= 154",
    "3.94*x0 + 3.3*x2 <= 70",
    "3.94*x0 + 2.01*x1 <= 226",
    "3.94*x0 + 8.66*x3 <= 123",
    "2.01*x1 + 3.3*x2 <= 244",
    "2.01*x1 + 8.66*x3 <= 169",
    "3.94*x0 + 2.01*x1 + 3.3*x2 + 8.66*x3 <= 169",
    "7.53*x0 + 3.41*x2 <= 486",
    "7.53*x0 + 2.29*x1 <= 447",
    "2.29*x1 + 5.1*x3 <= 136",
    "7.53*x0 + 5.1*x3 <= 473",
    "2.29*x1 + 3.41*x2 <= 400",
    "7.53*x0 + 3.41*x2 + 5.1*x3 <= 514",
    "7.53*x0 + 2.29*x1 + 5.1*x3 <= 442",
    "7.53*x0 + 2.29*x1 + 3.41*x2 + 5.1*x3 <= 442"
  ]
}
```

```python
import gurobipy as gp

# Create a new model
m = gp.Model("optimization_problem")

# Create variables
x = m.addVars(4, lb=0, name=["Bill", "Dale", "John", "Hank"])


# Set objective function
m.setObjective(3*x[0] + 8*x[1] + 6*x[2] + x[3], gp.GRB.MAXIMIZE)

# Add constraints
m.addConstr(9.48*x[1] + 3.21*x[3] >= 51)
m.addConstr(7.1*x[0] + 6.37*x[2] >= 65)
m.addConstr(6.37*x[2] + 3.21*x[3] >= 103)
m.addConstr(7.1*x[0] + 9.48*x[1] + 3.21*x[3] >= 60)
m.addConstr(4.6*x[1] + 3.76*x[3] >= 64)
m.addConstr(3.61*x[2] + 3.76*x[3] >= 41)
m.addConstr(9.28*x[0] + 3.61*x[2] >= 36)
m.addConstr(9.28*x[0] + 4.6*x[1] + 3.76*x[3] >= 51)
m.addConstr(9.28*x[0] + 3.61*x[2] + 3.76*x[3] >= 51)
m.addConstr(4.6*x[1] + 3.61*x[2] + 3.76*x[3] >= 51)
m.addConstr(9.28*x[0] + 4.6*x[1] + 3.76*x[3] >= 72)
m.addConstr(9.28*x[0] + 3.61*x[2] + 3.76*x[3] >= 72)
m.addConstr(4.6*x[1] + 3.61*x[2] + 3.76*x[3] >= 72)
m.addConstr(4.65*x[0] + 9.13*x[1] >= 47)
m.addConstr(4.65*x[0] + 4.87*x[3] >= 52)
m.addConstr(4.65*x[0] + 9.13*x[1] + 1.4*x[2] >= 58)
m.addConstr(3.94*x[0] + 8.66*x[3] >= 60)
m.addConstr(2.01*x[1] + 3.3*x[2] >= 37)
m.addConstr(-9*x[0] + 5*x[2] + 4*x[3] >= 0)
m.addConstr(7.1*x[0] + 6.37*x[2] <= 388)
m.addConstr(7.1*x[0] + 9.48*x[1] <= 266)
m.addConstr(9.48*x[1] + 6.37*x[2] <= 275)
m.addConstr(7.1*x[0] + 3.21*x[3] <= 373)
m.addConstr(7.1*x[0] + 6.37*x[2] + 3.21*x[3] <= 117)
m.addConstr(7.1*x[0] + 9.48*x[1] + 3.21*x[3] <= 176)
m.addConstr(7.1*x[0] + 9.48*x[1] + 6.37*x[2] <= 363)
m.addConstr(7.1*x[0] + 9.48*x[1] + 6.37*x[2] + 3.21*x[3] <= 363)
m.addConstr(9.28*x[0] + 3.61*x[2] <= 145)
m.addConstr(4.6*x[1] + 3.61*x[2] <= 215)
m.addConstr(4.6*x[1] + 3.76*x[3] <= 268)
m.addConstr(9.28*x[0] + 3.76*x[3] <= 306)
m.addConstr(9.28*x[0] + 4.6*x[1] + 3.61*x[2] <= 179)
m.addConstr(4.6*x[1] + 3.61*x[2] + 3.76*x[3] <= 165)
m.addConstr(9.28*x[0] + 4.6*x[1] + 3.61*x[2] + 3.76*x[3] <= 165)
m.addConstr(4.65*x[0] + 4.87*x[3] <= 129)
m.addConstr(1.4*x[2] + 4.87*x[3] <= 152)
m.addConstr(4.65*x[0] + 9.13*x[1] <= 241)
m.addConstr(4.65*x[0] + 1.4*x[2] + 4.87*x[3] <= 154)
m.addConstr(4.65*x[0] + 9.13*x[1] + 1.4*x[2] + 4.87*x[3] <= 154)
m.addConstr(3.94*x[0] + 3.3*x[2] <= 70)
m.addConstr(3.94*x[0] + 2.01*x[1] <= 226)
m.addConstr(3.94*x[0] + 8.66*x[3] <= 123)
m.addConstr(2.01*x[1] + 3.3*x[2] <= 244)
m.addConstr(2.01*x[1] + 8.66*x[3] <= 169)
m.addConstr(3.94*x[0] + 2.01*x[1] + 3.3*x[2] + 8.66*x[3] <= 169)
m.addConstr(7.53*x[0] + 3.41*x[2] <= 486)
m.addConstr(7.53*x[0] + 2.29*x[1] <= 447)
m.addConstr(2.29*x[1] + 5.1*x[3] <= 136)
m.addConstr(7.53*x[0] + 5.1*x[3] <= 473)
m.addConstr(2.29*x[1] + 3.41*x[2] <= 400)
m.addConstr(7.53*x[0] + 3.41*x[2] + 5.1*x[3] <= 514)
m.addConstr(7.53*x[0] + 2.29*x[1] + 5.1*x[3] <= 442)
m.addConstr(7.53*x[0] + 2.29*x[1] + 3.41*x[2] + 5.1*x[3] <= 442)


# Optimize model
m.optimize()

# Print results
if m.status == gp.GRB.OPTIMAL:
    for v in m.getVars():
        print(f"{v.varName}: {v.x}")
    print(f"Objective Value: {m.objVal}")
elif m.status == gp.GRB.INFEASIBLE:
    print("The problem is infeasible.")
else:
    print(f"Optimization terminated with status {m.status}")

```