<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def start(self):
 """ Start the WBEM listener threads, if they are not yet running. A thread serving CIM-XML over HTTP is started if an HTTP port was specified for the listener. A thread serving CIM-XML over HTTPS is started if an HTTPS port was specified for the listener. These server threads will handle the ExportIndication export message described in :term:`DSP0200` and they will invoke the registered callback functions for any received CIM indications. The listener must be stopped again in order to free the TCP/IP port it listens on. The listener can be stopped explicitly using the :meth:`~pywbem.WBEMListener.stop` method. The listener will be automatically stopped when the main thread terminates (i.e. when the Python process terminates), or when :class:`~pywbem.WBEMListener` is used as a context manager when leaving its scope. Raises: :exc:`~py:exceptions.OSError`: with :attr:`~OSError.errno` = :data:`py:errno.EADDRINUSE` when the WBEM listener port is already in use. """


        if self._http_port:
            if not self._http_server:
                try:
                    server = ThreadedHTTPServer((self._host, self._http_port),
                                                ListenerRequestHandler)
                except Exception as exc:
                    # Linux+py2: socket.error; Linux+py3: OSError;
                    # Windows does not raise any exception.
                    if getattr(exc, 'errno', None) == errno.EADDRINUSE:
                        # Reraise with improved error message
                        msg = _format("WBEM listener port {0} already in use",
                                      self._http_port)
                        exc_type = OSError
                        six.reraise(exc_type, exc_type(errno.EADDRINUSE, msg),
                                    sys.exc_info()[2])
                    raise

                # pylint: disable=attribute-defined-outside-init
                server.listener = self
                thread = threading.Thread(target=server.serve_forever)
                thread.daemon = True  # Exit server thread upon main thread exit
                self._http_server = server
                self._http_thread = thread
                thread.start()
        else:
            # Just in case someone changed self._http_port after init...
            self._http_server = None
            self._http_thread = None

        if self._https_port:
            if not self._https_server:
                try:
                    server = ThreadedHTTPServer((self._host, self._https_port),
                                                ListenerRequestHandler)
                except Exception as exc:
                    # Linux+py2: socket.error; Linux+py3: OSError;
                    # Windows does not raise any exception.
                    if getattr(exc, 'errno', None) == errno.EADDRINUSE:
                        # Reraise with improved error message
                        msg = _format("WBEM listener port {0} already in use",
                                      self._http_port)
                        exc_type = OSError
                        six.reraise(exc_type, exc_type(errno.EADDRINUSE, msg),
                                    sys.exc_info()[2])
                    raise

                # pylint: disable=attribute-defined-outside-init
                server.listener = self
                server.socket = ssl.wrap_socket(server.socket,
                                                certfile=self._certfile,
                                                keyfile=self._keyfile,
                                                server_side=True)
                thread = threading.Thread(target=server.serve_forever)
                thread.daemon = True  # Exit server thread upon main thread exit
                self._https_server = server
                self._https_thread = thread
                thread.start()
        else:
            # Just in case someone changed self._https_port after init...
            self._https_server = None
            self._https_thread = None