1

I am trying to get all customers from QuickBooks 2013 Premier Edition using QBWebConnector. My request QBXML is as follows

  string strRequestXML = "";
        XmlDocument inputXMLDoc = null;
        inputXMLDoc = new XmlDocument();
        inputXMLDoc.AppendChild(inputXMLDoc.CreateXmlDeclaration("1.0", null, null));
        inputXMLDoc.AppendChild(inputXMLDoc.CreateProcessingInstruction("qbxml", "version=\"4.0\""));
        XmlElement qbXML = inputXMLDoc.CreateElement("QBXML");
        inputXMLDoc.AppendChild(qbXML);
        XmlElement qbXMLMsgsRq = inputXMLDoc.CreateElement("QBXMLMsgsRq");
        qbXML.AppendChild(qbXMLMsgsRq);
        qbXMLMsgsRq.SetAttribute("onError", "stopOnError");
        XmlElement customerQueryRq = inputXMLDoc.CreateElement("CustomerQueryRq");
        qbXMLMsgsRq.AppendChild(customerQueryRq);
        customerQueryRq.SetAttribute("requestID", "whatever");
        strRequestXML = inputXMLDoc.OuterXml;
        req.Add(strRequestXML);

Above is my buildRequest Method from WebService , However I am not getting any errors , status is QBWebConnector is OK but doesnot see the response . Here is the log

    20160117.21:51:42 UTC   : QBWebConnector.WebServiceManager.DoUpdateSelected() : updateWS() for application = 'HTTPWebService' has STARTED
20160117.21:51:42 UTC   : QBWebConnector.RegistryManager.getUpdateLock() : HKEY_CURRENT_USER\Software\Intuit\QBWebConnector\UpdateLock = FALSE
20160117.21:51:42 UTC   : QBWebConnector.RegistryManager.setUpdateLock() : HKEY_CURRENT_USER\Software\Intuit\QBWebConnector\UpdateLock has been set to True
20160117.21:51:42 UTC   : QBWebConnector.RegistryManager.setUpdateLock() : ********************* Update session locked *********************
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.instantiateWebService() : Initiated connection to the following application.
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.instantiateWebService() : AppName: HTTPWebService
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.instantiateWebService() : AppUniqueName (if available): HTTPWebService
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.instantiateWebService() : AppURL: http://localhost/WCWebService/WCWebService.asmx
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.do_serverVersion() : *** Calling serverVersion().
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.do_serverVersion() : Received from serverVersion() following parameter:<serverVersionRet="2.0.0.1">
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.do_clientVersion() : *** Calling clientVersion() with following parameter:<productVersion="2.2.0.34">
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.do_clientVersion() : Received from clientVersion() following parameter:<clientVersionRet="">
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.do_clientVersion() : This application agrees with the current version of QBWebConnector. Allowing update operation.
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.do_authenticate() : Authenticating to application 'HTTPWebService', username = 'username'
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.do_authenticate() : *** Calling authenticate() with following parameters:<userName="username"><password=<MaskedForSecurity>
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.updateWS() : Received from authenticate() following parameters:<authRet[0]="e8c16e62-7395-469b-9e8d-ed491b2a578c"><authRet[1]="C:\Users\Public\Documents\Intuit\QuickBooks\Sample Company Files\QuickBooks 2015\Sample_Premier_ProductBased.QBW"><authRet[2]=""><authRet[3]="">
20160117.21:51:42 UTC   : QBWebConnector.RegistryManager.setCurrentWebServiceName() : HKEY_CURRENT_USER\Software\Intuit\QBWebConnector\CurrentWebServiceName has been set to HTTPWebService
20160117.21:51:42 UTC   : QBWebConnector.RegistryManager.setCurrentWebServiceSessionTicket() : HKEY_CURRENT_USER\Software\Intuit\QBWebConnector\CurrentWebServiceSessionTicket has been set to e8c16e62-7395-469b-9e8d-ed491b2a578c
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.CheckCFNResponse() : User authenticated.
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.do_authenticate() : Done.
20160117.21:51:42 UTC   : QBWebConnector.SOAPWebService.OpenConnection() : Connecting to QuickBooks...
20160117.21:51:43 UTC   : QBWebConnector.SOAPWebService.OpenConnection() : Connected., Session started
20160117.21:51:43 UTC   : QBWebConnector.CompanyFileLock.Send_CompanyQueryRqXML() : XML dump follows: -

