code: func (cg configGroup) checkLimitsForObtainingNewCerts(name string, cfg *Config) error {
  	// User can set hard limit for number of certs for the process to issue
  	if cfg.OnDemandState.MaxObtain > 0 &&
  		atomic.LoadInt32(&cfg.OnDemandState.ObtainedCount) >= cfg.OnDemandState.MaxObtain {
  		return fmt.Errorf("%s: maximum certificates issued (%d)", name, cfg.OnDemandState.MaxObtain)
  	}
  
  	// Make sure name hasn't failed a challenge recently
  	failedIssuanceMu.RLock()
  	when, ok := failedIssuance[name]
  	failedIssuanceMu.RUnlock()
  	if ok {
  		return fmt.Errorf("%s: throttled; refusing to issue cert since last attempt on %s failed", name, when.String())
  	}
  
  	// Make sure, if we've issued a few certificates already, that we haven't
  	// issued any recently
  	lastIssueTimeMu.Lock()
  	since := time.Since(lastIssueTime)
  	lastIssueTimeMu.Unlock()
  	if atomic.LoadInt32(&cfg.OnDemandState.ObtainedCount) >= 10 && since < 10*time.Minute {
  		return fmt.Errorf("%s: throttled; last certificate was obtained %v ago", name, since)
  	}
  
  	// 👍Good to go
  	return nil
  }
docs: // checkLimitsForObtainingNewCerts checks to see if name can be issued right
  // now according to mitigating factors we keep track of and preferences the
  // user has set. If a non-nil error is returned, do not issue a new certificate
  // for name.