```python
def gen_plan(state: BridgeState,
             a_start_x_offset: float, a_start_y_offset: float,
             a_end_x_offset:   float, a_end_y_offset:   float,
             b_start_x_offset: float, b_start_y_offset: float,
             b_end_x_offset:   float, b_end_y_offset:   float):
    
    import numpy as np

    # Build the block towards the target
    actions = []
    red_box = state.getFrame("big_red_block")
    target = state.getFrame("target_pose")
    dir = np.array([target.x_pos, target.y_pos]) - np.array([red_box.x_pos, red_box.y_pos])
    dir_normed = dir / np.linalg.norm(dir)

    # First push start
    offset_mag = max(red_box.size[:2]) * 3
    a_start_x = red_box.x_pos - dir_normed[0]*offset_mag + a_start_x_offset
    a_start_y = red_box.y_pos - dir_normed[1]*offset_mag + a_start_y_offset
    
    # First push end
    a_end_x = target.x_pos + a_end_x_offset
    a_end_y = target.x_pos + a_end_y_offset
    
    # Second push start
    b_start_x = target.x_pos - dir_normed[0]*.2 + a_end_x_offset
    b_start_y = target.y_pos - dir_normed[1]*.2 + a_end_y_offset
    
    # Second push end
    b_end_x = target.x_pos + a_end_x_offset
    b_end_y = target.x_pos + a_end_y_offset

    # First Push #
    actions.append(Action("push_motion", [a_start_x, a_start_y, a_end_x, a_end_y]))

    # Second Push (For adjusting position) #
    actions.append(Action("push_motion", [b_start_x, b_start_y, b_end_x, b_end_y]))

    return actions

def gen_initial_guess(initial: BridgeState):
    return {
        "a_start_x_offset": .0, # BBO initial value
        "a_start_y_offset": .0,
        "a_end_x_offset": .0,
        "a_end_y_offset": .0,
        "b_start_x_offset": .0,
        "b_start_y_offset": .0,
        "b_end_x_offset": .0,
        "b_end_y_offset": .0,
    }
```
