code: func CleanupLeftovers(ipvs utilipvs.Interface, ipt utiliptables.Interface, ipset utilipset.Interface, cleanupIPVS bool) (encounteredError bool) {
  	if cleanupIPVS {
  		// Return immediately when ipvs interface is nil - Probably initialization failed in somewhere.
  		if ipvs == nil {
  			return true
  		}
  		encounteredError = false
  		err := ipvs.Flush()
  		if err != nil {
  			klog.Errorf("Error flushing IPVS rules: %v", err)
  			encounteredError = true
  		}
  	}
  	// Delete dummy interface created by ipvs Proxier.
  	nl := NewNetLinkHandle(false)
  	err := nl.DeleteDummyDevice(DefaultDummyDevice)
  	if err != nil {
  		klog.Errorf("Error deleting dummy device %s created by IPVS proxier: %v", DefaultDummyDevice, err)
  		encounteredError = true
  	}
  	// Clear iptables created by ipvs Proxier.
  	encounteredError = cleanupIptablesLeftovers(ipt) || encounteredError
  	// Destroy ip sets created by ipvs Proxier.  We should call it after cleaning up
  	// iptables since we can NOT delete ip set which is still referenced by iptables.
  	for _, set := range ipsetInfo {
  		err = ipset.DestroySet(set.name)
  		if err != nil {
  			if !utilipset.IsNotFoundError(err) {
  				klog.Errorf("Error removing ipset %s, error: %v", set.name, err)
  				encounteredError = true
  			}
  		}
  	}
  	return encounteredError
  }
docs: // CleanupLeftovers clean up all ipvs and iptables rules created by ipvs Proxier.