diff --git a/mingw-w64-headers/include/httprequest.h b/mingw-w64-headers/include/httprequest.h
new file mode 100644
index 0000000..7d54c6c
--- /dev/null
+++ b/mingw-w64-headers/include/httprequest.h
@@ -0,0 +1,473 @@
+/*** Autogenerated by WIDL 10.4 from include/httprequest.idl - Do not edit ***/
+
+#ifdef _WIN32
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+#include <rpc.h>
+#include <rpcndr.h>
+#endif
+
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
+
+#ifndef __httprequest_h__
+#define __httprequest_h__
+
+/* Forward declarations */
+
+#ifndef __IWinHttpRequest_FWD_DEFINED__
+#define __IWinHttpRequest_FWD_DEFINED__
+typedef interface IWinHttpRequest IWinHttpRequest;
+#ifdef __cplusplus
+interface IWinHttpRequest;
+#endif /* __cplusplus */
+#endif
+
+#ifndef __WinHttpRequest_FWD_DEFINED__
+#define __WinHttpRequest_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class WinHttpRequest WinHttpRequest;
+#else
+typedef struct WinHttpRequest WinHttpRequest;
+#endif /* defined __cplusplus */
+#endif /* defined __WinHttpRequest_FWD_DEFINED__ */
+
+/* Headers for imported files */
+
+#include <oaidl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef __WinHttp_LIBRARY_DEFINED__
+#define __WinHttp_LIBRARY_DEFINED__
+
+DEFINE_GUID(LIBID_WinHttp, 0x662901fc, 0x6951, 0x4854, 0x9e,0xb2, 0xd9,0xa2,0x57,0x0f,0x2b,0x2e);
+
+typedef LONG HTTPREQUEST_PROXY_SETTING;
+#define HTTPREQUEST_PROXYSETTING_DEFAULT (0x0)
+
+#define HTTPREQUEST_PROXYSETTING_PRECONFIG (0x0)
+
+#define HTTPREQUEST_PROXYSETTING_DIRECT (0x1)
+
+#define HTTPREQUEST_PROXYSETTING_PROXY (0x2)
+
+typedef LONG HTTPREQUEST_SETCREDENTIALS_FLAGS;
+#define HTTPREQUEST_SETCREDENTIALS_FOR_SERVER (0x0)
+
+#define HTTPREQUEST_SETCREDENTIALS_FOR_PROXY (0x1)
+
+typedef enum WinHttpRequestOption {
+    WinHttpRequestOption_UserAgentString = 0,
+    WinHttpRequestOption_URL = 1,
+    WinHttpRequestOption_URLCodePage = 2,
+    WinHttpRequestOption_EscapePercentInURL = 3,
+    WinHttpRequestOption_SslErrorIgnoreFlags = 4,
+    WinHttpRequestOption_SelectCertificate = 5,
+    WinHttpRequestOption_EnableRedirects = 6,
+    WinHttpRequestOption_UrlEscapeDisable = 7,
+    WinHttpRequestOption_UrlEscapeDisableQuery = 8,
+    WinHttpRequestOption_SecureProtocols = 9,
+    WinHttpRequestOption_EnableTracing = 10,
+    WinHttpRequestOption_RevertImpersonationOverSsl = 11,
+    WinHttpRequestOption_EnableHttpsToHttpRedirects = 12,
+    WinHttpRequestOption_EnablePassportAuthentication = 13,
+    WinHttpRequestOption_MaxAutomaticRedirects = 14,
+    WinHttpRequestOption_MaxResponseHeaderSize = 15,
+    WinHttpRequestOption_MaxResponseDrainSize = 16,
+    WinHttpRequestOption_EnableHttp1_1 = 17,
+    WinHttpRequestOption_EnableCertificateRevocationCheck = 18,
+    WinHttpRequestOption_RejectUserpwd = 19
+} WinHttpRequestOption;
+typedef enum WinHttpRequestAutoLogonPolicy {
+    AutoLogonPolicy_Always = 0,
+    AutoLogonPolicy_OnlyIfBypassProxy = 1,
+    AutoLogonPolicy_Never = 2
+} WinHttpRequestAutoLogonPolicy;
+/*****************************************************************************
+ * IWinHttpRequest interface
+ */
+#ifndef __IWinHttpRequest_INTERFACE_DEFINED__
+#define __IWinHttpRequest_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWinHttpRequest, 0x016fe2ec, 0xb2c8, 0x45f8, 0xb2,0x3b, 0x39,0xe5,0x3a,0x75,0x39,0x6b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("016fe2ec-b2c8-45f8-b23b-39e53a75396b")
+IWinHttpRequest : public IDispatch
+{
+    virtual HRESULT STDMETHODCALLTYPE SetProxy(
+        HTTPREQUEST_PROXY_SETTING proxy_setting,
+        VARIANT proxy_server,
+        VARIANT bypass_list) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetCredentials(
+        BSTR username,
+        BSTR password,
+        HTTPREQUEST_SETCREDENTIALS_FLAGS flags) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Open(
+        BSTR method,
+        BSTR url,
+        VARIANT async) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetRequestHeader(
+        BSTR header,
+        BSTR value) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetResponseHeader(
+        BSTR header,
+        BSTR *value) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetAllResponseHeaders(
+        BSTR *headers) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Send(
+        VARIANT body) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Status(
+        LONG *status) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_StatusText(
+        BSTR *status) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_ResponseText(
+        BSTR *body) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_ResponseBody(
+        VARIANT *body) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_ResponseStream(
+        VARIANT *body) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE get_Option(
+        WinHttpRequestOption option,
+        VARIANT *value) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE put_Option(
+        WinHttpRequestOption option,
+        VARIANT value) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE WaitForResponse(
+        VARIANT timeout,
+        VARIANT_BOOL *succeeded) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Abort(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetTimeouts(
+        LONG resolve_timeout,
+        LONG connect_timeout,
+        LONG send_timeout,
+        LONG receive_timeout) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetClientCertificate(
+        BSTR certificate) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetAutoLogonPolicy(
+        WinHttpRequestAutoLogonPolicy policy) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWinHttpRequest, 0x016fe2ec, 0xb2c8, 0x45f8, 0xb2,0x3b, 0x39,0xe5,0x3a,0x75,0x39,0x6b)
+#endif
+#else
+typedef struct IWinHttpRequestVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWinHttpRequest *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWinHttpRequest *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWinHttpRequest *This);
+
+    /*** IDispatch methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
+        IWinHttpRequest *This,
+        UINT *pctinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
+        IWinHttpRequest *This,
+        UINT iTInfo,
+        LCID lcid,
+        ITypeInfo **ppTInfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
+        IWinHttpRequest *This,
+        REFIID riid,
+        LPOLESTR *rgszNames,
+        UINT cNames,
+        LCID lcid,
+        DISPID *rgDispId);
+
+    HRESULT (STDMETHODCALLTYPE *Invoke)(
+        IWinHttpRequest *This,
+        DISPID dispIdMember,
+        REFIID riid,
+        LCID lcid,
+        WORD wFlags,
+        DISPPARAMS *pDispParams,
+        VARIANT *pVarResult,
+        EXCEPINFO *pExcepInfo,
+        UINT *puArgErr);
+
+    /*** IWinHttpRequest methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetProxy)(
+        IWinHttpRequest *This,
+        HTTPREQUEST_PROXY_SETTING proxy_setting,
+        VARIANT proxy_server,
+        VARIANT bypass_list);
+
+    HRESULT (STDMETHODCALLTYPE *SetCredentials)(
+        IWinHttpRequest *This,
+        BSTR username,
+        BSTR password,
+        HTTPREQUEST_SETCREDENTIALS_FLAGS flags);
+
+    HRESULT (STDMETHODCALLTYPE *Open)(
+        IWinHttpRequest *This,
+        BSTR method,
+        BSTR url,
+        VARIANT async);
+
+    HRESULT (STDMETHODCALLTYPE *SetRequestHeader)(
+        IWinHttpRequest *This,
+        BSTR header,
+        BSTR value);
+
+    HRESULT (STDMETHODCALLTYPE *GetResponseHeader)(
+        IWinHttpRequest *This,
+        BSTR header,
+        BSTR *value);
+
+    HRESULT (STDMETHODCALLTYPE *GetAllResponseHeaders)(
+        IWinHttpRequest *This,
+        BSTR *headers);
+
+    HRESULT (STDMETHODCALLTYPE *Send)(
+        IWinHttpRequest *This,
+        VARIANT body);
+
+    HRESULT (STDMETHODCALLTYPE *get_Status)(
+        IWinHttpRequest *This,
+        LONG *status);
+
+    HRESULT (STDMETHODCALLTYPE *get_StatusText)(
+        IWinHttpRequest *This,
+        BSTR *status);
+
+    HRESULT (STDMETHODCALLTYPE *get_ResponseText)(
+        IWinHttpRequest *This,
+        BSTR *body);
+
+    HRESULT (STDMETHODCALLTYPE *get_ResponseBody)(
+        IWinHttpRequest *This,
+        VARIANT *body);
+
+    HRESULT (STDMETHODCALLTYPE *get_ResponseStream)(
+        IWinHttpRequest *This,
+        VARIANT *body);
+
+    HRESULT (STDMETHODCALLTYPE *get_Option)(
+        IWinHttpRequest *This,
+        WinHttpRequestOption option,
+        VARIANT *value);
+
+    HRESULT (STDMETHODCALLTYPE *put_Option)(
+        IWinHttpRequest *This,
+        WinHttpRequestOption option,
+        VARIANT value);
+
+    HRESULT (STDMETHODCALLTYPE *WaitForResponse)(
+        IWinHttpRequest *This,
+        VARIANT timeout,
+        VARIANT_BOOL *succeeded);
+
+    HRESULT (STDMETHODCALLTYPE *Abort)(
+        IWinHttpRequest *This);
+
+    HRESULT (STDMETHODCALLTYPE *SetTimeouts)(
+        IWinHttpRequest *This,
+        LONG resolve_timeout,
+        LONG connect_timeout,
+        LONG send_timeout,
+        LONG receive_timeout);
+
+    HRESULT (STDMETHODCALLTYPE *SetClientCertificate)(
+        IWinHttpRequest *This,
+        BSTR certificate);
+
+    HRESULT (STDMETHODCALLTYPE *SetAutoLogonPolicy)(
+        IWinHttpRequest *This,
+        WinHttpRequestAutoLogonPolicy policy);
+
+    END_INTERFACE
+} IWinHttpRequestVtbl;
+
+interface IWinHttpRequest {
+    CONST_VTBL IWinHttpRequestVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWinHttpRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWinHttpRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWinHttpRequest_Release(This) (This)->lpVtbl->Release(This)
+/*** IDispatch methods ***/
+#define IWinHttpRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
+#define IWinHttpRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
+#define IWinHttpRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
+#define IWinHttpRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
+/*** IWinHttpRequest methods ***/
+#define IWinHttpRequest_SetProxy(This,proxy_setting,proxy_server,bypass_list) (This)->lpVtbl->SetProxy(This,proxy_setting,proxy_server,bypass_list)
+#define IWinHttpRequest_SetCredentials(This,username,password,flags) (This)->lpVtbl->SetCredentials(This,username,password,flags)
+#define IWinHttpRequest_Open(This,method,url,async) (This)->lpVtbl->Open(This,method,url,async)
+#define IWinHttpRequest_SetRequestHeader(This,header,value) (This)->lpVtbl->SetRequestHeader(This,header,value)
+#define IWinHttpRequest_GetResponseHeader(This,header,value) (This)->lpVtbl->GetResponseHeader(This,header,value)
+#define IWinHttpRequest_GetAllResponseHeaders(This,headers) (This)->lpVtbl->GetAllResponseHeaders(This,headers)
+#define IWinHttpRequest_Send(This,body) (This)->lpVtbl->Send(This,body)
+#define IWinHttpRequest_get_Status(This,status) (This)->lpVtbl->get_Status(This,status)
+#define IWinHttpRequest_get_StatusText(This,status) (This)->lpVtbl->get_StatusText(This,status)
+#define IWinHttpRequest_get_ResponseText(This,body) (This)->lpVtbl->get_ResponseText(This,body)
+#define IWinHttpRequest_get_ResponseBody(This,body) (This)->lpVtbl->get_ResponseBody(This,body)
+#define IWinHttpRequest_get_ResponseStream(This,body) (This)->lpVtbl->get_ResponseStream(This,body)
+#define IWinHttpRequest_get_Option(This,option,value) (This)->lpVtbl->get_Option(This,option,value)
+#define IWinHttpRequest_put_Option(This,option,value) (This)->lpVtbl->put_Option(This,option,value)
+#define IWinHttpRequest_WaitForResponse(This,timeout,succeeded) (This)->lpVtbl->WaitForResponse(This,timeout,succeeded)
+#define IWinHttpRequest_Abort(This) (This)->lpVtbl->Abort(This)
+#define IWinHttpRequest_SetTimeouts(This,resolve_timeout,connect_timeout,send_timeout,receive_timeout) (This)->lpVtbl->SetTimeouts(This,resolve_timeout,connect_timeout,send_timeout,receive_timeout)
+#define IWinHttpRequest_SetClientCertificate(This,certificate) (This)->lpVtbl->SetClientCertificate(This,certificate)
+#define IWinHttpRequest_SetAutoLogonPolicy(This,policy) (This)->lpVtbl->SetAutoLogonPolicy(This,policy)
+#else
+/*** IUnknown methods ***/
+static inline HRESULT IWinHttpRequest_QueryInterface(IWinHttpRequest* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static inline ULONG IWinHttpRequest_AddRef(IWinHttpRequest* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static inline ULONG IWinHttpRequest_Release(IWinHttpRequest* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDispatch methods ***/
+static inline HRESULT IWinHttpRequest_GetTypeInfoCount(IWinHttpRequest* This,UINT *pctinfo) {
+    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
+}
+static inline HRESULT IWinHttpRequest_GetTypeInfo(IWinHttpRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
+    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
+}
+static inline HRESULT IWinHttpRequest_GetIDsOfNames(IWinHttpRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
+    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
+}
+static inline HRESULT IWinHttpRequest_Invoke(IWinHttpRequest* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
+    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
+}
+/*** IWinHttpRequest methods ***/
+static inline HRESULT IWinHttpRequest_SetProxy(IWinHttpRequest* This,HTTPREQUEST_PROXY_SETTING proxy_setting,VARIANT proxy_server,VARIANT bypass_list) {
+    return This->lpVtbl->SetProxy(This,proxy_setting,proxy_server,bypass_list);
+}
+static inline HRESULT IWinHttpRequest_SetCredentials(IWinHttpRequest* This,BSTR username,BSTR password,HTTPREQUEST_SETCREDENTIALS_FLAGS flags) {
+    return This->lpVtbl->SetCredentials(This,username,password,flags);
+}
+static inline HRESULT IWinHttpRequest_Open(IWinHttpRequest* This,BSTR method,BSTR url,VARIANT async) {
+    return This->lpVtbl->Open(This,method,url,async);
+}
+static inline HRESULT IWinHttpRequest_SetRequestHeader(IWinHttpRequest* This,BSTR header,BSTR value) {
+    return This->lpVtbl->SetRequestHeader(This,header,value);
+}
+static inline HRESULT IWinHttpRequest_GetResponseHeader(IWinHttpRequest* This,BSTR header,BSTR *value) {
+    return This->lpVtbl->GetResponseHeader(This,header,value);
+}
+static inline HRESULT IWinHttpRequest_GetAllResponseHeaders(IWinHttpRequest* This,BSTR *headers) {
+    return This->lpVtbl->GetAllResponseHeaders(This,headers);
+}
+static inline HRESULT IWinHttpRequest_Send(IWinHttpRequest* This,VARIANT body) {
+    return This->lpVtbl->Send(This,body);
+}
+static inline HRESULT IWinHttpRequest_get_Status(IWinHttpRequest* This,LONG *status) {
+    return This->lpVtbl->get_Status(This,status);
+}
+static inline HRESULT IWinHttpRequest_get_StatusText(IWinHttpRequest* This,BSTR *status) {
+    return This->lpVtbl->get_StatusText(This,status);
+}
+static inline HRESULT IWinHttpRequest_get_ResponseText(IWinHttpRequest* This,BSTR *body) {
+    return This->lpVtbl->get_ResponseText(This,body);
+}
+static inline HRESULT IWinHttpRequest_get_ResponseBody(IWinHttpRequest* This,VARIANT *body) {
+    return This->lpVtbl->get_ResponseBody(This,body);
+}
+static inline HRESULT IWinHttpRequest_get_ResponseStream(IWinHttpRequest* This,VARIANT *body) {
+    return This->lpVtbl->get_ResponseStream(This,body);
+}
+static inline HRESULT IWinHttpRequest_get_Option(IWinHttpRequest* This,WinHttpRequestOption option,VARIANT *value) {
+    return This->lpVtbl->get_Option(This,option,value);
+}
+static inline HRESULT IWinHttpRequest_put_Option(IWinHttpRequest* This,WinHttpRequestOption option,VARIANT value) {
+    return This->lpVtbl->put_Option(This,option,value);
+}
+static inline HRESULT IWinHttpRequest_WaitForResponse(IWinHttpRequest* This,VARIANT timeout,VARIANT_BOOL *succeeded) {
+    return This->lpVtbl->WaitForResponse(This,timeout,succeeded);
+}
+static inline HRESULT IWinHttpRequest_Abort(IWinHttpRequest* This) {
+    return This->lpVtbl->Abort(This);
+}
+static inline HRESULT IWinHttpRequest_SetTimeouts(IWinHttpRequest* This,LONG resolve_timeout,LONG connect_timeout,LONG send_timeout,LONG receive_timeout) {
+    return This->lpVtbl->SetTimeouts(This,resolve_timeout,connect_timeout,send_timeout,receive_timeout);
+}
+static inline HRESULT IWinHttpRequest_SetClientCertificate(IWinHttpRequest* This,BSTR certificate) {
+    return This->lpVtbl->SetClientCertificate(This,certificate);
+}
+static inline HRESULT IWinHttpRequest_SetAutoLogonPolicy(IWinHttpRequest* This,WinHttpRequestAutoLogonPolicy policy) {
+    return This->lpVtbl->SetAutoLogonPolicy(This,policy);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IWinHttpRequest_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * WinHttpRequest coclass
+ */
+
+DEFINE_GUID(CLSID_WinHttpRequest, 0x2087c2f4, 0x2cef, 0x4953, 0xa8,0xab, 0x66,0x77,0x9b,0x67,0x04,0x95);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("2087c2f4-2cef-4953-a8ab-66779b670495") WinHttpRequest;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(WinHttpRequest, 0x2087c2f4, 0x2cef, 0x4953, 0xa8,0xab, 0x66,0x77,0x9b,0x67,0x04,0x95)
+#endif
+#endif
+
+#endif /* __WinHttp_LIBRARY_DEFINED__ */
+/* Begin additional prototypes for all interfaces */
+
+ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
+unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
+unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
+void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);
+ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
+unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
+unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
+void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __httprequest_h__ */
