{"files": {"main.py": "from core import run\nfrom policy import POLICY\ndef evaluate(payload):\n    return run(payload, POLICY)\n", "policy.py": "POLICY = {\n    'timezone': 'UTC',\n    'cutoff_hour': 18,\n    'cutoff_inclusive': False,\n    'lead_minutes': 60,\n    'adjacency_allowed': False,\n    'duration_max': 90,\n    'cancelled_blocks': False,\n    'duplicate_policy': 'last',\n    'blackout_day': '2026-11-02',\n    'priority_high_first': False,\n    'capacity': 2,\n    'report_order': 'input',\n}\n", "helpers.py": "from datetime import datetime, timedelta\n\n\ndef parse_dt(s):\n    if isinstance(s, datetime):\n        return s\n    if isinstance(s, str) and s.endswith('Z'):\n        s = s[:-1] + '+00:00'\n    return datetime.fromisoformat(s)\n\n\ndef overlaps(s1, e1, s2, e2, adjacency_allowed):\n    if adjacency_allowed:\n        return s1 < e2 and s2 < e1\n    return s1 <= e2 and s2 <= e1\n", "core.py": "from datetime import datetime, timedelta, timezone\nfrom zoneinfo import ZoneInfo\nfrom helpers import parse_dt, overlaps\n\n\ndef run(payload, policy):\n    tz = ZoneInfo(policy['timezone'])\n    now = parse_dt(payload['now']).astimezone(timezone.utc)\n    min_start = now + timedelta(minutes=policy['lead_minutes'])\n    rows = {}\n    order = []\n    for i, a in enumerate(payload.get('appointments', [])):\n        id_ = a['id']\n        if id_ not in rows:\n            order.append(id_)\n            rows[id_] = (i, a)\n        elif policy['duplicate_policy'] == 'last':\n            rows[id_] = (i, a)\n    items = [(rows[k][0], rows[k][1]) for k in order]\n    hi = policy['priority_high_first']\n    items.sort(key=lambda t: (-t[1]['priority'] if hi else t[1]['priority'], t[0]))\n    accepted = []\n    selected = []\n    blocked = []\n    rejected = []\n    for idx, a in items:\n        id_ = a['id']\n        dur = a['duration']\n        if not (dur > 0 and dur <= policy['duration_max']):\n            rejected.append((idx, id_))\n            continue\n        start = parse_dt(a['start']).astimezone(timezone.utc)\n        end = start + timedelta(minutes=dur)\n        if start < min_start:\n            rejected.append((idx, id_))\n            continue\n        local = start.astimezone(tz)\n        if local.date().isoformat() == policy['blackout_day']:\n            rejected.append((idx, id_))\n            continue\n        cutoff_local = datetime(local.year, local.month, local.day, policy['cutoff_hour'], 0, tzinfo=tz)\n        cutoff = cutoff_local.astimezone(timezone.utc)\n        if policy['cutoff_inclusive']:\n            ok = end <= cutoff\n        else:\n            ok = end < cutoff\n        if not ok:\n            rejected.append((idx, id_))\n            continue\n        if a.get('cancelled') and not policy['cancelled_blocks']:\n            rejected.append((idx, id_))\n            continue\n        n = sum(1 for s, e in accepted if overlaps(start, end, s, e, policy['adjacency_allowed']))\n        if n >= policy['capacity']:\n            rejected.append((idx, id_))\n            continue\n        accepted.append((start, end))\n        if a.get('cancelled'):\n            blocked.append((idx, id_))\n        else:\n            selected.append((idx, id_))\n\n    def fmt(lst):\n        if policy['report_order'] == 'id':\n            lst = sorted(lst, key=lambda t: (t[1], t[0]))\n        else:\n            lst = sorted(lst, key=lambda t: t[0])\n        return [t[1] for t in lst]\n\n    return {'selected': fmt(selected), 'blocked': fmt(blocked), 'rejected': fmt(rejected)}\n"}}