docs: def StartHunt(args=None, runner_args=None, token=None, **kwargs):
    """This class method creates new hunts."""
  
    # If no token is specified, raise.
    if not token:
      raise access_control.UnauthorizedAccess("A token must be specified.")
  
    # Build the runner args from the keywords.
    if runner_args is None:
      runner_args = rdf_hunts.HuntRunnerArgs()
  
    flow.FilterArgsFromSemanticProtobuf(runner_args, kwargs)
  
    # Is the required hunt a known hunt?
    hunt_cls = GRRHunt.classes.get(runner_args.hunt_name)
    if not hunt_cls or not issubclass(hunt_cls, GRRHunt):
      raise RuntimeError("Unable to locate hunt %s" % runner_args.hunt_name)
  
    # Make a new hunt object and initialize its runner.
    hunt_obj = aff4.FACTORY.Create(None, hunt_cls, mode="w", token=token)
  
    # Hunt is called using keyword args. We construct an args proto from the
    # kwargs.
    if hunt_obj.args_type and args is None:
      args = hunt_obj.args_type()
      flow.FilterArgsFromSemanticProtobuf(args, kwargs)
  
    if hunt_obj.args_type and not isinstance(args, hunt_obj.args_type):
      raise RuntimeError("Hunt args must be instance of %s" % hunt_obj.args_type)
  
    if kwargs:
      raise type_info.UnknownArg("Unknown parameters to StartHunt: %s" % kwargs)
  
    # Store the hunt args.
    hunt_obj.args = args
    hunt_obj.runner_args = runner_args
  
    # Hunts are always created in the paused state. The runner method Start
    # should be called to start them.
    hunt_obj.Set(hunt_obj.Schema.STATE("PAUSED"))
  
    runner = hunt_obj.CreateRunner(runner_args=runner_args)
    # Allow the hunt to do its own initialization.
    runner.RunStateMethod("Start")
  
    hunt_obj.Flush()
  
    try:
      flow_name = args.flow_runner_args.flow_name
    except AttributeError:
      flow_name = ""
  
    event = rdf_events.AuditEvent(
        user=token.username,
        action="HUNT_CREATED",
        urn=hunt_obj.urn,
        flow_name=flow_name,
        description=runner_args.description)
    events_lib.Events.PublishEvent("Audit", event, token=token)
  
    return hunt_obj