Help edit the attached Python/Pillow and FFmpeg chart-video reference project. Use prepare.py to parse sample.csv. Exactly three rows: Email120, Chat180, Docs90. Synthetic ticket counts, not real business data. Header label,value. Labels unique, nonempty, <=24 characters. Counts finite integer-valued numbers0..200. Missing is invalid, not zero. Reject extra cells and wrong row counts. Keep parse() authoritative in render.py; no stale data.json fallback. Output1280x720, RGB frames,30fps,360frames, silent H.264 yuv420p MP4. Use a local licensed TrueType font supplied by CHART_FONT; no font downloads. Reject labels wider than200px at font26. Draw cream#fffaf4 background, ink#242727. Header at60,100 size46: Where did the sample tickets arrive? Subheading60,170 size23: Read the final values after3 seconds. Plot x280..1100, width820, zero baseline, fixed maximum200. Ticks0,50,100,150,200. Rows y240,345,450, height40. Label atx60 size26, exact fixed number atx1120 size30. Bar colors#e66b33,#36706c,#7970a1. Width=round(value/200*820*max(0,min(1,(frame-30)/60))). No randomness, network, CSS or generated imagery. Reveal widths only, not numeric values. Permanent footer60,610 size23: Synthetic example / tickets / fixed scale0-200. Footer60,656 size20: Counts stay exact. The animation is a reveal, not growth over time. Use subprocess argument lists, never shell=True. Pipe RGB frames into FFmpeg. Write temporary MP4 and replace final only after FFmpeg succeeds. Save frames0,60,90,359 for review, and accepted-data.json after success. No audio or real-data claims. Return changed files and explain any changes. Do not invent test results. Preserve tests; list commands to validate and render. Ask before changing the scale, metric meaning, source data or installing new dependencies.