```json
{
  "sym_variables": [
    ("x0", "hours worked by Bill"),
    ("x1", "hours worked by Mary"),
    ("x2", "hours worked by George"),
    ("x3", "hours worked by Dale")
  ],
  "objective_function": "5*x0**2 + 5*x0*x1 + 1*x0*x2 + 4*x0*x3 + 8*x1**2 + 1*x1*x3 + 4*x2**2 + 1*x2*x3 + 6*x3**2 + 1*x1 + 1*x2 + 7*x3",
  "constraints": [
    "15*x0 + 4*x2 >= 47",
    "15*x0**2 + 9*x3**2 >= 30",
    "5*x1 + 4*x2 >= 19",
    "15*x0 + 5*x1 >= 50",
    "15*x0 + 4*x2 + 9*x3 >= 38",
    "5*x1 + 4*x2 + 9*x3 >= 38",
    "15*x0 + 4*x2 + 9*x3 >= 49",
    "5*x1 + 4*x2 + 9*x3 >= 49",
    "1*x0 + 10*x3 >= 29",
    "7*x0 + 12*x1 >= 59",
    "12*x1 + 13*x2 >= 35",
    "7*x0**2 + 13*x2**2 >= 41",
    "13*x2**2 + 11*x3**2 >= 31",
    "7*x0**2 + 12*x1**2 + 11*x3**2 >= 40",
    "4*x2 + 9*x3 <= 121",
    "5*x1 + 9*x3 <= 142",
    "15*x0**2 + 4*x2**2 <= 80",
    "15*x0 + 5*x1 + 9*x3 <= 63",
    "15*x0 + 5*x1 + 4*x2 + 9*x3 <= 63",
    "1*x0**2 + 14*x2**2 <= 164",
    "1*x0 + 10*x3 <= 252",
    "1*x0 + 14*x2 + 10*x3 <= 261",
    "1*x0 + 13*x1 + 14*x2 <= 232",
    "1*x0 + 13*x1 + 14*x2 + 10*x3 <= 232",
    "12*x1 + 11*x3 <= 158",
    "7*x0 + 13*x2 <= 84",
    "13*x2 + 11*x3 <= 215",
    "7*x0 + 11*x3 <= 296",
    "7*x0 + 12*x1 <= 220",
    "12*x1**2 + 13*x2**2 <= 162",
    "7*x0 + 12*x1 + 13*x2 + 11*x3 <= 162",
    "13*x0**2 + 1*x1**2 <= 70",
    "17*x2 + 12*x3 <= 62",
    "13*x0**2 + 1*x1**2 + 17*x2**2 <= 80",
    "1*x1 + 17*x2 + 12*x3 <= 48",
    "13*x0 + 1*x1 + 17*x2 + 12*x3 <= 48"
  ]
}
```

```python
import gurobipy as gp
from gurobipy import GRB

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

# Create variables
bill_hours = m.addVar(lb=0, name="bill_hours")
mary_hours = m.addVar(lb=0, name="mary_hours")
george_hours = m.addVar(lb=0, name="george_hours")
dale_hours = m.addVar(lb=0, name="dale_hours")


# Set objective function
m.setObjective(5*bill_hours**2 + 5*bill_hours*mary_hours + 1*bill_hours*george_hours + 4*bill_hours*dale_hours + 8*mary_hours**2 + 1*mary_hours*dale_hours + 4*george_hours**2 + 1*george_hours*dale_hours + 6*dale_hours**2 + 1*mary_hours + 1*george_hours + 7*dale_hours, GRB.MAXIMIZE)

# Add constraints
m.addConstr(15*bill_hours + 4*george_hours >= 47)
m.addConstr(15*bill_hours**2 + 9*dale_hours**2 >= 30)
m.addConstr(5*mary_hours + 4*george_hours >= 19)
m.addConstr(15*bill_hours + 5*mary_hours >= 50)
m.addConstr(15*bill_hours + 4*george_hours + 9*dale_hours >= 38)
m.addConstr(5*mary_hours + 4*george_hours + 9*dale_hours >= 38)
m.addConstr(15*bill_hours + 4*george_hours + 9*dale_hours >= 49)
m.addConstr(5*mary_hours + 4*george_hours + 9*dale_hours >= 49)
m.addConstr(1*bill_hours + 10*dale_hours >= 29)
m.addConstr(7*bill_hours + 12*mary_hours >= 59)
m.addConstr(12*mary_hours + 13*george_hours >= 35)
m.addConstr(7*bill_hours**2 + 13*george_hours**2 >= 41)
m.addConstr(13*george_hours**2 + 11*dale_hours**2 >= 31)
m.addConstr(7*bill_hours**2 + 12*mary_hours**2 + 11*dale_hours**2 >= 40)
m.addConstr(4*george_hours + 9*dale_hours <= 121)
m.addConstr(5*mary_hours + 9*dale_hours <= 142)
m.addConstr(15*bill_hours**2 + 4*george_hours**2 <= 80)
m.addConstr(15*bill_hours + 5*mary_hours + 9*dale_hours <= 63)
m.addConstr(15*bill_hours + 5*mary_hours + 4*george_hours + 9*dale_hours <= 63)
m.addConstr(1*bill_hours**2 + 14*george_hours**2 <= 164)
m.addConstr(1*bill_hours + 10*dale_hours <= 252)
m.addConstr(1*bill_hours + 14*george_hours + 10*dale_hours <= 261)
m.addConstr(1*bill_hours + 13*mary_hours + 14*george_hours <= 232)
m.addConstr(1*bill_hours + 13*mary_hours + 14*george_hours + 10*dale_hours <= 232)
m.addConstr(12*mary_hours + 11*dale_hours <= 158)
m.addConstr(7*bill_hours + 13*george_hours <= 84)
m.addConstr(13*george_hours + 11*dale_hours <= 215)
m.addConstr(7*bill_hours + 11*dale_hours <= 296)
m.addConstr(7*bill_hours + 12*mary_hours <= 220)
m.addConstr(12*mary_hours**2 + 13*george_hours**2 <= 162)
m.addConstr(7*bill_hours + 12*mary_hours + 13*george_hours + 11*dale_hours <= 162)
m.addConstr(13*bill_hours**2 + 1*mary_hours**2 <= 70)
m.addConstr(17*george_hours + 12*dale_hours <= 62)
m.addConstr(13*bill_hours**2 + 1*mary_hours**2 + 17*george_hours**2 <= 80)
m.addConstr(1*mary_hours + 17*george_hours + 12*dale_hours <= 48)
m.addConstr(13*bill_hours + 1*mary_hours + 17*george_hours + 12*dale_hours <= 48)


# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print('Obj: %g' % m.objVal)
    for v in m.getVars():
        print('%s %g' % (v.varName, v.x))
elif m.status == GRB.INFEASIBLE:
    print('Model is infeasible')
else:
    print('Optimization ended with status %d' % m.status)

```
