code: func (p *Parser) onCSVCMsg_UpdateStringTable(m *dota.CSVCMsg_UpdateStringTable) error {
  	// TODO: integrate
  	t, ok := p.stringTables.Tables[m.GetTableId()]
  	if !ok {
  		_panicf("missing string table %d", m.GetTableId())
  	}
  
  	if v(5) {
  		_debugf("tick=%d name=%s changedEntries=%d size=%d", p.Tick, t.name, m.GetNumChangedEntries(), len(m.GetStringData()))
  	}
  
  	// Parse the updates out of the string table data
  	items := parseStringTable(m.GetStringData(), m.GetNumChangedEntries(), t.name, t.userDataFixedSize, t.userDataSize, t.flags)
  
  	// Apply the updates to the parser state
  	for _, item := range items {
  		index := item.Index
  		if _, ok := t.Items[index]; ok {
  			if item.Key != "" && item.Key != t.Items[index].Key {
  				t.Items[index].Key = item.Key
  			}
  			if len(item.Value) > 0 {
  				t.Items[index].Value = item.Value
  			}
  		} else {
  			t.Items[index] = item
  		}
  	}
  
  	// Apply the updates to baseline state
  	if t.name == "instancebaseline" {
  		p.updateInstanceBaseline()
  	}
  
  	return nil
  }
docs: // Internal callback for CSVCMsg_UpdateStringTable.