/*** Autogenerated by WIDL 10.0-rc1 from include/windows.security.authorization.appcapabilityaccess.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 __windows_security_authorization_appcapabilityaccess_h__
#define __windows_security_authorization_appcapabilityaccess_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapability
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    interface IAppCapability;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapability2
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    interface IAppCapability2;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapabilityAccessChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    interface IAppCapabilityAccessChangedEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapabilityStatics
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    interface IAppCapabilityStatics;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapability_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapability_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    class AppCapability;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapability __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapability;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapability_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    class AppCapabilityAccessChangedEventArgs;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessChangedEventArgs __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessChangedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessChangedEventArgs_FWD_DEFINED__ */

#ifndef ____FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
#define ____FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
typedef interface __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus;
#ifdef __cplusplus
#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
typedef interface __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus;
#ifdef __cplusplus
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
#define ____FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
typedef interface __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus;
#ifdef __cplusplus
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
#define ____FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
typedef interface __FIMapView_2_HSTRING_AppCapabilityAccessStatus __FIMapView_2_HSTRING_AppCapabilityAccessStatus;
#ifdef __cplusplus
#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_AppCapabilityAccessStatus_FWD_DEFINED__
#define ____FIAsyncOperation_1_AppCapabilityAccessStatus_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_AppCapabilityAccessStatus __FIAsyncOperation_1_AppCapabilityAccessStatus;
#ifdef __cplusplus
#define __FIAsyncOperation_1_AppCapabilityAccessStatus ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.system.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapability
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    interface IAppCapability;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapability2
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    interface IAppCapability2;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapabilityAccessChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    interface IAppCapabilityAccessChangedEventArgs;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapabilityStatics
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    interface IAppCapabilityStatics;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
#define ____FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
typedef interface __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus;
#ifdef __cplusplus
#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
typedef interface __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus;
#ifdef __cplusplus
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
#define ____FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
typedef interface __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus;
#ifdef __cplusplus
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
#define ____FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
typedef interface __FIMapView_2_HSTRING_AppCapabilityAccessStatus __FIMapView_2_HSTRING_AppCapabilityAccessStatus;
#ifdef __cplusplus
#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_AppCapabilityAccessStatus_FWD_DEFINED__
#define ____FIAsyncOperation_1_AppCapabilityAccessStatus_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_AppCapabilityAccessStatus __FIAsyncOperation_1_AppCapabilityAccessStatus;
#ifdef __cplusplus
#define __FIAsyncOperation_1_AppCapabilityAccessStatus ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    enum AppCapabilityAccessStatus {
                        AppCapabilityAccessStatus_DeniedBySystem = 0,
                        AppCapabilityAccessStatus_NotDeclaredByApp = 1,
                        AppCapabilityAccessStatus_DeniedByUser = 2,
                        AppCapabilityAccessStatus_UserPromptRequired = 3,
                        AppCapabilityAccessStatus_Allowed = 4
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus {
    AppCapabilityAccessStatus_DeniedBySystem = 0,
    AppCapabilityAccessStatus_NotDeclaredByApp = 1,
    AppCapabilityAccessStatus_DeniedByUser = 2,
    AppCapabilityAccessStatus_UserPromptRequired = 3,
    AppCapabilityAccessStatus_Allowed = 4
};
#ifdef WIDL_using_Windows_Security_Authorization_AppCapabilityAccess
#define AppCapabilityAccessStatus __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus
#endif /* WIDL_using_Windows_Security_Authorization_AppCapabilityAccess */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */
/*****************************************************************************
 * IAppCapability interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability, 0x4c49d915, 0x8a2a, 0x4295, 0x94,0x37, 0x2d,0xf7,0xc3,0x96,0xaf,0xf4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    MIDL_INTERFACE("4c49d915-8a2a-4295-9437-2df7c396aff4")
                    IAppCapability : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_CapabilityName(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_User(
                            ABI::Windows::System::IUser **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RequestAccessAsync(
                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > **operation) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CheckAccess(
                            ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus *result) = 0;

                        virtual HRESULT STDMETHODCALLTYPE add_AccessChanged(
                            ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs* > *handler,
                            EventRegistrationToken *token) = 0;

                        virtual HRESULT STDMETHODCALLTYPE remove_AccessChanged(
                            EventRegistrationToken token) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability, 0x4c49d915, 0x8a2a, 0x4295, 0x94,0x37, 0x2d,0xf7,0xc3,0x96,0xaf,0xf4)
#endif
#else
typedef struct __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
        TrustLevel *trustLevel);

    /*** IAppCapability methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CapabilityName)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_User)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
        __x_ABI_CWindows_CSystem_CIUser **value);

    HRESULT (STDMETHODCALLTYPE *RequestAccessAsync)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
        __FIAsyncOperation_1_AppCapabilityAccessStatus **operation);

    HRESULT (STDMETHODCALLTYPE *CheckAccess)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *result);

    HRESULT (STDMETHODCALLTYPE *add_AccessChanged)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
        __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_AccessChanged)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityVtbl;

interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability {
    CONST_VTBL __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAppCapability methods ***/
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_get_CapabilityName(This,value) (This)->lpVtbl->get_CapabilityName(This,value)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_get_User(This,value) (This)->lpVtbl->get_User(This,value)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_RequestAccessAsync(This,operation) (This)->lpVtbl->RequestAccessAsync(This,operation)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_CheckAccess(This,result) (This)->lpVtbl->CheckAccess(This,result)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_add_AccessChanged(This,handler,token) (This)->lpVtbl->add_AccessChanged(This,handler,token)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_remove_AccessChanged(This,token) (This)->lpVtbl->remove_AccessChanged(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_QueryInterface(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_AddRef(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_Release(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetIids(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetRuntimeClassName(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetTrustLevel(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAppCapability methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_get_CapabilityName(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,HSTRING *value) {
    return This->lpVtbl->get_CapabilityName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_get_User(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,__x_ABI_CWindows_CSystem_CIUser **value) {
    return This->lpVtbl->get_User(This,value);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_RequestAccessAsync(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,__FIAsyncOperation_1_AppCapabilityAccessStatus **operation) {
    return This->lpVtbl->RequestAccessAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_CheckAccess(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *result) {
    return This->lpVtbl->CheckAccess(This,result);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_add_AccessChanged(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,__FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_AccessChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_remove_AccessChanged(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_AccessChanged(This,token);
}
#endif
#ifdef WIDL_using_Windows_Security_Authorization_AppCapabilityAccess
#define IID_IAppCapability IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability
#define IAppCapabilityVtbl __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityVtbl
#define IAppCapability __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability
#define IAppCapability_QueryInterface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_QueryInterface
#define IAppCapability_AddRef __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_AddRef
#define IAppCapability_Release __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_Release
#define IAppCapability_GetIids __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetIids
#define IAppCapability_GetRuntimeClassName __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetRuntimeClassName
#define IAppCapability_GetTrustLevel __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_GetTrustLevel
#define IAppCapability_get_CapabilityName __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_get_CapabilityName
#define IAppCapability_get_User __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_get_User
#define IAppCapability_RequestAccessAsync __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_RequestAccessAsync
#define IAppCapability_CheckAccess __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_CheckAccess
#define IAppCapability_add_AccessChanged __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_add_AccessChanged
#define IAppCapability_remove_AccessChanged __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_remove_AccessChanged
#endif /* WIDL_using_Windows_Security_Authorization_AppCapabilityAccess */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IAppCapability2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xf0000
#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2, 0x11c7ccb6, 0xc74f, 0x50a3, 0xb9,0x60, 0x88,0x00,0x87,0x67,0xd9,0x39);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    MIDL_INTERFACE("11c7ccb6-c74f-50a3-b960-88008767d939")
                    IAppCapability2 : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_DisplayMessage(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_DisplayMessage(
                            HSTRING value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2, 0x11c7ccb6, 0xc74f, 0x50a3, 0xb9,0x60, 0x88,0x00,0x87,0x67,0xd9,0x39)
#endif
#else
typedef struct __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 *This,
        TrustLevel *trustLevel);

    /*** IAppCapability2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DisplayMessage)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_DisplayMessage)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2Vtbl;

interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2 {
    CONST_VTBL __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAppCapability2 methods ***/
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_get_DisplayMessage(This,value) (This)->lpVtbl->get_DisplayMessage(This,value)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_put_DisplayMessage(This,value) (This)->lpVtbl->put_DisplayMessage(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_QueryInterface(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_AddRef(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_Release(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetIids(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetRuntimeClassName(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetTrustLevel(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAppCapability2 methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_get_DisplayMessage(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This,HSTRING *value) {
    return This->lpVtbl->get_DisplayMessage(This,value);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_put_DisplayMessage(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2* This,HSTRING value) {
    return This->lpVtbl->put_DisplayMessage(This,value);
}
#endif
#ifdef WIDL_using_Windows_Security_Authorization_AppCapabilityAccess
#define IID_IAppCapability2 IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2
#define IAppCapability2Vtbl __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2Vtbl
#define IAppCapability2 __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2
#define IAppCapability2_QueryInterface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_QueryInterface
#define IAppCapability2_AddRef __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_AddRef
#define IAppCapability2_Release __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_Release
#define IAppCapability2_GetIids __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetIids
#define IAppCapability2_GetRuntimeClassName __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetRuntimeClassName
#define IAppCapability2_GetTrustLevel __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_GetTrustLevel
#define IAppCapability2_get_DisplayMessage __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_get_DisplayMessage
#define IAppCapability2_put_DisplayMessage __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_put_DisplayMessage
#endif /* WIDL_using_Windows_Security_Authorization_AppCapabilityAccess */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xf0000 */

/*****************************************************************************
 * IAppCapabilityAccessChangedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs, 0x0a578d15, 0xbdd7, 0x457e, 0x8c,0xca, 0x6f,0x53,0xbd,0x2e,0x59,0x44);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    MIDL_INTERFACE("0a578d15-bdd7-457e-8cca-6f53bd2e5944")
                    IAppCapabilityAccessChangedEventArgs : public IInspectable
                    {
                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs, 0x0a578d15, 0xbdd7, 0x457e, 0x8c,0xca, 0x6f,0x53,0xbd,0x2e,0x59,0x44)
#endif
#else
typedef struct __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgsVtbl;

interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_QueryInterface(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_AddRef(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_Release(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetIids(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetTrustLevel(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Security_Authorization_AppCapabilityAccess
#define IID_IAppCapabilityAccessChangedEventArgs IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs
#define IAppCapabilityAccessChangedEventArgsVtbl __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgsVtbl
#define IAppCapabilityAccessChangedEventArgs __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs
#define IAppCapabilityAccessChangedEventArgs_QueryInterface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_QueryInterface
#define IAppCapabilityAccessChangedEventArgs_AddRef __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_AddRef
#define IAppCapabilityAccessChangedEventArgs_Release __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_Release
#define IAppCapabilityAccessChangedEventArgs_GetIids __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetIids
#define IAppCapabilityAccessChangedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetRuntimeClassName
#define IAppCapabilityAccessChangedEventArgs_GetTrustLevel __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_GetTrustLevel
#endif /* WIDL_using_Windows_Security_Authorization_AppCapabilityAccess */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IAppCapabilityStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics, 0x7c353e2a, 0x46ee, 0x44e5, 0xaf,0x3d, 0x6a,0xd3,0xfc,0x49,0xbd,0x22);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Authorization {
                namespace AppCapabilityAccess {
                    MIDL_INTERFACE("7c353e2a-46ee-44e5-af3d-6ad3fc49bd22")
                    IAppCapabilityStatics : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE RequestAccessForCapabilitiesAsync(
                            ABI::Windows::Foundation::Collections::IIterable<HSTRING > *capability_names,
                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > **operation) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RequestAccessForCapabilitiesForUserAsync(
                            ABI::Windows::System::IUser *user,
                            ABI::Windows::Foundation::Collections::IIterable<HSTRING > *capability_names,
                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > **operation) = 0;

                        virtual HRESULT STDMETHODCALLTYPE Create(
                            HSTRING capability_name,
                            ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapability **result) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateWithProcessIdForUser(
                            ABI::Windows::System::IUser *user,
                            HSTRING capability_name,
                            UINT32 pid,
                            ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapability **result) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics, 0x7c353e2a, 0x46ee, 0x44e5, 0xaf,0x3d, 0x6a,0xd3,0xfc,0x49,0xbd,0x22)
#endif
#else
typedef struct __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
        TrustLevel *trustLevel);

    /*** IAppCapabilityStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *RequestAccessForCapabilitiesAsync)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
        __FIIterable_1_HSTRING *capability_names,
        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus **operation);

    HRESULT (STDMETHODCALLTYPE *RequestAccessForCapabilitiesForUserAsync)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
        __x_ABI_CWindows_CSystem_CIUser *user,
        __FIIterable_1_HSTRING *capability_names,
        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus **operation);

    HRESULT (STDMETHODCALLTYPE *Create)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
        HSTRING capability_name,
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability **result);

    HRESULT (STDMETHODCALLTYPE *CreateWithProcessIdForUser)(
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics *This,
        __x_ABI_CWindows_CSystem_CIUser *user,
        HSTRING capability_name,
        UINT32 pid,
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability **result);

    END_INTERFACE
} __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStaticsVtbl;

interface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics {
    CONST_VTBL __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAppCapabilityStatics methods ***/
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_RequestAccessForCapabilitiesAsync(This,capability_names,operation) (This)->lpVtbl->RequestAccessForCapabilitiesAsync(This,capability_names,operation)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_RequestAccessForCapabilitiesForUserAsync(This,user,capability_names,operation) (This)->lpVtbl->RequestAccessForCapabilitiesForUserAsync(This,user,capability_names,operation)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_Create(This,capability_name,result) (This)->lpVtbl->Create(This,capability_name,result)
#define __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_CreateWithProcessIdForUser(This,user,capability_name,pid,result) (This)->lpVtbl->CreateWithProcessIdForUser(This,user,capability_name,pid,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_QueryInterface(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_AddRef(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_Release(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetIids(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetRuntimeClassName(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetTrustLevel(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAppCapabilityStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_RequestAccessForCapabilitiesAsync(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,__FIIterable_1_HSTRING *capability_names,__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus **operation) {
    return This->lpVtbl->RequestAccessForCapabilitiesAsync(This,capability_names,operation);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_RequestAccessForCapabilitiesForUserAsync(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,__x_ABI_CWindows_CSystem_CIUser *user,__FIIterable_1_HSTRING *capability_names,__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus **operation) {
    return This->lpVtbl->RequestAccessForCapabilitiesForUserAsync(This,user,capability_names,operation);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_Create(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,HSTRING capability_name,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability **result) {
    return This->lpVtbl->Create(This,capability_name,result);
}
static inline HRESULT __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_CreateWithProcessIdForUser(__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics* This,__x_ABI_CWindows_CSystem_CIUser *user,HSTRING capability_name,UINT32 pid,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability **result) {
    return This->lpVtbl->CreateWithProcessIdForUser(This,user,capability_name,pid,result);
}
#endif
#ifdef WIDL_using_Windows_Security_Authorization_AppCapabilityAccess
#define IID_IAppCapabilityStatics IID___x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics
#define IAppCapabilityStaticsVtbl __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStaticsVtbl
#define IAppCapabilityStatics __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics
#define IAppCapabilityStatics_QueryInterface __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_QueryInterface
#define IAppCapabilityStatics_AddRef __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_AddRef
#define IAppCapabilityStatics_Release __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_Release
#define IAppCapabilityStatics_GetIids __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetIids
#define IAppCapabilityStatics_GetRuntimeClassName __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetRuntimeClassName
#define IAppCapabilityStatics_GetTrustLevel __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_GetTrustLevel
#define IAppCapabilityStatics_RequestAccessForCapabilitiesAsync __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_RequestAccessForCapabilitiesAsync
#define IAppCapabilityStatics_RequestAccessForCapabilitiesForUserAsync __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_RequestAccessForCapabilitiesForUserAsync
#define IAppCapabilityStatics_Create __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_Create
#define IAppCapabilityStatics_CreateWithProcessIdForUser __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_CreateWithProcessIdForUser
#endif /* WIDL_using_Windows_Security_Authorization_AppCapabilityAccess */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*
 * Class Windows.Security.Authorization.AppCapabilityAccess.AppCapability
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef RUNTIMECLASS_Windows_Security_Authorization_AppCapabilityAccess_AppCapability_DEFINED
#define RUNTIMECLASS_Windows_Security_Authorization_AppCapabilityAccess_AppCapability_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Security_Authorization_AppCapabilityAccess_AppCapability[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','A','u','t','h','o','r','i','z','a','t','i','o','n','.','A','p','p','C','a','p','a','b','i','l','i','t','y','A','c','c','e','s','s','.','A','p','p','C','a','p','a','b','i','l','i','t','y',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Authorization_AppCapabilityAccess_AppCapability[] = L"Windows.Security.Authorization.AppCapabilityAccess.AppCapability";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Authorization_AppCapabilityAccess_AppCapability[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','A','u','t','h','o','r','i','z','a','t','i','o','n','.','A','p','p','C','a','p','a','b','i','l','i','t','y','A','c','c','e','s','s','.','A','p','p','C','a','p','a','b','i','l','i','t','y',0};
#endif
#endif /* RUNTIMECLASS_Windows_Security_Authorization_AppCapabilityAccess_AppCapability_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*
 * Class Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessChangedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef RUNTIMECLASS_Windows_Security_Authorization_AppCapabilityAccess_AppCapabilityAccessChangedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_Security_Authorization_AppCapabilityAccess_AppCapabilityAccessChangedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Security_Authorization_AppCapabilityAccess_AppCapabilityAccessChangedEventArgs[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','A','u','t','h','o','r','i','z','a','t','i','o','n','.','A','p','p','C','a','p','a','b','i','l','i','t','y','A','c','c','e','s','s','.','A','p','p','C','a','p','a','b','i','l','i','t','y','A','c','c','e','s','s','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Authorization_AppCapabilityAccess_AppCapabilityAccessChangedEventArgs[] = L"Windows.Security.Authorization.AppCapabilityAccess.AppCapabilityAccessChangedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Authorization_AppCapabilityAccess_AppCapabilityAccessChangedEventArgs[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','A','u','t','h','o','r','i','z','a','t','i','o','n','.','A','p','p','C','a','p','a','b','i','l','i','t','y','A','c','c','e','s','s','.','A','p','p','C','a','p','a','b','i','l','i','t','y','A','c','c','e','s','s','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Security_Authorization_AppCapabilityAccess_AppCapabilityAccessChangedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > interface
 */
#ifndef ____FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
#define ____FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus, 0xc0538d02, 0x01f7, 0x51a1, 0x99,0xbd, 0x3d,0x14,0x8d,0x05,0x5f,0xa1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("c0538d02-01f7-51a1-99bd-3d148d055fa1")
                IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > : IKeyValuePair_impl<HSTRING, ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus, 0xc0538d02, 0x01f7, 0x51a1, 0x99,0xbd, 0x3d,0x14,0x8d,0x05,0x5f,0xa1)
#endif
#else
typedef struct __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        TrustLevel *trustLevel);

    /*** IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Key)(
        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        HSTRING *key);

    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *value);

    END_INTERFACE
} __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl;

interface __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus {
    CONST_VTBL __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Key(This,key) (This)->lpVtbl->get_Key(This,key)
#define __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
static inline HRESULT __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Key(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING *key) {
    return This->lpVtbl->get_Key(This,key);
}
static inline HRESULT __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Value(__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *value) {
    return This->lpVtbl->get_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IKeyValuePair_HSTRING_AppCapabilityAccessStatus IID___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus
#define IKeyValuePair_HSTRING_AppCapabilityAccessStatusVtbl __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl
#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus
#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_QueryInterface __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface
#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_AddRef __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef
#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_Release __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release
#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetIids __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids
#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName
#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetTrustLevel __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel
#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_get_Key __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Key
#define IKeyValuePair_HSTRING_AppCapabilityAccessStatus_get_Value __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Value
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > interface
 */
#ifndef ____FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
#define ____FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus, 0x62e88ad9, 0xd63e, 0x5173, 0xba,0xa2, 0xbb,0x45,0x21,0xc7,0xe8,0x2a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("62e88ad9-d63e-5173-baa2-bb4521c7e82a")
                IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > : IIterable_impl<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus, 0x62e88ad9, 0xd63e, 0x5173, 0xba,0xa2, 0xbb,0x45,0x21,0xc7,0xe8,0x2a)
#endif
#else
typedef struct __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus **value);

    END_INTERFACE
} __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl;

interface __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus {
    CONST_VTBL __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
#define __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
static inline HRESULT __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_First(__FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus IID___FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus
#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatusVtbl __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl
#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus
#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_QueryInterface __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface
#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_AddRef __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef
#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_Release __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release
#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetIids __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids
#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName
#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetTrustLevel __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel
#define IIterable_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_First __FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > interface
 */
#ifndef ____FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
#define ____FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus, 0x4e97286e, 0x7954, 0x5b79, 0xbe,0xa1, 0x83,0xaf,0x14,0x2e,0x4f,0xb2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("4e97286e-7954-5b79-bea1-83af142e4fb2")
                IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > : IIterator_impl<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus, 0x4e97286e, 0x7954, 0x5b79, 0xbe,0xa1, 0x83,0xaf,0x14,0x2e,0x4f,0xb2)
#endif
#else
typedef struct __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus *This,
        UINT32 items_size,
        __FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl;

interface __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus {
    CONST_VTBL __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Current(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_HasCurrent(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_MoveNext(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetMany(__FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus* This,UINT32 items_size,__FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus IID___FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus
#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatusVtbl __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatusVtbl
#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus
#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_QueryInterface __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_QueryInterface
#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_AddRef __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_AddRef
#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_Release __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_Release
#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetIids __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetIids
#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName
#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetTrustLevel __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel
#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_get_Current __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_Current
#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_get_HasCurrent __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_get_HasCurrent
#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_MoveNext __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_MoveNext
#define IIterator_IKeyValuePair_HSTRING_AppCapabilityAccessStatus_GetMany __FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1___FIKeyValuePair_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > interface
 */
#ifndef ____FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
#define ____FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIMapView_2_HSTRING_AppCapabilityAccessStatus, 0x20366438, 0x9fab, 0x5c12, 0x87,0xeb, 0xda,0x86,0x7e,0x38,0x3f,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("20366438-9fab-5c12-87eb-da867e383fe7")
                IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > : IMapView_impl<HSTRING, ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIMapView_2_HSTRING_AppCapabilityAccessStatus, 0x20366438, 0x9fab, 0x5c12, 0x87,0xeb, 0xda,0x86,0x7e,0x38,0x3f,0xe7)
#endif
#else
typedef struct __FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
        TrustLevel *trustLevel);

    /*** IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
    HRESULT (STDMETHODCALLTYPE *Lookup)(
        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
        HSTRING key,
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
        unsigned int *size);

    HRESULT (STDMETHODCALLTYPE *HasKey)(
        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
        HSTRING key,
        boolean *found);

    HRESULT (STDMETHODCALLTYPE *Split)(
        __FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
        __FIMapView_2_HSTRING_AppCapabilityAccessStatus **first,
        __FIMapView_2_HSTRING_AppCapabilityAccessStatus **second);

    END_INTERFACE
} __FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl;

interface __FIMapView_2_HSTRING_AppCapabilityAccessStatus {
    CONST_VTBL __FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Lookup(This,key,value) (This)->lpVtbl->Lookup(This,key,value)
#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_get_Size(This,size) (This)->lpVtbl->get_Size(This,size)
#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_HasKey(This,key,found) (This)->lpVtbl->HasKey(This,key,found)
#define __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Split(This,first,second) (This)->lpVtbl->Split(This,first,second)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetIids(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
static inline HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Lookup(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING key,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *value) {
    return This->lpVtbl->Lookup(This,key,value);
}
static inline HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_get_Size(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,unsigned int *size) {
    return This->lpVtbl->get_Size(This,size);
}
static inline HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_HasKey(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING key,boolean *found) {
    return This->lpVtbl->HasKey(This,key,found);
}
static inline HRESULT __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Split(__FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,__FIMapView_2_HSTRING_AppCapabilityAccessStatus **first,__FIMapView_2_HSTRING_AppCapabilityAccessStatus **second) {
    return This->lpVtbl->Split(This,first,second);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IMapView_HSTRING_AppCapabilityAccessStatus IID___FIMapView_2_HSTRING_AppCapabilityAccessStatus
#define IMapView_HSTRING_AppCapabilityAccessStatusVtbl __FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl
#define IMapView_HSTRING_AppCapabilityAccessStatus __FIMapView_2_HSTRING_AppCapabilityAccessStatus
#define IMapView_HSTRING_AppCapabilityAccessStatus_QueryInterface __FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface
#define IMapView_HSTRING_AppCapabilityAccessStatus_AddRef __FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef
#define IMapView_HSTRING_AppCapabilityAccessStatus_Release __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release
#define IMapView_HSTRING_AppCapabilityAccessStatus_GetIids __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetIids
#define IMapView_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName
#define IMapView_HSTRING_AppCapabilityAccessStatus_GetTrustLevel __FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel
#define IMapView_HSTRING_AppCapabilityAccessStatus_Lookup __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Lookup
#define IMapView_HSTRING_AppCapabilityAccessStatus_get_Size __FIMapView_2_HSTRING_AppCapabilityAccessStatus_get_Size
#define IMapView_HSTRING_AppCapabilityAccessStatus_HasKey __FIMapView_2_HSTRING_AppCapabilityAccessStatus_HasKey
#define IMapView_HSTRING_AppCapabilityAccessStatus_Split __FIMapView_2_HSTRING_AppCapabilityAccessStatus_Split
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > interface
 */
#ifndef ____FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus, 0xa66001f3, 0xe332, 0x531a, 0xbf,0x49, 0x4e,0xdd,0x3a,0xf8,0x8d,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("a66001f3-e332-531a-bf49-4edd3af88de7")
            IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > : IAsyncOperation_impl<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus, 0xa66001f3, 0xe332, 0x531a, 0xbf,0x49, 0x4e,0xdd,0x3a,0xf8,0x8d,0xe7)
#endif
#else
typedef struct __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
        __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
        __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
        __FIMapView_2_HSTRING_AppCapabilityAccessStatus **results);

    END_INTERFACE
} __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl;

interface __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus {
    CONST_VTBL __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetIids(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
static inline HRESULT __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_put_Completed(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,__FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_get_Completed(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,__FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetResults(__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,__FIMapView_2_HSTRING_AppCapabilityAccessStatus **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus IID___FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus
#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatusVtbl __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl
#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus
#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_QueryInterface __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface
#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_AddRef __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef
#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_Release __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release
#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_GetIids __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetIids
#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetRuntimeClassName
#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_GetTrustLevel __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetTrustLevel
#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_put_Completed __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_put_Completed
#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_get_Completed __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_get_Completed
#define IAsyncOperation_IMapView_HSTRING_AppCapabilityAccessStatus_GetResults __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > interface
 */
#ifndef ____FIAsyncOperation_1_AppCapabilityAccessStatus_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_AppCapabilityAccessStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_AppCapabilityAccessStatus, 0x827caf42, 0x5fe6, 0x5b5b, 0x84,0xce, 0xc4,0x48,0x34,0x13,0x4d,0x3d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("827caf42-5fe6-5b5b-84ce-c44834134d3d")
            IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > : IAsyncOperation_impl<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_AppCapabilityAccessStatus, 0x827caf42, 0x5fe6, 0x5b5b, 0x84,0xce, 0xc4,0x48,0x34,0x13,0x4d,0x3d)
#endif
#else
typedef struct __FIAsyncOperation_1_AppCapabilityAccessStatusVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_AppCapabilityAccessStatus *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_AppCapabilityAccessStatus *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_AppCapabilityAccessStatus *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_AppCapabilityAccessStatus *This,
        __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_AppCapabilityAccessStatus *This,
        __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_AppCapabilityAccessStatus *This,
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *results);

    END_INTERFACE
} __FIAsyncOperation_1_AppCapabilityAccessStatusVtbl;

interface __FIAsyncOperation_1_AppCapabilityAccessStatus {
    CONST_VTBL __FIAsyncOperation_1_AppCapabilityAccessStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_AppCapabilityAccessStatus_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_AppCapabilityAccessStatus_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_AppCapabilityAccessStatus_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
#define __FIAsyncOperation_1_AppCapabilityAccessStatus_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_AppCapabilityAccessStatus_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_AppCapabilityAccessStatus_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_AppCapabilityAccessStatus_QueryInterface(__FIAsyncOperation_1_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_AppCapabilityAccessStatus_AddRef(__FIAsyncOperation_1_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_AppCapabilityAccessStatus_Release(__FIAsyncOperation_1_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_AppCapabilityAccessStatus_GetIids(__FIAsyncOperation_1_AppCapabilityAccessStatus* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_AppCapabilityAccessStatus_GetRuntimeClassName(__FIAsyncOperation_1_AppCapabilityAccessStatus* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_AppCapabilityAccessStatus_GetTrustLevel(__FIAsyncOperation_1_AppCapabilityAccessStatus* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
static inline HRESULT __FIAsyncOperation_1_AppCapabilityAccessStatus_put_Completed(__FIAsyncOperation_1_AppCapabilityAccessStatus* This,__FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_AppCapabilityAccessStatus_get_Completed(__FIAsyncOperation_1_AppCapabilityAccessStatus* This,__FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_AppCapabilityAccessStatus_GetResults(__FIAsyncOperation_1_AppCapabilityAccessStatus* This,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CAppCapabilityAccessStatus *results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_AppCapabilityAccessStatus IID___FIAsyncOperation_1_AppCapabilityAccessStatus
#define IAsyncOperation_AppCapabilityAccessStatusVtbl __FIAsyncOperation_1_AppCapabilityAccessStatusVtbl
#define IAsyncOperation_AppCapabilityAccessStatus __FIAsyncOperation_1_AppCapabilityAccessStatus
#define IAsyncOperation_AppCapabilityAccessStatus_QueryInterface __FIAsyncOperation_1_AppCapabilityAccessStatus_QueryInterface
#define IAsyncOperation_AppCapabilityAccessStatus_AddRef __FIAsyncOperation_1_AppCapabilityAccessStatus_AddRef
#define IAsyncOperation_AppCapabilityAccessStatus_Release __FIAsyncOperation_1_AppCapabilityAccessStatus_Release
#define IAsyncOperation_AppCapabilityAccessStatus_GetIids __FIAsyncOperation_1_AppCapabilityAccessStatus_GetIids
#define IAsyncOperation_AppCapabilityAccessStatus_GetRuntimeClassName __FIAsyncOperation_1_AppCapabilityAccessStatus_GetRuntimeClassName
#define IAsyncOperation_AppCapabilityAccessStatus_GetTrustLevel __FIAsyncOperation_1_AppCapabilityAccessStatus_GetTrustLevel
#define IAsyncOperation_AppCapabilityAccessStatus_put_Completed __FIAsyncOperation_1_AppCapabilityAccessStatus_put_Completed
#define IAsyncOperation_AppCapabilityAccessStatus_get_Completed __FIAsyncOperation_1_AppCapabilityAccessStatus_get_Completed
#define IAsyncOperation_AppCapabilityAccessStatus_GetResults __FIAsyncOperation_1_AppCapabilityAccessStatus_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus, 0xbdf03ead, 0xa75b, 0x510c, 0x87,0xd2, 0x5b,0x57,0x53,0xbd,0xf1,0xbd);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("bdf03ead-a75b-510c-87d2-5b5753bdf1bd")
            IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus, 0xbdf03ead, 0xa75b, 0x510c, 0x87,0xd2, 0x5b,0x57,0x53,0xbd,0xf1,0xbd)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *This,
        __FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl;

interface __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface(__FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef(__FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release(__FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IMapView<HSTRING,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Invoke(__FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus* This,__FIAsyncOperation_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_IMapView_HSTRING_AppCapabilityAccessStatus IID___FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus
#define IAsyncOperationCompletedHandler_IMapView_HSTRING_AppCapabilityAccessStatusVtbl __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatusVtbl
#define IAsyncOperationCompletedHandler_IMapView_HSTRING_AppCapabilityAccessStatus __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus
#define IAsyncOperationCompletedHandler_IMapView_HSTRING_AppCapabilityAccessStatus_QueryInterface __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_QueryInterface
#define IAsyncOperationCompletedHandler_IMapView_HSTRING_AppCapabilityAccessStatus_AddRef __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_AddRef
#define IAsyncOperationCompletedHandler_IMapView_HSTRING_AppCapabilityAccessStatus_Release __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Release
#define IAsyncOperationCompletedHandler_IMapView_HSTRING_AppCapabilityAccessStatus_Invoke __FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1___FIMapView_2_HSTRING_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus, 0x6ea0f2e9, 0xbc97, 0x58e8, 0xa3,0xa6, 0xc8,0x29,0xb9,0xe5,0xf2,0xaa);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("6ea0f2e9-bc97-58e8-a3a6-c829b9e5f2aa")
            IAsyncOperationCompletedHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus, 0x6ea0f2e9, 0xbc97, 0x58e8, 0xa3,0xa6, 0xc8,0x29,0xb9,0xe5,0xf2,0xaa)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatusVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus *This,
        __FIAsyncOperation_1_AppCapabilityAccessStatus *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatusVtbl;

interface __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatusVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
#define __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_QueryInterface(__FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_AddRef(__FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_Release(__FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessStatus > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_Invoke(__FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus* This,__FIAsyncOperation_1_AppCapabilityAccessStatus *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_AppCapabilityAccessStatus IID___FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus
#define IAsyncOperationCompletedHandler_AppCapabilityAccessStatusVtbl __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatusVtbl
#define IAsyncOperationCompletedHandler_AppCapabilityAccessStatus __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus
#define IAsyncOperationCompletedHandler_AppCapabilityAccessStatus_QueryInterface __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_QueryInterface
#define IAsyncOperationCompletedHandler_AppCapabilityAccessStatus_AddRef __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_AddRef
#define IAsyncOperationCompletedHandler_AppCapabilityAccessStatus_Release __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_Release
#define IAsyncOperationCompletedHandler_AppCapabilityAccessStatus_Invoke __FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_AppCapabilityAccessStatus_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs, 0x6d923c95, 0x7b83, 0x5f59, 0x88,0x83, 0xf4,0x41,0x75,0x28,0x48,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("6d923c95-7b83-5f59-8883-f44175284898")
            ITypedEventHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*, ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapability* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs*, ABI::Windows::Security::Authorization::AppCapabilityAccess::IAppCapabilityAccessChangedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs, 0x6d923c95, 0x7b83, 0x5f59, 0x88,0x83, 0xf4,0x41,0x75,0x28,0x48,0x98)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgsVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ITypedEventHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs *This,
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *sender,
        __x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_Release(__FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapability*,ABI::Windows::Security::Authorization::AppCapabilityAccess::AppCapabilityAccessChangedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs* This,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapability *sender,__x_ABI_CWindows_CSecurity_CAuthorization_CAppCapabilityAccess_CIAppCapabilityAccessChangedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_AppCapability_AppCapabilityAccessChangedEventArgs IID___FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs
#define ITypedEventHandler_AppCapability_AppCapabilityAccessChangedEventArgsVtbl __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgsVtbl
#define ITypedEventHandler_AppCapability_AppCapabilityAccessChangedEventArgs __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs
#define ITypedEventHandler_AppCapability_AppCapabilityAccessChangedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_QueryInterface
#define ITypedEventHandler_AppCapability_AppCapabilityAccessChangedEventArgs_AddRef __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_AddRef
#define ITypedEventHandler_AppCapability_AppCapabilityAccessChangedEventArgs_Release __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_Release
#define ITypedEventHandler_AppCapability_AppCapabilityAccessChangedEventArgs_Invoke __FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapability_Windows__CSecurity__CAuthorization__CAppCapabilityAccess__CAppCapabilityAccessChangedEventArgs_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_security_authorization_appcapabilityaccess_h__ */
