```json
{
  "sym_variables": [
    ("x0", "hours worked by Jean"),
    ("x1", "hours worked by Bill"),
    ("x2", "hours worked by George"),
    ("x3", "hours worked by Mary"),
    ("x4", "hours worked by Bobby"),
    ("x5", "hours worked by Dale")
  ],
  "objective_function": "2.72 * x0 + 7.57 * x1 + 3.16 * x2 + 7.71 * x3 + 8.86 * x4 + 1.53 * x5",
  "constraints": [
    "1.52 * x3 + 2.01 * x5 >= 57",
    "1.52 * x0 + 0.63 * x3 >= 56",
    "1.52 * x0 + 2.03 * x2 >= 67",
    "1.52 * x0 + 2.01 * x5 >= 69",
    "2.03 * x2 + 2.01 * x5 >= 133",
    "1.52 * x0 + 0.36 * x4 >= 138",
    "0.63 * x3 + 0.36 * x4 >= 123",
    "2.03 * x2 + 0.36 * x4 >= 75",
    "0.36 * x4 + 2.01 * x5 >= 127",
    "3.77 * x1 + 2.01 * x5 >= 54",
    "1.52 * x0 + 3.77 * x1 >= 132",
    "0.8 * x3 + 1.07 * x4 >= 46",
    "0.87 * x2 + 0.8 * x3 >= 27",
    "0.87 * x2 + 1.07 * x4 >= 55",
    "0.87 * x2 + 2.32 * x5 >= 39",
    "3.34 * x0 + 1.65 * x1 >= 42",
    "1.65 * x1 + 1.07 * x4 >= 24",
    "0.8 * x3 + 2.32 * x5 >= 40",
    "3.34 * x0 + 2.32 * x5 >= 64",
    "3.34 * x0 + 0.87 * x2 + 0.8 * x3 >= 56",
    "1.65 * x1 + 1.07 * x4 + 2.32 * x5 >= 56",
    "3.34 * x0 + 1.65 * x1 + 0.87 * x2 >= 56",
    "3.34 * x0 + 0.87 * x2 + 0.8 * x3 >= 57", 
    "1.65 * x1 + 1.07 * x4 + 2.32 * x5 >= 57",
    "3.34 * x0 + 1.65 * x1 + 0.87 * x2 >= 57",
    "3.34 * x0 + 0.87 * x2 + 0.8 * x3 >= 65",
    "1.65 * x1 + 1.07 * x4 + 2.32 * x5 >= 65",
    "3.34 * x0 + 1.65 * x1 + 0.87 * x2 >= 65",
    "0.63 * x3 + 0.36 * x4 <= 168",
    "3.77 * x1 + 0.36 * x4 <= 273",
    "0.63 * x3 + 0.36 * x4 + 2.01 * x5 <= 323",
    "2.03 * x2 + 0.36 * x4 + 2.01 * x5 <= 500",
    "2.03 * x2 + 0.63 * x3 + 0.36 * x4 <= 811",
    "1.52 * x0 + 0.63 * x3 + 2.01 * x5 <= 619",
    "1.52 * x0 + 3.77 * x1 + 2.03 * x2 <= 695",
    "1.52 * x0 + 2.03 * x2 + 2.01 * x5 <= 320",
    "1.52 * x0 + 0.36 * x4 + 2.01 * x5 <= 331",
    "1.52 * x0 + 3.77 * x1 + 2.03 * x2 + 0.63 * x3 + 0.36 * x4 + 2.01 * x5 <= 331",
    "3.34 * x0 + 2.32 * x5 <= 153",
    "3.34 * x0 + 0.87 * x2 <= 309",
    "3.34 * x0 + 1.65 * x1 <= 236",
    "0.8 * x3 + 1.07 * x4 <= 222",
    "1.65 * x1 + 1.07 * x4 <= 195",
    "3.34 * x0 + 0.8 * x3 <= 99",
    "0.8 * x3 + 2.32 * x5 <= 87",
    "0.87 * x2 + 0.8 * x3 <= 287",
    "0.87 * x2 + 1.07 * x4 + 2.32 * x5 <= 229",
    "3.34 * x0 + 0.87 * x2 + 0.8 * x3 <= 375",
    "1.65 * x1 + 0.8 * x3 + 2.32 * x5 <= 188",
    "3.34 * x0 + 1.07 * x4 + 2.32 * x5 <= 391",
    "1.65 * x1 + 0.8 * x3 + 1.07 * x4 <= 280",
    "0.87 * x2 + 0.8 * x3 + 2.32 * x5 <= 94",
    "3.34 * x0 + 1.65 * x1 + 2.32 * x5 <= 380",
    "1.65 * x1 + 1.07 * x4 + 2.32 * x5 <= 91",
    "1.65 * x1 + 0.87 * x2 + 0.8 * x3 <= 368",
    "3.34 * x0 + 1.65 * x1 + 1.07 * x4 <= 293",
    "0.87 * x2 + 0.8 * x3 + 1.07 * x4 <= 238",
    "3.34 * x0 + 1.65 * x1 + 0.8 * x3 <= 366",
    "3.34 * x0 + 1.65 * x1 + 0.87 * x2 + 0.8 * x3 + 1.07 * x4 + 2.32 * x5 <= 366",
    "r0": {"upper_bound": 872},
    "r1": {"upper_bound": 413},
    "r2": {"upper_bound": 533},
    "r3": {"upper_bound": 264}

  ]
}
```

```python
import gurobipy as gp

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

# Create variables
x = m.addVars(6, lb=0, vtype=gp.GRB.CONTINUOUS, names=[
    "hours worked by Jean",
    "hours worked by Bill",
    "hours worked by George",
    "hours worked by Mary",
    "hours worked by Bobby",
    "hours worked by Dale"
])


# Set objective function
m.setObjective(2.72 * x[0] + 7.57 * x[1] + 3.16 * x[2] + 7.71 * x[3] + 8.86 * x[4] + 1.53 * x[5], gp.GRB.MAXIMIZE)

# Resource coefficients
resource_coeffs = {
    'r0': [1.52, 3.77, 2.03, 0.63, 0.36, 2.01],  # dollar cost per hour
    'r1': [3.34, 1.65, 0.87, 0.8, 1.07, 2.32],  # work quality rating
    'r2': [3.35, 3.51, 3.55, 2.15, 2.95, 2.94],  # paperwork competence rating
    'r3': [2.17, 3.85, 1.45, 3.03, 1.07, 3.57]  # productivity rating
}

# Resource upper bounds
resource_bounds = {
    'r0': 872,
    'r1': 413,
    'r2': 533,
    'r3': 264
}


# Add constraints from the JSON "constraints" field.
json_constraints = {
    # ... (paste the constraints from the JSON output here)
}

for constraint_str in json_constraints["constraints"]:
    lhs, op, rhs = constraint_str.split()
    rhs = float(rhs)
    lhs_terms = lhs.split("+")
    lhs_expr = 0
    for term in lhs_terms:
        factors = term.split("*")
        if len(factors) == 2:
            coeff, var_name = factors
            var_index = json_constraints["sym_variables"].index(tuple(var_name.split("x")))
            lhs_expr += float(coeff) * x[var_index]
        else:  # single variable
            var_name = factors[0]
            var_index = json_constraints["sym_variables"].index(tuple(var_name.split("x")))
            lhs_expr += x[var_index]
    if op == ">=":
        m.addConstr(lhs_expr >= rhs)
    elif op == "<=":
        m.addConstr(lhs_expr <= rhs)
    elif op == "=":
        m.addConstr(lhs_expr == rhs)


# Optimize model
m.optimize()

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

```