code: func NewRangeFilter(backend Backend, begin, end int64, addresses []common.Address, topics [][]common.Hash) *Filter {
  	// Flatten the address and topic filter clauses into a single bloombits filter
  	// system. Since the bloombits are not positional, nil topics are permitted,
  	// which get flattened into a nil byte slice.
  	var filters [][][]byte
  	if len(addresses) > 0 {
  		filter := make([][]byte, len(addresses))
  		for i, address := range addresses {
  			filter[i] = address.Bytes()
  		}
  		filters = append(filters, filter)
  	}
  	for _, topicList := range topics {
  		filter := make([][]byte, len(topicList))
  		for i, topic := range topicList {
  			filter[i] = topic.Bytes()
  		}
  		filters = append(filters, filter)
  	}
  	size, _ := backend.BloomStatus()
  
  	// Create a generic filter and convert it into a range filter
  	filter := newFilter(backend, addresses, topics)
  
  	filter.matcher = bloombits.NewMatcher(size, filters)
  	filter.begin = begin
  	filter.end = end
  
  	return filter
  }
docs: // NewRangeFilter creates a new filter which uses a bloom filter on blocks to
  // figure out whether a particular block is interesting or not.