/*** Autogenerated by WIDL 8.13 from include/tsvirtualchannels.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 __tsvirtualchannels_h__
#define __tsvirtualchannels_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __IWTSPlugin_FWD_DEFINED__
#define __IWTSPlugin_FWD_DEFINED__
typedef interface IWTSPlugin IWTSPlugin;
#ifdef __cplusplus
interface IWTSPlugin;
#endif /* __cplusplus */
#endif

#ifndef __IWTSListener_FWD_DEFINED__
#define __IWTSListener_FWD_DEFINED__
typedef interface IWTSListener IWTSListener;
#ifdef __cplusplus
interface IWTSListener;
#endif /* __cplusplus */
#endif

#ifndef __IWTSListenerCallback_FWD_DEFINED__
#define __IWTSListenerCallback_FWD_DEFINED__
typedef interface IWTSListenerCallback IWTSListenerCallback;
#ifdef __cplusplus
interface IWTSListenerCallback;
#endif /* __cplusplus */
#endif

#ifndef __IWTSVirtualChannelCallback_FWD_DEFINED__
#define __IWTSVirtualChannelCallback_FWD_DEFINED__
typedef interface IWTSVirtualChannelCallback IWTSVirtualChannelCallback;
#ifdef __cplusplus
interface IWTSVirtualChannelCallback;
#endif /* __cplusplus */
#endif

#ifndef __IWTSVirtualChannelManager_FWD_DEFINED__
#define __IWTSVirtualChannelManager_FWD_DEFINED__
typedef interface IWTSVirtualChannelManager IWTSVirtualChannelManager;
#ifdef __cplusplus
interface IWTSVirtualChannelManager;
#endif /* __cplusplus */
#endif

#ifndef __IWTSVirtualChannel_FWD_DEFINED__
#define __IWTSVirtualChannel_FWD_DEFINED__
typedef interface IWTSVirtualChannel IWTSVirtualChannel;
#ifdef __cplusplus
interface IWTSVirtualChannel;
#endif /* __cplusplus */
#endif

#ifndef __IWTSPluginServiceProvider_FWD_DEFINED__
#define __IWTSPluginServiceProvider_FWD_DEFINED__
typedef interface IWTSPluginServiceProvider IWTSPluginServiceProvider;
#ifdef __cplusplus
interface IWTSPluginServiceProvider;
#endif /* __cplusplus */
#endif

#ifndef __IWTSBitmapRenderer_FWD_DEFINED__
#define __IWTSBitmapRenderer_FWD_DEFINED__
typedef interface IWTSBitmapRenderer IWTSBitmapRenderer;
#ifdef __cplusplus
interface IWTSBitmapRenderer;
#endif /* __cplusplus */
#endif

#ifndef __IWTSBitmapRendererCallback_FWD_DEFINED__
#define __IWTSBitmapRendererCallback_FWD_DEFINED__
typedef interface IWTSBitmapRendererCallback IWTSBitmapRendererCallback;
#ifdef __cplusplus
interface IWTSBitmapRendererCallback;
#endif /* __cplusplus */
#endif

#ifndef __IWTSBitmapRenderService_FWD_DEFINED__
#define __IWTSBitmapRenderService_FWD_DEFINED__
typedef interface IWTSBitmapRenderService IWTSBitmapRenderService;
#ifdef __cplusplus
interface IWTSBitmapRenderService;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <unknwn.h>
#include <oaidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <winapifamily.h>
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#ifndef __IWTSPlugin_FWD_DEFINED__
#define __IWTSPlugin_FWD_DEFINED__
typedef interface IWTSPlugin IWTSPlugin;
#ifdef __cplusplus
interface IWTSPlugin;
#endif /* __cplusplus */
#endif

#ifndef __IWTSListener_FWD_DEFINED__
#define __IWTSListener_FWD_DEFINED__
typedef interface IWTSListener IWTSListener;
#ifdef __cplusplus
interface IWTSListener;
#endif /* __cplusplus */
#endif

