{
const ct = canvas.ct;
ct.clearRect(0, 0, WIDTH, HEIGHT);
ct.beginPath();
ct.moveTo(0, HEIGHT - DIRECTRIX_Y);
ct.lineTo(WIDTH, HEIGHT - DIRECTRIX_Y);
ct.lineWidth = 1;
ct.strokeStyle = "blue";
ct.stroke();
ct.beginPath();
ct.moveTo(cx - ex, ey);
ct.quadraticCurveTo(cx, cy * 2 + FOCUS_Y - DIRECTRIX_Y, cx + ex, ey);
ct.lineWidth = 3;
ct.strokeStyle = "red";
ct.stroke();
ct.beginPath();
ct.moveTo(0, HEIGHT - (DIRECTRIX_Y + FOCUS_Y) / 2);
ct.lineTo(WIDTH, HEIGHT - (DIRECTRIX_Y + FOCUS_Y) / 2);
ct.moveTo(cx, 0);
ct.lineTo(cx, HEIGHT);
ct.lineWidth = 1;
ct.strokeStyle = "#090";
ct.stroke();
ct.beginPath();
ct.moveTo(cx + px, py);
ct.lineTo(cx + px, HEIGHT - DIRECTRIX_Y);
ct.lineTo(cx, cy);
ct.lineTo(cx + px, py);
ct.lineTo(cx, HEIGHT - DIRECTRIX_Y + cy - py);
ct.lineWidth = 1;
ct.strokeStyle = "#666";
ct.stroke();
ct.beginPath();
ct.arc(cx + px, py, 5, 0, 7);
ct.arc(cx + px, HEIGHT - DIRECTRIX_Y, 5, 0, 7);
ct.fillStyle = "#333";
ct.fill();
ct.beginPath();
ct.arc(cx + px/2, (HEIGHT - DIRECTRIX_Y + cy)/2, 5, 0, 7);
ct.arc(cx, HEIGHT - DIRECTRIX_Y + cy - py, 5, 0, 7);
ct.fillStyle = "#090";
ct.fill();
ct.beginPath();
ct.arc(cx, cy, 5, 0, 7);
ct.fillStyle = "blue";
ct.fill();
return this || html`(<i>the drawing function</i>)`;
}