code: func (m *model) LocalChangedFiles(folder string, page, perpage int) []db.FileInfoTruncated {
  	m.fmut.RLock()
  	rf, ok := m.folderFiles[folder]
  	fcfg := m.folderCfgs[folder]
  	m.fmut.RUnlock()
  
  	if !ok {
  		return nil
  	}
  	if fcfg.Type != config.FolderTypeReceiveOnly {
  		return nil
  	}
  	if rf.ReceiveOnlyChangedSize().TotalItems() == 0 {
  		return nil
  	}
  
  	files := make([]db.FileInfoTruncated, 0, perpage)
  
  	skip := (page - 1) * perpage
  	get := perpage
  
  	rf.WithHaveTruncated(protocol.LocalDeviceID, func(f db.FileIntf) bool {
  		if !f.IsReceiveOnlyChanged() {
  			return true
  		}
  		if skip > 0 {
  			skip--
  			return true
  		}
  		ft := f.(db.FileInfoTruncated)
  		files = append(files, ft)
  		get--
  		return get > 0
  	})
  
  	return files
  }
docs: // LocalChangedFiles returns a paginated list of currently needed files in
  // progress, queued, and to be queued on next puller iteration, as well as the
  // total number of files currently needed.