#ifndef __IWTSListenerCallback_FWD_DEFINED__
#define __IWTSListenerCallback_FWD_DEFINED__
typedef interface IWTSListenerCallback IWTSListenerCallback;
#ifdef __cplusplus
interface IWTSListenerCallback;
#endif /* __cplusplus */
#endif

#ifndef __IWTSVirtualChannelCallback_FWD_DEFINED__
#define __IWTSVirtualChannelCallback_FWD_DEFINED__
typedef interface IWTSVirtualChannelCallback IWTSVirtualChannelCallback;
#ifdef __cplusplus
interface IWTSVirtualChannelCallback;
#endif /* __cplusplus */
#endif

#ifndef __IWTSVirtualChannelManager_FWD_DEFINED__
#define __IWTSVirtualChannelManager_FWD_DEFINED__
typedef interface IWTSVirtualChannelManager IWTSVirtualChannelManager;
#ifdef __cplusplus
interface IWTSVirtualChannelManager;
#endif /* __cplusplus */
#endif

#ifndef __IWTSVirtualChannel_FWD_DEFINED__
#define __IWTSVirtualChannel_FWD_DEFINED__
typedef interface IWTSVirtualChannel IWTSVirtualChannel;
#ifdef __cplusplus
interface IWTSVirtualChannel;
#endif /* __cplusplus */
#endif

#define WTS_PROPERTY_DEFAULT_CONFIG L"DefaultConfig"
#define E_MAPPEDRENDERER_SHUTDOWN HRESULT_FROM_WIN32(ERROR_INVALID_STATE)
#define E_DUPLICATE_WINDOW_HINT HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS)
/*****************************************************************************
 * IWTSPlugin interface
 */
#ifndef __IWTSPlugin_INTERFACE_DEFINED__
#define __IWTSPlugin_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWTSPlugin, 0xa1230201, 0x1439, 0x4e62, 0xa4,0x14, 0x19,0x0d,0x0a,0xc3,0xd4,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a1230201-1439-4e62-a414-190d0ac3d40e")
IWTSPlugin : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Initialize(
        IWTSVirtualChannelManager *pChannelMgr) = 0;

    virtual HRESULT STDMETHODCALLTYPE Connected(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Disconnected(
        DWORD dwDisconnectCode) = 0;

    virtual HRESULT STDMETHODCALLTYPE Terminated(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWTSPlugin, 0xa1230201, 0x1439, 0x4e62, 0xa4,0x14, 0x19,0x0d,0x0a,0xc3,0xd4,0x0e)
#endif
#else
typedef struct IWTSPluginVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWTSPlugin *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWTSPlugin *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWTSPlugin *This);

    /*** IWTSPlugin methods ***/
    HRESULT (STDMETHODCALLTYPE *Initialize)(
        IWTSPlugin *This,
        IWTSVirtualChannelManager *pChannelMgr);

    HRESULT (STDMETHODCALLTYPE *Connected)(
        IWTSPlugin *This);

    HRESULT (STDMETHODCALLTYPE *Disconnected)(
        IWTSPlugin *This,
        DWORD dwDisconnectCode);

    HRESULT (STDMETHODCALLTYPE *Terminated)(
        IWTSPlugin *This);

    END_INTERFACE
} IWTSPluginVtbl;

interface IWTSPlugin {
    CONST_VTBL IWTSPluginVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWTSPlugin_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWTSPlugin_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWTSPlugin_Release(This) (This)->lpVtbl->Release(This)
/*** IWTSPlugin methods ***/
#define IWTSPlugin_Initialize(This,pChannelMgr) (This)->lpVtbl->Initialize(This,pChannelMgr)
#define IWTSPlugin_Connected(This) (This)->lpVtbl->Connected(This)
#define IWTSPlugin_Disconnected(This,dwDisconnectCode) (This)->lpVtbl->Disconnected(This,dwDisconnectCode)
#define IWTSPlugin_Terminated(This) (This)->lpVtbl->Terminated(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWTSPlugin_QueryInterface(IWTSPlugin* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWTSPlugin_AddRef(IWTSPlugin* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWTSPlugin_Release(IWTSPlugin* This) {
    return This->lpVtbl->Release(This);
}
/*** IWTSPlugin methods ***/
static __WIDL_INLINE HRESULT IWTSPlugin_Initialize(IWTSPlugin* This,IWTSVirtualChannelManager *pChannelMgr) {
    return This->lpVtbl->Initialize(This,pChannelMgr);
}
static __WIDL_INLINE HRESULT IWTSPlugin_Connected(IWTSPlugin* This) {
    return This->lpVtbl->Connected(This);
}
static __WIDL_INLINE HRESULT IWTSPlugin_Disconnected(IWTSPlugin* This,DWORD dwDisconnectCode) {
    return This->lpVtbl->Disconnected(This,dwDisconnectCode);
}
static __WIDL_INLINE HRESULT IWTSPlugin_Terminated(IWTSPlugin* This) {
    return This->lpVtbl->Terminated(This);
}
#endif
#endif

