let receive_w (ie : input_event) (w: waiting_w) 
: state_w * output_event list = 
        let lev = (label_input ie) in      

        (* additional levels for ie *)
        let add_levs = (ro ie) in
        
        (* if lev is also a new level, add it to a list *)
        let new_lev = (if List.mem lev w.all_ls then [] 
                       else [lev]) in        

        (* find levels in add_levs that are new among all_ls *)
        let new_add_levs = (find_new_levels w.all_ls (add_levs @ new_lev) []) in

        (* for all new_add_levs make a copy from a lower level *)
        let p' = (make_new_copies new_add_levs L w.p) in

        (* build a list of levels to run ie: only those level l when 
         * pi_l(ie) <> Suppress, also add new_add_levels to this list *)

        let upper_list = (insert_levels (upper w.all_ls ie) new_add_levs) in

        let all_ls = (insert_levels w.all_ls new_add_levs) in

        let p'' = (update_pointers upper_list p' ie) in
        let os = (get_output p' ie) in

        let os'= (filter_outputs os lev new_add_levs) in
        
                ((Running_w({p=p''; ls=upper_list; all_ls=all_ls})), os')