docs: def _create_inbound_stream(self, config=None):
          """
          Creates an inbound stream from its config.
  
          Params:
              config:       stream configuration as read by ait.config
          Returns:
              stream:       a Stream
          Raises:
              ValueError:   if any of the required config values are missing
          """
          if config is None:
              raise ValueError('No stream config to create stream from.')
  
          name = self._get_stream_name(config)
          stream_handlers = self._get_stream_handlers(config, name)
          stream_input = config.get('input', None)
          if stream_input is None:
              raise(cfg.AitConfigMissing('inbound stream {}\'s input'.format(name)))
  
          if type(stream_input[0]) is int:
              return PortInputStream(name,
                                     stream_input,
                                     stream_handlers,
                                     zmq_args={'zmq_context': self.broker.context,
                                               'zmq_proxy_xsub_url': self.broker.XSUB_URL,
                                               'zmq_proxy_xpub_url': self.broker.XPUB_URL})
          else:
              return ZMQStream(name,
                               stream_input,
                               stream_handlers,
                               zmq_args={'zmq_context': self.broker.context,
                                         'zmq_proxy_xsub_url': self.broker.XSUB_URL,
                                         'zmq_proxy_xpub_url': self.broker.XPUB_URL})