#endif


#endif  /* __IWTSPlugin_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWTSListener interface
 */
#ifndef __IWTSListener_INTERFACE_DEFINED__
#define __IWTSListener_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWTSListener, 0xa1230206, 0x9a39, 0x4d58, 0x86,0x74, 0xcd,0xb4,0xdf,0xf4,0xe7,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a1230206-9a39-4d58-8674-cdb4dff4e73b")
IWTSListener : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetConfiguration(
        IPropertyBag **ppPropertyBag) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWTSListener, 0xa1230206, 0x9a39, 0x4d58, 0x86,0x74, 0xcd,0xb4,0xdf,0xf4,0xe7,0x3b)
#endif
#else
typedef struct IWTSListenerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWTSListener *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWTSListener *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWTSListener *This);

    /*** IWTSListener methods ***/
    HRESULT (STDMETHODCALLTYPE *GetConfiguration)(
        IWTSListener *This,
        IPropertyBag **ppPropertyBag);

    END_INTERFACE
} IWTSListenerVtbl;

interface IWTSListener {
    CONST_VTBL IWTSListenerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWTSListener_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWTSListener_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWTSListener_Release(This) (This)->lpVtbl->Release(This)
/*** IWTSListener methods ***/
#define IWTSListener_GetConfiguration(This,ppPropertyBag) (This)->lpVtbl->GetConfiguration(This,ppPropertyBag)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWTSListener_QueryInterface(IWTSListener* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWTSListener_AddRef(IWTSListener* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWTSListener_Release(IWTSListener* This) {
    return This->lpVtbl->Release(This);
}
/*** IWTSListener methods ***/
static __WIDL_INLINE HRESULT IWTSListener_GetConfiguration(IWTSListener* This,IPropertyBag **ppPropertyBag) {
    return This->lpVtbl->GetConfiguration(This,ppPropertyBag);
}
#endif
#endif

#endif


#endif  /* __IWTSListener_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWTSListenerCallback interface
 */
#ifndef __IWTSListenerCallback_INTERFACE_DEFINED__
#define __IWTSListenerCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWTSListenerCallback, 0xa1230203, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a1230203-d6a7-11d8-b9fd-000bdbd1f198")
IWTSListenerCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnNewChannelConnection(
        IWTSVirtualChannel *pChannel,
        BSTR data,
        WINBOOL *pbAccept,
        IWTSVirtualChannelCallback **ppCallback) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWTSListenerCallback, 0xa1230203, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98)
#endif
#else
typedef struct IWTSListenerCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWTSListenerCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWTSListenerCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWTSListenerCallback *This);

    /*** IWTSListenerCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnNewChannelConnection)(
        IWTSListenerCallback *This,
        IWTSVirtualChannel *pChannel,
        BSTR data,
        WINBOOL *pbAccept,
        IWTSVirtualChannelCallback **ppCallback);

    END_INTERFACE
} IWTSListenerCallbackVtbl;

interface IWTSListenerCallback {
    CONST_VTBL IWTSListenerCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWTSListenerCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWTSListenerCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWTSListenerCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IWTSListenerCallback methods ***/
