func (s *Set) Put(label, value string) {
	n := len(s.Properties)
	s.Properties = append(s.Properties, Property{Label: label, Value: value})
	s.Index[label] = append(s.Index[label], n)
}
Put puts a property to the set.
package ltsv
import (
	"bufio"
	"bytes"
	"io"
)
type Reader struct {
	rd *bufio.Reader
}
func NewReader(r io.Reader) *Reader {
	return &Reader{
		rd: bufio.NewReader(r),
	}
}
func (r *Reader) readLine() ([]byte, error) {
	d, err := r.rd.ReadSlice('\n')
	if err == nil || (err == io.EOF && len(d) > 0) {
		return d, nil
	} else if err != bufio.ErrBufferFull {
		return nil, err
	}
	bb := bytes.NewBuffer(d)
	for {
		d2, err := r.rd.ReadSlice('\n')
		if len(d2) > 0 {
			if _, err := bb.Write(d2); err != nil {
				return nil, err
			}
		}
		if err == nil || err == io.EOF {
			return bb.Bytes(), nil
		}
		if err != bufio.ErrBufferFull {
			return nil, err
		}
	}
}
func (r *Reader) Read() (*Set, error) {
	d, err := r.readLine()
	if err != nil {
		return nil, err
	}
	d = bytes.TrimLeft(d, " \n\r\t")
	d = bytes.TrimRight(d, "\n\r\t")
	s := &Set{
		Index: make(map[string][]int),
	}
	for _, raw := range bytes.Split(d, []byte("\t")) {
		kv := bytes.SplitN(raw, []byte(":"), 2)
		if len(kv) != 2 {
			continue
		}
		s.Put(string(kv[0]), string(kv[1]))
	}
	return s, nil
}
type Set struct {
	Properties []Property
	Index      map[string][]int
}