code: def delete_apps(self, names: List[str], blocking: bool = True):
      if not names:
          return
  
      logger.info(f"Deleting app {names}")
      self._controller.delete_apps.remote(names)
      if blocking:
          start = time.time()
          while time.time() - start < 60:
              curr_statuses_bytes = ray.get(
                  self._controller.get_serve_statuses.remote(names)
              )
              all_deleted = True
              for cur_status_bytes in curr_statuses_bytes:
                  cur_status = StatusOverview.from_proto(
                      StatusOverviewProto.FromString(cur_status_bytes)
                  )
                  if (
                      cur_status.app_status.status
                      != ApplicationStatus.NOT_STARTED
                  ):
                      all_deleted = False
              if all_deleted:
                  return
              time.sleep(CLIENT_POLLING_INTERVAL_S)
          else:
              raise TimeoutError(
                  f"Some of these applications weren't deleted after 60s: {names}"
              )
  
imports: import logging
  import random
  import time
  from functools import wraps
  from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple, Union
  import ray
  from ray.actor import ActorHandle
  from ray.serve._private.common import ApplicationStatus, DeploymentID, DeploymentStatus, DeploymentStatusInfo, MultiplexedReplicaInfo, StatusOverview
  from ray.serve._private.config import DeploymentConfig, ReplicaConfig
  from ray.serve._private.constants import CLIENT_CHECK_CREATION_POLLING_INTERVAL_S, CLIENT_POLLING_INTERVAL_S, MAX_CACHED_HANDLES, RAY_SERVE_ENABLE_NEW_HANDLE_API, SERVE_DEFAULT_APP_NAME
  from ray.serve._private.controller import ServeController
  from ray.serve._private.deploy_utils import get_deploy_args
  from ray.serve._private.deployment_info import DeploymentInfo
  from ray.serve.config import HTTPOptions
  from ray.serve.exceptions import RayServeException
  from ray.serve.generated.serve_pb2 import DeploymentArgs, DeploymentRoute, DeploymentRouteList
  from ray.serve.generated.serve_pb2 import DeploymentStatusInfo
  from ray.serve.generated.serve_pb2 import StatusOverview
  from ray.serve.handle import DeploymentHandle, RayServeHandle, RayServeSyncHandle
  from ray.serve.schema import LoggingConfig, ServeApplicationSchema, ServeDeploySchema
label_desc: Use image node_id 14 for calling the ServeControllerClient obj's underlying member method code with example usage: obj.delete_apps(names, blocking) without return types