#define IWTSListenerCallback_OnNewChannelConnection(This,pChannel,data,pbAccept,ppCallback) (This)->lpVtbl->OnNewChannelConnection(This,pChannel,data,pbAccept,ppCallback)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWTSListenerCallback_QueryInterface(IWTSListenerCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWTSListenerCallback_AddRef(IWTSListenerCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWTSListenerCallback_Release(IWTSListenerCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IWTSListenerCallback methods ***/
static __WIDL_INLINE HRESULT IWTSListenerCallback_OnNewChannelConnection(IWTSListenerCallback* This,IWTSVirtualChannel *pChannel,BSTR data,WINBOOL *pbAccept,IWTSVirtualChannelCallback **ppCallback) {
    return This->lpVtbl->OnNewChannelConnection(This,pChannel,data,pbAccept,ppCallback);
}
#endif
#endif

#endif


#endif  /* __IWTSListenerCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWTSVirtualChannelCallback interface
 */
#ifndef __IWTSVirtualChannelCallback_INTERFACE_DEFINED__
#define __IWTSVirtualChannelCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWTSVirtualChannelCallback, 0xa1230204, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a1230204-d6a7-11d8-b9fd-000bdbd1f198")
IWTSVirtualChannelCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnDataReceived(
        ULONG cbSize,
        BYTE *pBuffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnClose(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWTSVirtualChannelCallback, 0xa1230204, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98)
#endif
#else
typedef struct IWTSVirtualChannelCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWTSVirtualChannelCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWTSVirtualChannelCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWTSVirtualChannelCallback *This);

    /*** IWTSVirtualChannelCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnDataReceived)(
        IWTSVirtualChannelCallback *This,
        ULONG cbSize,
        BYTE *pBuffer);

    HRESULT (STDMETHODCALLTYPE *OnClose)(
        IWTSVirtualChannelCallback *This);

    END_INTERFACE
} IWTSVirtualChannelCallbackVtbl;

interface IWTSVirtualChannelCallback {
    CONST_VTBL IWTSVirtualChannelCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWTSVirtualChannelCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWTSVirtualChannelCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWTSVirtualChannelCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IWTSVirtualChannelCallback methods ***/
#define IWTSVirtualChannelCallback_OnDataReceived(This,cbSize,pBuffer) (This)->lpVtbl->OnDataReceived(This,cbSize,pBuffer)
#define IWTSVirtualChannelCallback_OnClose(This) (This)->lpVtbl->OnClose(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWTSVirtualChannelCallback_QueryInterface(IWTSVirtualChannelCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWTSVirtualChannelCallback_AddRef(IWTSVirtualChannelCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWTSVirtualChannelCallback_Release(IWTSVirtualChannelCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IWTSVirtualChannelCallback methods ***/
static __WIDL_INLINE HRESULT IWTSVirtualChannelCallback_OnDataReceived(IWTSVirtualChannelCallback* This,ULONG cbSize,BYTE *pBuffer) {
    return This->lpVtbl->OnDataReceived(This,cbSize,pBuffer);
}
static __WIDL_INLINE HRESULT IWTSVirtualChannelCallback_OnClose(IWTSVirtualChannelCallback* This) {
    return This->lpVtbl->OnClose(This);
}
#endif
#endif

#endif


#endif  /* __IWTSVirtualChannelCallback_INTERFACE_DEFINED__ */

#define TS_VC_LISTENER_STATIC_CHANNEL 0x00000001
/*****************************************************************************
 * IWTSVirtualChannelManager interface
 */
#ifndef __IWTSVirtualChannelManager_INTERFACE_DEFINED__
#define __IWTSVirtualChannelManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWTSVirtualChannelManager, 0xa1230205, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a1230205-d6a7-11d8-b9fd-000bdbd1f198")
IWTSVirtualChannelManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE CreateListener(
        const char *pszChannelName,
        ULONG uFlags,
        IWTSListenerCallback *pListenerCallback,
        IWTSListener **ppListener) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWTSVirtualChannelManager, 0xa1230205, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98)
