code: func QUICListener(addr string, config *QUICConfig) (Listener, error) {
  	if config == nil {
  		config = &QUICConfig{}
  	}
  	quicConfig := &quic.Config{
  		HandshakeTimeout: config.Timeout,
  		KeepAlive:        config.KeepAlive,
  		IdleTimeout:      config.IdleTimeout,
  	}
  
  	tlsConfig := config.TLSConfig
  	if tlsConfig == nil {
  		tlsConfig = DefaultTLSConfig
  	}
  
  	var conn net.PacketConn
  
  	udpAddr, err := net.ResolveUDPAddr("udp", addr)
  	if err != nil {
  		return nil, err
  	}
  	lconn, err := net.ListenUDP("udp", udpAddr)
  	if err != nil {
  		return nil, err
  	}
  	conn = lconn
  
  	if config.Key != nil {
  		conn = &quicCipherConn{UDPConn: lconn, key: config.Key}
  	}
  
  	ln, err := quic.Listen(conn, tlsConfig, quicConfig)
  	if err != nil {
  		return nil, err
  	}
  
  	l := &quicListener{
  		ln:       ln,
  		connChan: make(chan net.Conn, 1024),
  		errChan:  make(chan error, 1),
  	}
  	go l.listenLoop()
  
  	return l, nil
  }
docs: // QUICListener creates a Listener for QUIC proxy server.