<?xml version="1.0"?><?qbxml version="13.0"?><QBXML><QBXMLMsgsRq onError="s......

20160117.21:51:43 UTC   : QBWebConnector.CompanyFileLock.Send_CompanyQueryRqXML() : XML dump follows: -

<?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<CompanyQueryRs requestID="1" ......

20160117.21:51:43 UTC   : QBWebConnector.CompanyFileLock.getLock() : Got Lock = UNLOCKED:GHAZANFAR
20160117.21:51:43 UTC   : QBWebConnector.CompanyFileLock.IsLocked() : Lock = UNLOCKED. Returning false.
20160117.21:51:43 UTC   : QBWebConnector.CompanyFileLock.Send_DataExtModRqXML() : XML dump follows: -

<?xml version="1.0"?><?qbxml version="13.0"?><QBXML><QBXMLMsgsRq onError="s......

20160117.21:51:43 UTC   : QBWebConnector.CompanyFileLock.Send_DataExtModRqXML() : XML dump follows: -

<?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<DataExtModRs requestID="1" st......

20160117.21:51:43 UTC   : QBWebConnector.CompanyFileLock.setLock() : Lock has been set to value = <LOCKED:GHAZANFAR:635886643033561787> in QuickBooks for ownerID = <{87EDAAF8-637E-4203-867F-4BA79C2F8998}>
20160117.21:51:44 UTC   : QBWebConnector.CompanyFileLock.Send_CompanyQueryRqXML() : XML dump follows: -

<?xml version="1.0"?><?qbxml version="13.0"?><QBXML><QBXMLMsgsRq onError="s......

20160117.21:51:44 UTC   : QBWebConnector.CompanyFileLock.Send_CompanyQueryRqXML() : XML dump follows: -

<?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<CompanyQueryRs requestID="1" ......

20160117.21:51:44 UTC   : QBWebConnector.CompanyFileLock.getLock() : Got Lock = LOCKED:GHAZANFAR:635886643033561787
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.update() : Company file has been locked for update.
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.update() : Synchronizing with QuickBooks Company Name = Roving Auto Parts Pro
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : Asking application to send request no. 1
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : *** Calling sendRequestXML() with following parameters:
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : wcTicket="e8c16e62-7395-469b-9e8d-ed491b2a578c"
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : HCPResponseXML=
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : XML dump follows: -

<?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<HostQueryRs requestID="0" sta......

20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : cfn="C:\Users\Public\Documents\Intuit\QuickBooks\Sample Company Files\QuickBooks 2015\Sample_Premier_ProductBased.QBW"
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : qbNationality="US"
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : qbXMLMajorVers="13"
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : qbXMLMinorVers="0"
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : Received from sendRequestXML() following parameter:
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : strRequestXML =
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : XML dump follows: -

<?xml version="1.0"?><?qbxml version="4.0"?><QBXML><QBXMLMsgsRq onError="st......

20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.do_sendRequestXML() : Request xml received.
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.ProcessRequestXML() : Processing request #1
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.ProcessRequestXML() : REQUEST: received from application: size (bytes) = 148
20160117.21:51:44 UTC   : QBWebConnector.SOAPWebService.ProcessRequestXML() : Sending request to QuickBooks.
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.ProcessRequestXML() : Response received from QuickBooks: size (bytes) = 107502
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.ProcessRequestXML() : Sending response back to application.
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : *** Calling receiveResponseXML() with following parameters:
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : wcTicket="e8c16e62-7395-469b-9e8d-ed491b2a578c"
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : response =
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : XML dump follows: -

<?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<CustomerQueryRs requestID="wh......

