{"files": {"main.py": "from core import run\nfrom policy import POLICY\ndef evaluate(payload):\n    return run(payload, POLICY)\n", "policy.py": "POLICY = {\"adjacency_allowed\": False, \"blackout_day\": \"2026-11-02\", \"cancelled_blocks\": False, \"capacity\": 2, \"cutoff_hour\": 18, \"cutoff_inclusive\": False, \"duplicate_policy\": \"last\", \"duration_max\": 90, \"lead_minutes\": 60, \"priority_high_first\": False, \"report_order\": \"input\", \"timezone\": \"UTC\"}\n", "helpers.py": "from datetime import datetime, timedelta, timezone\nfrom zoneinfo import ZoneInfo\n\ndef parse(s):\n    if isinstance(s, str) and s.endswith('Z'):\n        s = s[:-1] + '+00:00'\n    return datetime.fromisoformat(s)\n\ndef to_utc(dt):\n    return dt.astimezone(timezone.utc)\n\ndef overlaps(a, b, adjacency_allowed):\n    if adjacency_allowed:\n        return a[0] < b[1] and b[0] < a[1]\n    return a[0] <= b[1] and b[0] <= a[1]\n", "core.py": "from datetime import datetime, timedelta, timezone, time\nfrom zoneinfo import ZoneInfo\nfrom helpers import parse, to_utc, overlaps\n\ndef run(payload, policy):\n    now = to_utc(parse(payload['now']))\n    tz = ZoneInfo(policy['timezone'])\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] for k in order]\n    rev = bool(policy['priority_high_first'])\n    if rev:\n        items.sort(key=lambda t: (-t[1]['priority'], t[0]))\n    else:\n        items.sort(key=lambda t: (t[1]['priority'], t[0]))\n    selected, blocked, rejected = [], [], []\n    accepted = []\n    lead = timedelta(minutes=policy['lead_minutes'])\n    for idx, a in items:\n        id_ = a['id']\n        rec = (idx, id_)\n        try:\n            dur = a['duration']\n            if isinstance(dur, bool) or dur <= 0 or dur > policy['duration_max']:\n                rejected.append(rec); continue\n            start_dt = parse(a['start'])\n            start = to_utc(start_dt)\n        except Exception:\n            rejected.append(rec); continue\n        end = start + timedelta(minutes=dur)\n        if start < now + lead:\n            rejected.append(rec); continue\n        local = start.astimezone(tz)\n        if local.date().isoformat() == policy['blackout_day']:\n            rejected.append(rec); continue\n        cut_local = datetime.combine(local.date(), time(0, 0), tzinfo=tz) + timedelta(hours=policy['cutoff_hour'])\n        cut_local = datetime(local.year, local.month, local.day, policy['cutoff_hour'], 0, tzinfo=tz)\n        cutoff = cut_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(rec); continue\n        cancelled = bool(a.get('cancelled'))\n        if cancelled and not policy['cancelled_blocks']:\n            rejected.append(rec); continue\n        cnt = sum(1 for iv in accepted if overlaps((start, end), iv, policy['adjacency_allowed']))\n        if cnt >= policy['capacity']:\n            rejected.append(rec); continue\n        accepted.append((start, end))\n        if cancelled:\n            blocked.append(rec)\n        else:\n            selected.append(rec)\n    def fmt(lst):\n        if policy['report_order'] == 'id':\n            lst = sorted(lst, key=lambda r: r[1])\n        else:\n            lst = sorted(lst, key=lambda r: r[0])\n        return [r[1] for r in lst]\n    return {'selected': fmt(selected), 'blocked': fmt(blocked), 'rejected': fmt(rejected)}\n"}}