#endif
#else
typedef struct IWTSVirtualChannelManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWTSVirtualChannelManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWTSVirtualChannelManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWTSVirtualChannelManager *This);

    /*** IWTSVirtualChannelManager methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateListener)(
        IWTSVirtualChannelManager *This,
        const char *pszChannelName,
        ULONG uFlags,
        IWTSListenerCallback *pListenerCallback,
        IWTSListener **ppListener);

    END_INTERFACE
} IWTSVirtualChannelManagerVtbl;

interface IWTSVirtualChannelManager {
    CONST_VTBL IWTSVirtualChannelManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWTSVirtualChannelManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWTSVirtualChannelManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWTSVirtualChannelManager_Release(This) (This)->lpVtbl->Release(This)
/*** IWTSVirtualChannelManager methods ***/
#define IWTSVirtualChannelManager_CreateListener(This,pszChannelName,uFlags,pListenerCallback,ppListener) (This)->lpVtbl->CreateListener(This,pszChannelName,uFlags,pListenerCallback,ppListener)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWTSVirtualChannelManager_QueryInterface(IWTSVirtualChannelManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWTSVirtualChannelManager_AddRef(IWTSVirtualChannelManager* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWTSVirtualChannelManager_Release(IWTSVirtualChannelManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IWTSVirtualChannelManager methods ***/
static __WIDL_INLINE HRESULT IWTSVirtualChannelManager_CreateListener(IWTSVirtualChannelManager* This,const char *pszChannelName,ULONG uFlags,IWTSListenerCallback *pListenerCallback,IWTSListener **ppListener) {
    return This->lpVtbl->CreateListener(This,pszChannelName,uFlags,pListenerCallback,ppListener);
}
#endif
#endif

#endif


#endif  /* __IWTSVirtualChannelManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWTSVirtualChannel interface
 */
#ifndef __IWTSVirtualChannel_INTERFACE_DEFINED__
#define __IWTSVirtualChannel_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWTSVirtualChannel, 0xa1230207, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a1230207-d6a7-11d8-b9fd-000bdbd1f198")
IWTSVirtualChannel : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Write(
        ULONG cbSize,
        BYTE *pBuffer,
        IUnknown *pReserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE Close(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWTSVirtualChannel, 0xa1230207, 0xd6a7, 0x11d8, 0xb9,0xfd, 0x00,0x0b,0xdb,0xd1,0xf1,0x98)
#endif
#else
typedef struct IWTSVirtualChannelVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWTSVirtualChannel *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWTSVirtualChannel *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWTSVirtualChannel *This);

    /*** IWTSVirtualChannel methods ***/
    HRESULT (STDMETHODCALLTYPE *Write)(
        IWTSVirtualChannel *This,
        ULONG cbSize,
        BYTE *pBuffer,
        IUnknown *pReserved);

    HRESULT (STDMETHODCALLTYPE *Close)(
        IWTSVirtualChannel *This);

    END_INTERFACE
} IWTSVirtualChannelVtbl;

interface IWTSVirtualChannel {
    CONST_VTBL IWTSVirtualChannelVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWTSVirtualChannel_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWTSVirtualChannel_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWTSVirtualChannel_Release(This) (This)->lpVtbl->Release(This)
/*** IWTSVirtualChannel methods ***/
#define IWTSVirtualChannel_Write(This,cbSize,pBuffer,pReserved) (This)->lpVtbl->Write(This,cbSize,pBuffer,pReserved)
#define IWTSVirtualChannel_Close(This) (This)->lpVtbl->Close(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWTSVirtualChannel_QueryInterface(IWTSVirtualChannel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWTSVirtualChannel_AddRef(IWTSVirtualChannel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWTSVirtualChannel_Release(IWTSVirtualChannel* This) {
    return This->lpVtbl->Release(This);
}
/*** IWTSVirtualChannel methods ***/
static __WIDL_INLINE HRESULT IWTSVirtualChannel_Write(IWTSVirtualChannel* This,ULONG cbSize,BYTE *pBuffer,IUnknown *pReserved) {
    return This->lpVtbl->Write(This,cbSize,pBuffer,pReserved);
}
static __WIDL_INLINE HRESULT IWTSVirtualChannel_Close(IWTSVirtualChannel* This) {
    return This->lpVtbl->Close(This);
}
#endif
#endif

#endif


#endif  /* __IWTSVirtualChannel_INTERFACE_DEFINED__ */

