code: def fillout_factor(b, component, solve_for=None, **kwargs):
      
      hier = b.get_hierarchy()
      if not len(hier.get_value()):
          # TODO: change to custom error type to catch in bundle.add_component
          # TODO: check whether the problem is 0 hierarchies or more than 1
          raise NotImplementedError("constraint for requiv_contact_max requires hierarchy")
  
  
      component_ps = _get_system_ps(b, component)
  
      parentorbit = hier.get_parent_of(component)
      parentorbit_ps = _get_system_ps(b, parentorbit)
  
      pot = component_ps.get_parameter(qualifier='pot')
      fillout_factor = component_ps.get_parameter(qualifier='fillout_factor')
      q = parentorbit_ps.get_parameter(qualifier='q')
  
      if solve_for in [None, fillout_factor]:
          lhs = fillout_factor
  
          rhs = roche_pot_to_fillout_factor(q, pot)
      elif solve_for in [pot]:
          lhs = pot
  
          rhs = roche_fillout_factor_to_pot(q, fillout_factor)
      else:
          raise NotImplementedError("fillout_factor can not be solved for {}".format(solve_for))
  
      return lhs, rhs, {'component': component}
docs: Create a constraint to determine the fillout factor of a contact envelope.
  
      :parameter b: the :class:`phoebe.frontend.bundle.Bundle`
      :parameter str component: the label of the star in which this
          constraint should be built
      :parameter str solve_for:  if 'requiv_max' should not be the derived/constrained
          parameter, provide which other parameter should be derived
      :returns: lhs (Parameter), rhs (ConstraintParameter), args (list of arguments
          that were passed to this function)