```json
{
  "sym_variables": [
    ("x0", "security onions"),
    ("x1", "pen testers"),
    ("x2", "patches per day"),
    ("x3", "system administrators"),
    ("x4", "automatic alerts")
  ],
  "objective_function": "1.96 * x0 + 7.31 * x1 + 6.94 * x2 + 9.13 * x3 + 1.07 * x4",
  "constraints": [
    "2 * x0 + 7 * x1 + 8 * x2 + 3 * x3 + 5 * x4 <= 189",
    "2 * x0 + 2 * x1 + 6 * x2 + 8 * x3 + 10 * x4 <= 104",
    "2 * x0 + 5 * x4 >= 12",
    "3 * x3 + 5 * x4 >= 21",
    "8 * x2 + 5 * x4 >= 14",
    "8 * x2 + 3 * x3 >= 17",
    "7 * x1 + 3 * x3 >= 37",
    "8 * x2 + 3 * x3 + 5 * x4 >= 30",
    "2 * x0 + 8 * x2 + 3 * x3 >= 30",
    "2 * x0 + 3 * x3 + 5 * x4 >= 30",
    "2 * x0 + 7 * x1 + 3 * x3 >= 30",
    "2 * x0 + 7 * x1 + 5 * x4 >= 30",
    "8 * x2 + 3 * x3 + 5 * x4 >= 21",
    "2 * x0 + 8 * x2 + 3 * x3 >= 21",
    "2 * x0 + 3 * x3 + 5 * x4 >= 21",
    "2 * x0 + 7 * x1 + 3 * x3 >= 21",
    "2 * x0 + 7 * x1 + 5 * x4 >= 21",
    "8 * x2 + 3 * x3 + 5 * x4 >= 36",
    "2 * x0 + 8 * x2 + 3 * x3 >= 36",
    "2 * x0 + 3 * x3 + 5 * x4 >= 36",
    "2 * x0 + 7 * x1 + 3 * x3 >= 36",
    "2 * x0 + 7 * x1 + 5 * x4 >= 36",
    "8 * x2 + 3 * x3 + 5 * x4 >= 34",
    "2 * x0 + 8 * x2 + 3 * x3 >= 34",
    "2 * x0 + 3 * x3 + 5 * x4 >= 34",
    "2 * x0 + 7 * x1 + 3 * x3 >= 34",
    "2 * x0 + 7 * x1 + 5 * x4 >= 34",
    "8 * x2 + 3 * x3 + 5 * x4 >= 21",
    "2 * x0 + 8 * x2 + 3 * x3 >= 21",
    "2 * x0 + 3 * x3 + 5 * x4 >= 21",
    "2 * x0 + 7 * x1 + 3 * x3 >= 21",
    "2 * x0 + 7 * x1 + 5 * x4 >= 21",
    "2 * x0 + 7 * x1 + 8 * x2 + 3 * x3 + 5 * x4 >= 21",
    "6 * x2 + 8 * x3 >= 20",
    "2 * x0 + 6 * x2 >= 17",
    "2 * x0 + 8 * x3 >= 10",
    "2 * x0 + 10 * x4 >= 10",
    "8 * x3 + 10 * x4 >= 18",
    "2 * x1 + 6 * x2 >= 17",
    "2 * x0 + 2 * x1 + 6 * x2 + 8 * x3 + 10 * x4 >= 17",
    "2 * x0 + 5 * x4 <= 48",
    "8 * x2 + 3 * x3 <= 177",
    "2 * x0 + 8 * x2 <= 49",
    "7 * x1 + 8 * x2 <= 153",
    "8 * x2 + 3 * x3 + 5 * x4 <= 106",
    "6 * x2 + 8 * x3 <= 91",
    "2 * x1 + 6 * x2 <= 49",
    "2 * x1 + 10 * x4 <= 31",
    "8 * x3 + 10 * x4 <= 48",
    "2 * x0 + 2 * x1 + 8 * x3 <= 49"
  ]
}
```

```python
import gurobipy as gp

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

    # Create variables
    security_onions = m.addVar(vtype=gp.GRB.INTEGER, name="security_onions")
    pen_testers = m.addVar(vtype=gp.GRB.INTEGER, name="pen_testers")
    patches_per_day = m.addVar(vtype=gp.GRB.INTEGER, name="patches_per_day")
    system_administrators = m.addVar(vtype=gp.GRB.INTEGER, name="system_administrators")
    automatic_alerts = m.addVar(vtype=gp.GRB.INTEGER, name="automatic_alerts")

    # Set objective function
    m.setObjective(1.96 * security_onions + 7.31 * pen_testers + 6.94 * patches_per_day + 9.13 * system_administrators + 1.07 * automatic_alerts, gp.GRB.MINIMIZE)

    # Add constraints
    m.addConstr(2 * security_onions + 7 * pen_testers + 8 * patches_per_day + 3 * system_administrators + 5 * automatic_alerts <= 189, "c0")
    m.addConstr(2 * security_onions + 2 * pen_testers + 6 * patches_per_day + 8 * system_administrators + 10 * automatic_alerts <= 104, "c1")
    # ... (add all other constraints similarly)
    m.addConstr(2 * security_onions + 2 * pen_testers + 8 * system_administrators <= 49, "c49")


    # Optimize model
    m.optimize()

    # Print solution
    if m.status == gp.GRB.OPTIMAL:
        print('Obj: %g' % m.objVal)
        print('security_onions:', security_onions.x)
        print('pen_testers:', pen_testers.x)
        print('patches_per_day:', patches_per_day.x)
        print('system_administrators:', system_administrators.x)
        print('automatic_alerts:', automatic_alerts.x)
    elif m.status == gp.GRB.INFEASIBLE:
        print('Optimization problem is infeasible.')
    else:
        print('Optimization ended with status %d' % m.status)


except gp.GrorbiError as e:
    print('Error code ' + str(e.errno) + ': ' + str(e))

except AttributeError:
    print('Encountered an attribute error')
```