EXTERN_GUID( RDCLIENT_BITMAP_RENDER_SERVICE, 0xe4cc08cb, 0x942e, 0x4b19, 0x85, 0x4, 0xbd, 0x5a, 0x89, 0xa7, 0x47, 0xf5);
/*****************************************************************************
 * IWTSPluginServiceProvider interface
 */
#ifndef __IWTSPluginServiceProvider_INTERFACE_DEFINED__
#define __IWTSPluginServiceProvider_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWTSPluginServiceProvider, 0xd3e07363, 0x087c, 0x476c, 0x86,0xa7, 0xdb,0xb1,0x5f,0x46,0xdd,0xb4);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d3e07363-087c-476c-86a7-dbb15f46ddb4")
IWTSPluginServiceProvider : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetService(
        GUID ServiceId,
        IUnknown **ppunkObject) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWTSPluginServiceProvider, 0xd3e07363, 0x087c, 0x476c, 0x86,0xa7, 0xdb,0xb1,0x5f,0x46,0xdd,0xb4)
#endif
#else
typedef struct IWTSPluginServiceProviderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWTSPluginServiceProvider *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWTSPluginServiceProvider *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWTSPluginServiceProvider *This);

    /*** IWTSPluginServiceProvider methods ***/
    HRESULT (STDMETHODCALLTYPE *GetService)(
        IWTSPluginServiceProvider *This,
        GUID ServiceId,
        IUnknown **ppunkObject);

    END_INTERFACE
} IWTSPluginServiceProviderVtbl;

interface IWTSPluginServiceProvider {
    CONST_VTBL IWTSPluginServiceProviderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWTSPluginServiceProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWTSPluginServiceProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWTSPluginServiceProvider_Release(This) (This)->lpVtbl->Release(This)
/*** IWTSPluginServiceProvider methods ***/
#define IWTSPluginServiceProvider_GetService(This,ServiceId,ppunkObject) (This)->lpVtbl->GetService(This,ServiceId,ppunkObject)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWTSPluginServiceProvider_QueryInterface(IWTSPluginServiceProvider* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWTSPluginServiceProvider_AddRef(IWTSPluginServiceProvider* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWTSPluginServiceProvider_Release(IWTSPluginServiceProvider* This) {
    return This->lpVtbl->Release(This);
}
/*** IWTSPluginServiceProvider methods ***/
static __WIDL_INLINE HRESULT IWTSPluginServiceProvider_GetService(IWTSPluginServiceProvider* This,GUID ServiceId,IUnknown **ppunkObject) {
    return This->lpVtbl->GetService(This,ServiceId,ppunkObject);
}
#endif
#endif

#endif


#endif  /* __IWTSPluginServiceProvider_INTERFACE_DEFINED__ */

typedef struct __BITMAP_RENDERER_STATISTICS {
    DWORD dwFramesDelivered;
    DWORD dwFramesDropped;
} BITMAP_RENDERER_STATISTICS;
typedef struct __BITMAP_RENDERER_STATISTICS *PBITMAP_RENDERER_STATISTICS;
/*****************************************************************************
 * IWTSBitmapRenderer interface
 */
#ifndef __IWTSBitmapRenderer_INTERFACE_DEFINED__
#define __IWTSBitmapRenderer_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWTSBitmapRenderer, 0x5b7acc97, 0xf3c9, 0x46f7, 0x8c,0x5b, 0xfa,0x68,0x5d,0x34,0x41,0xb1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5b7acc97-f3c9-46f7-8c5b-fa685d3441b1")
IWTSBitmapRenderer : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Render(
        GUID imageFormat,
        DWORD dwWidth,
        DWORD dwHeight,
        LONG cbStride,
        DWORD cbImageBuffer,
        BYTE *pImageBuffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRendererStatistics(
        BITMAP_RENDERER_STATISTICS *pStatistics) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveMapping(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWTSBitmapRenderer, 0x5b7acc97, 0xf3c9, 0x46f7, 0x8c,0x5b, 0xfa,0x68,0x5d,0x34,0x41,0xb1)
#endif
#else
typedef struct IWTSBitmapRendererVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWTSBitmapRenderer *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWTSBitmapRenderer *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWTSBitmapRenderer *This);

    /*** IWTSBitmapRenderer methods ***/
    HRESULT (STDMETHODCALLTYPE *Render)(
        IWTSBitmapRenderer *This,
        GUID imageFormat,
        DWORD dwWidth,
        DWORD dwHeight,
        LONG cbStride,
        DWORD cbImageBuffer,
        BYTE *pImageBuffer);

    HRESULT (STDMETHODCALLTYPE *GetRendererStatistics)(
        IWTSBitmapRenderer *This,
        BITMAP_RENDERER_STATISTICS *pStatistics);

    HRESULT (STDMETHODCALLTYPE *RemoveMapping)(
        IWTSBitmapRenderer *This);

    END_INTERFACE
} IWTSBitmapRendererVtbl;