20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : hresult=""
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : message=""
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : Received from receiveResponseXML() following parameters:
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : more="100">
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : Done. No more to process.
20160117.21:51:45 UTC   : QBWebConnector.CompanyFileLock.Send_CompanyQueryRqXML() : XML dump follows: -

<?xml version="1.0"?><?qbxml version="13.0"?><QBXML><QBXMLMsgsRq onError="s......

20160117.21:51:45 UTC   : QBWebConnector.CompanyFileLock.Send_CompanyQueryRqXML() : XML dump follows: -

<?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<CompanyQueryRs requestID="1" ......

20160117.21:51:45 UTC   : QBWebConnector.CompanyFileLock.getLock() : Got Lock = LOCKED:GHAZANFAR:635886643033561787
20160117.21:51:45 UTC   : QBWebConnector.CompanyFileLock.Send_DataExtModRqXML() : XML dump follows: -

<?xml version="1.0"?><?qbxml version="13.0"?><QBXML><QBXMLMsgsRq onError="s......

20160117.21:51:45 UTC   : QBWebConnector.CompanyFileLock.Send_DataExtModRqXML() : XML dump follows: -

<?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<DataExtModRs requestID="1" st......

20160117.21:51:45 UTC   : QBWebConnector.CompanyFileLock.unsetLock() : Company file has been unlocked for ownerID = <{87EDAAF8-637E-4203-867F-4BA79C2F8998}>
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.update() : Company file has been unlocked.
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.update() : Ending session to QuickBooks.
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.DisconnectFromQB() : Session ended and connection closed
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_closeConnection() : *** Calling closeConnection() with following parameter:<wcTicket="e8c16e62-7395-469b-9e8d-ed491b2a578c">
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_closeConnection() : Received from closeConnection() following parameter:<ccResponse="OK">
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_closeConnection() : CloseConnection called to application.
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_closeConnection() : Response received from application = OK
20160117.21:51:45 UTC   : QBWebConnector.RegistryManager.setUpdateLock() : HKEY_CURRENT_USER\Software\Intuit\QBWebConnector\UpdateLock has been set to False
20160117.21:51:45 UTC   : QBWebConnector.RegistryManager.setUpdateLock() : ********************* Update session unlocked *********************
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.update() : update completed.
20160117.21:51:45 UTC   : QBWebConnector.WebServiceManager.DoUpdateSelected() : Update for application = 'HTTPWebService' has COMPLETED
20160117.21:51:45 UTC   : QBWebConnector.WebServiceManager.DoUpdateSelected() : Update session has ended.

Edit Posting code :

public ArrayList buildRequest() 
    {
        //Get All Customer Query
        string strRequestXML = "";
        XmlDocument inputXMLDoc = null;
        inputXMLDoc = new XmlDocument();
        inputXMLDoc.AppendChild(inputXMLDoc.CreateXmlDeclaration("1.0", null, null));
        inputXMLDoc.AppendChild(inputXMLDoc.CreateProcessingInstruction("qbxml", "version=\"4.0\""));
        XmlElement qbXML = inputXMLDoc.CreateElement("QBXML");
        inputXMLDoc.AppendChild(qbXML);
        XmlElement qbXMLMsgsRq = inputXMLDoc.CreateElement("QBXMLMsgsRq");
        qbXML.AppendChild(qbXMLMsgsRq);
        qbXMLMsgsRq.SetAttribute("onError", "stopOnError");
        XmlElement customerQueryRq = inputXMLDoc.CreateElement("CustomerQueryRq");
        qbXMLMsgsRq.AppendChild(customerQueryRq);
        customerQueryRq.SetAttribute("requestID", "whatever");
        strRequestXML = inputXMLDoc.OuterXml;
        req.Add(strRequestXML);

        // Clean up
        strRequestXML="";
        inputXMLDoc=null;
        qbXML=null;
        qbXMLMsgsRq=null;
        //maxReturned=null;
        return req;
    }


