code: func memberEventStdin(logger *log.Logger, stdin io.WriteCloser, e *serf.MemberEvent) {
  	defer stdin.Close()
  	for _, member := range e.Members {
  		// Format the tags as tag1=v1,tag2=v2,...
  		var tagPairs []string
  		for name, value := range member.Tags {
  			tagPairs = append(tagPairs, fmt.Sprintf("%s=%s", name, value))
  		}
  		tags := strings.Join(tagPairs, ",")
  
  		// Send the entire line
  		_, err := stdin.Write([]byte(fmt.Sprintf(
  			"%s\t%s\t%s\t%s\n",
  			eventClean(member.Name),
  			member.Addr.String(),
  			eventClean(member.Tags["role"]),
  			eventClean(tags))))
  		if err != nil {
  			return
  		}
  	}
  }
docs: // Sends data on stdin for a member event.
  //
  // The format for the data is unix tool friendly, separated by whitespace
  // and newlines. The structure of each line for any member event is:
  // "NAME    ADDRESS    ROLE    TAGS" where the whitespace is actually tabs.
  // The name and role are cleaned so that newlines and tabs are replaced
  // with "\n" and "\t" respectively.