interface IWTSBitmapRenderer {
    CONST_VTBL IWTSBitmapRendererVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWTSBitmapRenderer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWTSBitmapRenderer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWTSBitmapRenderer_Release(This) (This)->lpVtbl->Release(This)
/*** IWTSBitmapRenderer methods ***/
#define IWTSBitmapRenderer_Render(This,imageFormat,dwWidth,dwHeight,cbStride,cbImageBuffer,pImageBuffer) (This)->lpVtbl->Render(This,imageFormat,dwWidth,dwHeight,cbStride,cbImageBuffer,pImageBuffer)
#define IWTSBitmapRenderer_GetRendererStatistics(This,pStatistics) (This)->lpVtbl->GetRendererStatistics(This,pStatistics)
#define IWTSBitmapRenderer_RemoveMapping(This) (This)->lpVtbl->RemoveMapping(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWTSBitmapRenderer_QueryInterface(IWTSBitmapRenderer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWTSBitmapRenderer_AddRef(IWTSBitmapRenderer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWTSBitmapRenderer_Release(IWTSBitmapRenderer* This) {
    return This->lpVtbl->Release(This);
}
/*** IWTSBitmapRenderer methods ***/
static __WIDL_INLINE HRESULT IWTSBitmapRenderer_Render(IWTSBitmapRenderer* This,GUID imageFormat,DWORD dwWidth,DWORD dwHeight,LONG cbStride,DWORD cbImageBuffer,BYTE *pImageBuffer) {
    return This->lpVtbl->Render(This,imageFormat,dwWidth,dwHeight,cbStride,cbImageBuffer,pImageBuffer);
}
static __WIDL_INLINE HRESULT IWTSBitmapRenderer_GetRendererStatistics(IWTSBitmapRenderer* This,BITMAP_RENDERER_STATISTICS *pStatistics) {
    return This->lpVtbl->GetRendererStatistics(This,pStatistics);
}
static __WIDL_INLINE HRESULT IWTSBitmapRenderer_RemoveMapping(IWTSBitmapRenderer* This) {
    return This->lpVtbl->RemoveMapping(This);
}
#endif
#endif

#endif


#endif  /* __IWTSBitmapRenderer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWTSBitmapRendererCallback interface
 */
#ifndef __IWTSBitmapRendererCallback_INTERFACE_DEFINED__
#define __IWTSBitmapRendererCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWTSBitmapRendererCallback, 0xd782928e, 0xfe4e, 0x4e77, 0xae,0x90, 0x9c,0xd0,0xb3,0xe3,0xb3,0x53);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d782928e-fe4e-4e77-ae90-9cd0b3e3b353")
IWTSBitmapRendererCallback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnTargetSizeChanged(
        RECT rcNewSize) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWTSBitmapRendererCallback, 0xd782928e, 0xfe4e, 0x4e77, 0xae,0x90, 0x9c,0xd0,0xb3,0xe3,0xb3,0x53)
#endif
#else
typedef struct IWTSBitmapRendererCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWTSBitmapRendererCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWTSBitmapRendererCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWTSBitmapRendererCallback *This);

    /*** IWTSBitmapRendererCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnTargetSizeChanged)(
        IWTSBitmapRendererCallback *This,
        RECT rcNewSize);

    END_INTERFACE
} IWTSBitmapRendererCallbackVtbl;

interface IWTSBitmapRendererCallback {
    CONST_VTBL IWTSBitmapRendererCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWTSBitmapRendererCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWTSBitmapRendererCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWTSBitmapRendererCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IWTSBitmapRendererCallback methods ***/