public string sendRequestXML(string ticket, string strHCPResponse, string strCompanyFileName, 
        string qbXMLCountry, int qbXMLMajorVers, int qbXMLMinorVers)
    {
        if (Session["counter"] == null) {
            Session["counter"] = 0;
        }
        string evLogTxt="WebMethod: sendRequestXML() has been called by QBWebconnector" + "\r\n\r\n";
        evLogTxt=evLogTxt+"Parameters received:\r\n";
        evLogTxt=evLogTxt+"string ticket = " + ticket + "\r\n";
        evLogTxt=evLogTxt+"string strHCPResponse = " + strHCPResponse + "\r\n";
        evLogTxt=evLogTxt+"string strCompanyFileName = " + strCompanyFileName + "\r\n";
        evLogTxt=evLogTxt+"string qbXMLCountry = " + qbXMLCountry + "\r\n";
        evLogTxt=evLogTxt+"int qbXMLMajorVers = " + qbXMLMajorVers.ToString() + "\r\n";
        evLogTxt=evLogTxt+"int qbXMLMinorVers = " + qbXMLMinorVers.ToString() + "\r\n";
        evLogTxt=evLogTxt+"\r\n";

        ArrayList req=buildRequest();
        string request="";
        int total = req.Count;
        count=Convert.ToInt32(Session["counter"]);

        if(count<total) {
            request=req[count].ToString();
            evLogTxt=evLogTxt+ "sending request no = " + (count+1) + "\r\n";
            Session["counter"] = ((int) Session["counter"]) + 1;
        }
        else{
            count=0;
            Session["counter"]=0;
            request="";
        }
        evLogTxt=evLogTxt+"\r\n";
        evLogTxt=evLogTxt+"Return values: " + "\r\n";
        evLogTxt=evLogTxt+"string request = " + request + "\r\n";
        logEvent(evLogTxt);
        return request;
    }



    [ WebMethod(Description="This web method facilitates web service to receive response XML from QuickBooks via QBWebConnector",EnableSession=true) ]
    /// <summary>
    /// WebMethod - receiveResponseXML()
    /// Signature: public int receiveResponseXML(string ticket, string response, string hresult, string message)
    /// 
    /// IN: 
    /// string ticket
    /// string response
    /// string hresult
    /// string message
    ///
    /// OUT: 
    /// int retVal
    /// Greater than zero  = There are more request to send
    /// 100 = Done. no more request to send
    /// Less than zero  = Custom Error codes
    /// </summary>
    public int receiveResponseXML(string ticket, string response, string hresult, string message)
    {
        string evLogTxt="WebMethod: receiveResponseXML() has been called by QBWebconnector" + "\r\n\r\n";
        evLogTxt=evLogTxt+"Parameters received:\r\n";
        evLogTxt=evLogTxt+"string ticket = " + ticket + "\r\n";
        evLogTxt=evLogTxt+"string response = " + response + "\r\n";
        evLogTxt=evLogTxt+"string hresult = " + hresult + "\r\n";
        evLogTxt=evLogTxt+"string message = " + message + "\r\n";
        evLogTxt=evLogTxt+"\r\n";

        int retVal=0;
        if(!hresult.ToString().Equals("")){
            // if there is an error with response received, web service could also return a -ve int     
            evLogTxt=evLogTxt+ "HRESULT = " + hresult + "\r\n";
            evLogTxt=evLogTxt+ "Message = " + message + "\r\n";
            retVal=-101;
        }
        else{ 
            evLogTxt=evLogTxt+ "Length of response received = " + response.Length + "\r\n";

            ArrayList req = buildRequest();
            int total=req.Count;
            int count=Convert.ToInt32(Session["counter"]);

            int percentage=(count*100)/total;
            if (percentage>=100){
                count=0;
                Session["counter"]=0;
            }
            retVal=percentage;
        }
        evLogTxt=evLogTxt+"\r\n";
        evLogTxt=evLogTxt+"Return values: " + "\r\n";
        evLogTxt=evLogTxt+"int retVal= " + retVal.ToString() + "\r\n";
        logEvent(evLogTxt);
        return retVal;
    }

