anchor.diff:  
   -spec do_blacklist(nonempty_string()) -> 'ok'.
   do_blacklist(Host) ->
  +    OldConfig = get_full_config(),
  +    RawHosts = get_raw_hosts(OldConfig),
  +    NewBlacklist = make_blacklist(get_expanded_hosts(RawHosts),
  +                                  [Host | get_blacklist(OldConfig)]),
  +    NewConfig = make_config(RawHosts, NewBlacklist),
  +    ok = file:write_file(os:getenv("DISCO_MASTER_CONFIG"),
  +                         mochijson2:encode({struct, NewConfig})),
       disco_server:blacklist(Host, manual).
   
   -spec do_whitelist(nonempty_string()) -> 'ok'.
   do_whitelist(Host) ->
  +    OldConfig = get_full_config(),
  +    RawHosts = get_raw_hosts(OldConfig),
  +    NewBlacklist = make_blacklist(get_expanded_hosts(RawHosts),
  +                                  get_blacklist(OldConfig) -- [Host]),
  +    NewConfig = make_config(RawHosts, NewBlacklist),
  +    ok = file:write_file(os:getenv("DISCO_MASTER_CONFIG"),
  +                         mochijson2:encode({struct, NewConfig})),
       disco_server:whitelist(Host, any).
  
positive.code: %% ===================================================================
  %% internal functions
  
  -spec expand_range(nonempty_string(), nonempty_string()) -> [nonempty_string()].
  expand_range(FirstNode, Max) ->
      Len = string:len(FirstNode),
  
negative.code:     [lists:flatten(io_lib:fwrite(Format, [I])) ||
          I <- lists:seq(MinNum, MaxNum)].
  
  -spec add_nodes([nonempty_string(),...], integer()) ->
      [host_info()] | host_info().
  add_nodes([FirstNode, Max], Instances) ->
      [{N, Instances} || N <- expand_range(FirstNode, Max)];
  add_nodes([Node], Instances) -> {Node, Instances}.
  
  -spec parse_row(hostinfo_line()) -> [host_info()] | host_info().
  parse_row([NodeSpecB, InstancesB]) ->
      NodeSpec = string:strip(binary_to_list(NodeSpecB)),
      Instances = string:strip(binary_to_list(InstancesB)),
  