function* launch(vx, vy) {
let state = {x: 0, y: 0, vx, vy};
let max = state.y;
let n = 0;
while (!inRange(state) && state.y >= target.y1) {
state = step(state);
if (state.y > max) max = state.y;
yield { n: ++n, state };
}
yield { n, state, within: inRange(state), max };
}