#define IWTSBitmapRendererCallback_OnTargetSizeChanged(This,rcNewSize) (This)->lpVtbl->OnTargetSizeChanged(This,rcNewSize)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWTSBitmapRendererCallback_QueryInterface(IWTSBitmapRendererCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWTSBitmapRendererCallback_AddRef(IWTSBitmapRendererCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWTSBitmapRendererCallback_Release(IWTSBitmapRendererCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IWTSBitmapRendererCallback methods ***/
static __WIDL_INLINE HRESULT IWTSBitmapRendererCallback_OnTargetSizeChanged(IWTSBitmapRendererCallback* This,RECT rcNewSize) {
    return This->lpVtbl->OnTargetSizeChanged(This,rcNewSize);
}
#endif
#endif

#endif


#endif  /* __IWTSBitmapRendererCallback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWTSBitmapRenderService interface
 */
#ifndef __IWTSBitmapRenderService_INTERFACE_DEFINED__
#define __IWTSBitmapRenderService_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWTSBitmapRenderService, 0xea326091, 0x05fe, 0x40c1, 0xb4,0x9c, 0x3d,0x2e,0xf4,0x62,0x6a,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ea326091-05fe-40c1-b49c-3d2ef4626a0e")
IWTSBitmapRenderService : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE GetMappedRenderer(
        UINT64 mappingId,
        IWTSBitmapRendererCallback *pMappedRendererCallback,
        IWTSBitmapRenderer **ppMappedRenderer) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWTSBitmapRenderService, 0xea326091, 0x05fe, 0x40c1, 0xb4,0x9c, 0x3d,0x2e,0xf4,0x62,0x6a,0x0e)
#endif
#else
typedef struct IWTSBitmapRenderServiceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IWTSBitmapRenderService *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IWTSBitmapRenderService *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IWTSBitmapRenderService *This);

    /*** IWTSBitmapRenderService methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMappedRenderer)(
        IWTSBitmapRenderService *This,
        UINT64 mappingId,
        IWTSBitmapRendererCallback *pMappedRendererCallback,
        IWTSBitmapRenderer **ppMappedRenderer);

    END_INTERFACE
} IWTSBitmapRenderServiceVtbl;

interface IWTSBitmapRenderService {
    CONST_VTBL IWTSBitmapRenderServiceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWTSBitmapRenderService_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWTSBitmapRenderService_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWTSBitmapRenderService_Release(This) (This)->lpVtbl->Release(This)
/*** IWTSBitmapRenderService methods ***/
#define IWTSBitmapRenderService_GetMappedRenderer(This,mappingId,pMappedRendererCallback,ppMappedRenderer) (This)->lpVtbl->GetMappedRenderer(This,mappingId,pMappedRendererCallback,ppMappedRenderer)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IWTSBitmapRenderService_QueryInterface(IWTSBitmapRenderService* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWTSBitmapRenderService_AddRef(IWTSBitmapRenderService* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWTSBitmapRenderService_Release(IWTSBitmapRenderService* This) {
    return This->lpVtbl->Release(This);
}
/*** IWTSBitmapRenderService methods ***/
static __WIDL_INLINE HRESULT IWTSBitmapRenderService_GetMappedRenderer(IWTSBitmapRenderService* This,UINT64 mappingId,IWTSBitmapRendererCallback *pMappedRendererCallback,IWTSBitmapRenderer **ppMappedRenderer) {
    return This->lpVtbl->GetMappedRenderer(This,mappingId,pMappedRendererCallback,ppMappedRenderer);
}
#endif
#endif

#endif


#endif  /* __IWTSBitmapRenderService_INTERFACE_DEFINED__ */

#endif /* WINAPI_PARTITION_DESKTOP */
/* Begin additional prototypes for all interfaces */

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 /* __tsvirtualchannels_h__ */