Here is my send and response methods . Problem is that how do I see the response of getting all customers , and How do I test response in browser ? If I want to test the the service in browser how do I do that ? I want to parse the response in C# classes and use it in my other app.

Ghazanfar Khan
  • 3,648
  • 8
  • 44
  • 89

1 Answers1

2

The response is being sent, successfully, to you in the receiveResponseXML(...) method. You can see this in the logs:

0160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : *** Calling receiveResponseXML() with following parameters:
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : wcTicket="e8c16e62-7395-469b-9e8d-ed491b2a578c"
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : response =
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : XML dump follows: -

<?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<CustomerQueryRs requestID="wh......

20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : hresult=""
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : message=""
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : Received from receiveResponseXML() following parameters:
20160117.21:51:45 UTC   : QBWebConnector.SOAPWebService.do_receiveResponseXML() : more="100">

You neglected to post any of the relevant code, so it's going to be pretty tough to help you beyond that.

You should review how the Web Connector works. There's several hundred pages of documentation available in the QuickBooks SDK:

Here's another summary:

Regarding your added questions:

Problem is that how do I see the response of getting all customers

You can view it in the logs, or you can make your application save it to your database, and display it to you from there.

How do I test response in browser ?

You can't test it in the browser. It's a SOAP service, it has nothing to do with your web browser what-so-ever, in any way at all.

You will never see the XML response, or any data from it, directly in the browser using only the Web Connector.

You will need to parse the XML, store/cache it in your own database, and then you can display the cached/stored data in your own application however you want.

You can not display the response from the Web Connector directly in your browser -- you need to store it somewhere/somehow, and then display the data from whereever it's stored.

Keith Palmer Jr.
  • 27,666
  • 16
  • 68
  • 105
  • Hi @KeithPalmer , I'm looking at the feasibility of develop an app,and I would like to ask you if is possible insert, update and delete items and orders with web connector and quickbook enterprise solution 15 desktop, using the consolibyte PHP DevKit ? thanks in advance. – miglio Jan 18 '16 at 14:43
  • @KeithPalmer I edited the post please look into it and clear my confusion to see response in browser? – Ghazanfar Khan Jan 18 '16 at 16:06
  • @Ghazanfar I responded. Please STOP DOUBLE POSTING. You do not need to double post EVER. – Keith Palmer Jr. Jan 18 '16 at 22:21
  • Thanks @KeithPalmer . Does the logs show 100+ customers ? Will you point me in the code where I can save or cache it ? – Ghazanfar Khan Jan 19 '16 at 06:30
  • if I add this service reference to another asp.net application and use it what will be the steps to follow after authenticate ? – Ghazanfar Khan Jan 19 '16 at 06:36
  • You don't have VERBOSE logging enabled, so it's not possible for me to tell how many customers are getting returned. The XML QuickBooks returned is in the `response` variable in your `receiveResponseXML(...)` method. Store/cache the data in that method. The Web Connector always works the same way -- so if you add this to another project, nothing is going to change. You'll still return qbXML requests from the `sendRequestXML` method, and get a response back in the `receiveResponseXML` method. – Keith Palmer Jr. Jan 19 '16 at 12:03
  • Thanks . If I call this from another project will I have to supply the the parameters in both sendRequestXML and receiveResponseXML? string strHCPResponse, string strCompanyFileName, string qbXMLCountry, int qbXMLMajorVers, int qbXMLMinorVers What values to provide in these params ? – Ghazanfar Khan Jan 20 '16 at 06:44
  • You can't call it from another project. The Web Connector calls these methods, you don't. – Keith Palmer Jr. Jan 20 '16 at 11:45
  • Suppose I add its service reference in another asp.net project , What will be the procedure to invoke these methods If I dont call it ? Basic idea is to add and get data from another application – Ghazanfar Khan Jan 20 '16 at 12:18
  • The Web Connector calls these methods. You NEVER call these methods. End of story. If you need access to the data within QuickBooks, then inside these methods you should store the data in your own database, and then your other projects should read the data from the database where you stored the info. – Keith Palmer Jr. Jan 20 '16 at 13:43