anchor.diff:      S = io_lib:format("~p",[Data]),
       epl:to_bin(lists:flatten(S)).
   
  -get_changes(Data, Pid, Changes) ->
  +merge_changes(Data, Pid, Changes) ->
       parse_data(Data, Pid) ++ Changes.
   
   parse_data(Data, Pid) ->
  
positive.code: %%% Internal functions
  %%%===================================================================
  
  track_timeline(Pid) ->
      epl_tracer:track_timeline(Pid),
      {Pid, pid_to_list(Pid), []}.
  
negative.code:     NextSubs = lists:delete(Pid, Subs),
      {noreply, State#state{subscribers = NextSubs}};
  handle_cast({add, Pid}, State = #state{timelines = Timelines}) when is_pid(Pid) ->
      T = case lists:any(fun({P,_,_}) -> P == Pid end, Timelines) of
          true -> Timelines;
          _    -> [track_timeline(Pid)|Timelines]
          end,
      {noreply, State#state{timelines = T}};
  handle_cast({remove, Pid}, State = #state{timelines = Timelines}) when is_pid(Pid) ->
      NextTimelines = lists:filter(fun({P,_,_}) -> P /= Pid end, Timelines),
      {noreply, State#state{timelines = NextTimelines}};
  handle_cast(_Msg, State) ->
      {noreply, State}.
  
  handle_info({data, _, Data}, State = #state{subscribers = Subs, timelines = Timelines}) ->
      {Maped, Updated} = lists:foldl(fun (T, A) -> update_timeline(T, A, Data) end, {[], []}, Timelines),
      JSON = epl_json:encode(#{timelines => Maped}, <<"timeline-info">>),
      [Pid ! {data, JSON} || Pid <- Subs],
      {noreply, State#state{timelines = Updated}}.
  
  terminate(_Reason, _State) ->
      ok.
  