public Resultados Timbrar(string layout, WSConecFM.requestTimbrarCFDI RequestTimbrarCFDI)
        {
            Resultados result = new Resultados();

            try
            {
                if (File.Exists(layout))
                {
                    StreamReader objReader = new StreamReader(layout, Encoding.UTF8);
                    layout = objReader.ReadToEnd();
                    objReader.Close();
                }

                // Codificar a base 64 el layout
                layout = Convert.ToBase64String(Encoding.UTF8.GetBytes(layout));

                // Agregar el XML codificado en base64 a la peticion SOAP
                RequestTimbrarCFDI.text2CFDI = layout;

                // indicar que no deseamos esperar confirmación del server, sino que debe enviar los datos al mismo tiempo que se realiza la solicitud.
                System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidarCertificado);

                // set this before any web requests or WCF calls
                if (RequestTimbrarCFDI.proxy_url != "") {
                    WebRequest.DefaultWebProxy = new WebProxy(new Uri(RequestTimbrarCFDI.proxy_url + ":" + RequestTimbrarCFDI.proxy_port))
                    {
                        Credentials = new NetworkCredential(RequestTimbrarCFDI.proxy_user, RequestTimbrarCFDI.proxy_pass),
                    };
                }

                //  Conexion con el WS de Facturacion Moderna
                BasicHttpBinding binding = new BasicHttpBinding();
                setBinding(binding);

                // Direccion del servicio SOAP de Prueba
                EndpointAddress endpoint = new EndpointAddress(RequestTimbrarCFDI.urlTimbrado);

                // Crear instancia al servisio SOAP de Timbrado
                WSLayoutFacturacionModerna.Timbrado_ManagerPort WSFModerna = new WSLayoutFacturacionModerna.Timbrado_ManagerPortClient(binding, endpoint);

                // Ejecutar servicio de Timbrado
                Object objResponse = WSFModerna.requestTimbrarCFDI(RequestTimbrarCFDI);

                if (objResponse != null)
                {
                    XmlDocument xmlDoc = new XmlDocument();
                    XmlDeclaration xmlDeclaration;
                    XmlElement xmlElementBody;
                    xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "uft-8", "no");
                    xmlElementBody = xmlDoc.CreateElement("Container");
                    xmlDoc.InsertBefore(xmlElementBody, xmlDoc.DocumentElement);
                    XmlElement xmlParentNode;
                    xmlParentNode = xmlDoc.CreateElement("responseSoap");
                    xmlDoc.DocumentElement.PrependChild(xmlParentNode);
                    XmlNode[] nodosXmlResponse = (XmlNode[])objResponse;
                    foreach (XmlNode nodo in nodosXmlResponse)
                    {
                        if (nodo.InnerText.Length >= 1)
                        {
                            XmlElement xmlElemetResponse;
                            xmlElemetResponse = xmlDoc.CreateElement(nodo.Name.ToString());
                            XmlText xmlTextNode;
                            xmlTextNode = xmlDoc.CreateTextNode(nodo.InnerText.ToString());
                            xmlParentNode.AppendChild(xmlElemetResponse);
                            xmlElemetResponse.AppendChild(xmlTextNode);
                        }
                    }

                    //-->>Accedemos a los nodos de la respuesta del xml para obenter los valores retornados en base64 (xml, pdf, cbb, txt)
                    XmlElement xmlElementCFDI;
                    //-->>Xml certificado (CFDI)
                    xmlElementCFDI = (XmlElement)xmlDoc.GetElementsByTagName("xml").Item(0);

                    // Obtener UUID del Comprobante
                    XmlDocument cfdiXML = new XmlDocument();
                    byte[] binary = Convert.FromBase64String(xmlElementCFDI.InnerText);
                    String strOriginal = System.Text.Encoding.UTF8.GetString(binary);
                    cfdiXML.LoadXml(strOriginal);
                    XmlElement xmlElementTimbre;
                    xmlElementTimbre = (XmlElement)cfdiXML.GetElementsByTagName("tfd:TimbreFiscalDigital").Item(0);
                    result.uuid = xmlElementTimbre.GetAttribute("UUID");

                    result.xmlBase64 = xmlElementCFDI.InnerText;

                    //-->>Representación impresa del CFDI en formato PDF
                    if (RequestTimbrarCFDI.generarPDF)
                    {
                        XmlElement xmlElementPDF = (XmlElement)xmlDoc.GetElementsByTagName("pdf").Item(0);
                        result.pdfBase64 = xmlElementPDF.InnerText;
                    }

                    //-->>Representación impresa del CFDI en formato TXT
                    if (RequestTimbrarCFDI.generarTXT)
                    {
                        XmlElement xmlElementTXT = (XmlElement)xmlDoc.GetElementsByTagName("txt").Item(0);
                        result.txtBase64 = xmlElementTXT.InnerText;
                    }

                    //-->>Representación impresa del CFDI en formato PNG
                    if (RequestTimbrarCFDI.generarCBB)
                    {
                        XmlElement xmlElementCBB = (XmlElement)xmlDoc.GetElementsByTagName("png").Item(0);
                        result.cbbBase64 = xmlElementCBB.InnerText;
                    }
                    result.code = "T000";
                    result.message = "Comprobante Generado con exito";
                    result.status = true;
                    return result;
                }
                else
                {
                    result.code = "T00N";
                    result.message = "El servicio de timbrado respondio con NULL";
                    result.status = false;
                    return result;
                }
            }
            catch(Exception e)
            {
                result.code = "EX-001";
                result.message = "Error: " + e.Message;
                result.status = false;
                return result;
            }
        }