/*** Autogenerated by WIDL 8.21 from include/windows.globalization.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_globalization_h__
#define __windows_globalization_h__

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

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguage __x_ABI_CWindows_CGlobalization_CILanguage;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguage ABI::Windows::Globalization::ILanguage
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguage;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguage2 __x_ABI_CWindows_CGlobalization_CILanguage2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguage2 ABI::Windows::Globalization::ILanguage2
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguage2;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage3_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguage3 __x_ABI_CWindows_CGlobalization_CILanguage3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguage3 ABI::Windows::Globalization::ILanguage3
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguage3;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags ABI::Windows::Globalization::ILanguageExtensionSubtags
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageExtensionSubtags;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageFactory __x_ABI_CWindows_CGlobalization_CILanguageFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory ABI::Windows::Globalization::ILanguageFactory
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageStatics __x_ABI_CWindows_CGlobalization_CILanguageStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics ABI::Windows::Globalization::ILanguageStatics
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageStatics2 __x_ABI_CWindows_CGlobalization_CILanguageStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2 ABI::Windows::Globalization::ILanguageStatics2
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageStatics2;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageStatics3 __x_ABI_CWindows_CGlobalization_CILanguageStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3 ABI::Windows::Globalization::ILanguageStatics3
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageStatics3;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CIGeographicRegion_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CIGeographicRegion_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CIGeographicRegion __x_ABI_CWindows_CGlobalization_CIGeographicRegion;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion ABI::Windows::Globalization::IGeographicRegion
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface IGeographicRegion;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory ABI::Windows::Globalization::IGeographicRegionFactory
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface IGeographicRegionFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics ABI::Windows::Globalization::IGeographicRegionStatics
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface IGeographicRegionStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CLanguage_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CLanguage_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Globalization {
            class Language;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGlobalization_CLanguage __x_ABI_CWindows_CGlobalization_CLanguage;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGlobalization_CLanguage_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CGlobalization_CGeographicRegion_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CGeographicRegion_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Globalization {
            class GeographicRegion;
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CGlobalization_CGeographicRegion __x_ABI_CWindows_CGlobalization_CGeographicRegion;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CGlobalization_CGeographicRegion_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGlobalization__CLanguage __FIIterable_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGlobalization__CLanguage __FIIterator_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGlobalization__CLanguage __FIVectorView_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIVector_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CGlobalization__CLanguage __FIVector_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIVector_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

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

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

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguage __x_ABI_CWindows_CGlobalization_CILanguage;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguage ABI::Windows::Globalization::ILanguage
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguage;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguage2 __x_ABI_CWindows_CGlobalization_CILanguage2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguage2 ABI::Windows::Globalization::ILanguage2
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguage2;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage3_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguage3 __x_ABI_CWindows_CGlobalization_CILanguage3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguage3 ABI::Windows::Globalization::ILanguage3
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguage3;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags ABI::Windows::Globalization::ILanguageExtensionSubtags
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageExtensionSubtags;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageFactory __x_ABI_CWindows_CGlobalization_CILanguageFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory ABI::Windows::Globalization::ILanguageFactory
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageStatics __x_ABI_CWindows_CGlobalization_CILanguageStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics ABI::Windows::Globalization::ILanguageStatics
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageStatics2 __x_ABI_CWindows_CGlobalization_CILanguageStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2 ABI::Windows::Globalization::ILanguageStatics2
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageStatics2;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics3_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CILanguageStatics3 __x_ABI_CWindows_CGlobalization_CILanguageStatics3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3 ABI::Windows::Globalization::ILanguageStatics3
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface ILanguageStatics3;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CIGeographicRegion_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CIGeographicRegion_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CIGeographicRegion __x_ABI_CWindows_CGlobalization_CIGeographicRegion;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion ABI::Windows::Globalization::IGeographicRegion
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface IGeographicRegion;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory ABI::Windows::Globalization::IGeographicRegionFactory
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface IGeographicRegionFactory;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics ABI::Windows::Globalization::IGeographicRegionStatics
namespace ABI {
    namespace Windows {
        namespace Globalization {
            interface IGeographicRegionStatics;
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIIterable_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CGlobalization__CLanguage __FIIterable_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIIterator_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CGlobalization__CLanguage __FIIterator_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CGlobalization__CLanguage __FIVectorView_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
#define ____FIVector_1_Windows__CGlobalization__CLanguage_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CGlobalization__CLanguage __FIVector_1_Windows__CGlobalization__CLanguage;
#ifdef __cplusplus
#define __FIVector_1_Windows__CGlobalization__CLanguage ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Globalization::Language* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            enum DayOfWeek {
                DayOfWeek_Sunday = 0,
                DayOfWeek_Monday = 1,
                DayOfWeek_Tuesday = 2,
                DayOfWeek_Wednesday = 3,
                DayOfWeek_Thursday = 4,
                DayOfWeek_Friday = 5,
                DayOfWeek_Saturday = 6
            };
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGlobalization_CDayOfWeek {
    DayOfWeek_Sunday = 0,
    DayOfWeek_Monday = 1,
    DayOfWeek_Tuesday = 2,
    DayOfWeek_Wednesday = 3,
    DayOfWeek_Thursday = 4,
    DayOfWeek_Friday = 5,
    DayOfWeek_Saturday = 6
};
#ifdef WIDL_using_Windows_Globalization
#define DayOfWeek __x_ABI_CWindows_CGlobalization_CDayOfWeek
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            enum LanguageLayoutDirection {
                LanguageLayoutDirection_Ltr = 0,
                LanguageLayoutDirection_Rtl = 1,
                LanguageLayoutDirection_TtbLtr = 2,
                LanguageLayoutDirection_TtbRtl = 3
            };
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CGlobalization_CLanguageLayoutDirection {
    LanguageLayoutDirection_Ltr = 0,
    LanguageLayoutDirection_Rtl = 1,
    LanguageLayoutDirection_TtbLtr = 2,
    LanguageLayoutDirection_TtbRtl = 3
};
#ifdef WIDL_using_Windows_Globalization
#define LanguageLayoutDirection __x_ABI_CWindows_CGlobalization_CLanguageLayoutDirection
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */
/*****************************************************************************
 * ILanguage interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguage, 0xea79a752, 0xf7c2, 0x4265, 0xb1,0xbd, 0xc4,0xde,0xc4,0xe4,0xf0,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("ea79a752-f7c2-4265-b1bd-c4dec4e4f080")
            ILanguage : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_LanguageTag(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_DisplayName(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_NativeName(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_Script(
                    HSTRING *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguage, 0xea79a752, 0xf7c2, 0x4265, 0xb1,0xbd, 0xc4,0xde,0xc4,0xe4,0xf0,0x80)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguage methods ***/
    HRESULT (STDMETHODCALLTYPE *get_LanguageTag)(
        __x_ABI_CWindows_CGlobalization_CILanguage *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_DisplayName)(
        __x_ABI_CWindows_CGlobalization_CILanguage *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_NativeName)(
        __x_ABI_CWindows_CGlobalization_CILanguage *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Script)(
        __x_ABI_CWindows_CGlobalization_CILanguage *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguageVtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguage {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguage methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage_get_LanguageTag(This,value) (This)->lpVtbl->get_LanguageTag(This,value)
#define __x_ABI_CWindows_CGlobalization_CILanguage_get_DisplayName(This,value) (This)->lpVtbl->get_DisplayName(This,value)
#define __x_ABI_CWindows_CGlobalization_CILanguage_get_NativeName(This,value) (This)->lpVtbl->get_NativeName(This,value)
#define __x_ABI_CWindows_CGlobalization_CILanguage_get_Script(This,value) (This)->lpVtbl->get_Script(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguage_AddRef(__x_ABI_CWindows_CGlobalization_CILanguage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguage_Release(__x_ABI_CWindows_CGlobalization_CILanguage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_GetIids(__x_ABI_CWindows_CGlobalization_CILanguage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguage methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_get_LanguageTag(__x_ABI_CWindows_CGlobalization_CILanguage* This,HSTRING *value) {
    return This->lpVtbl->get_LanguageTag(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_get_DisplayName(__x_ABI_CWindows_CGlobalization_CILanguage* This,HSTRING *value) {
    return This->lpVtbl->get_DisplayName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_get_NativeName(__x_ABI_CWindows_CGlobalization_CILanguage* This,HSTRING *value) {
    return This->lpVtbl->get_NativeName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage_get_Script(__x_ABI_CWindows_CGlobalization_CILanguage* This,HSTRING *value) {
    return This->lpVtbl->get_Script(This,value);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguage IID___x_ABI_CWindows_CGlobalization_CILanguage
#define ILanguageVtbl __x_ABI_CWindows_CGlobalization_CILanguageVtbl
#define ILanguage __x_ABI_CWindows_CGlobalization_CILanguage
#define ILanguage_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguage_QueryInterface
#define ILanguage_AddRef __x_ABI_CWindows_CGlobalization_CILanguage_AddRef
#define ILanguage_Release __x_ABI_CWindows_CGlobalization_CILanguage_Release
#define ILanguage_GetIids __x_ABI_CWindows_CGlobalization_CILanguage_GetIids
#define ILanguage_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguage_GetRuntimeClassName
#define ILanguage_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguage_GetTrustLevel
#define ILanguage_get_LanguageTag __x_ABI_CWindows_CGlobalization_CILanguage_get_LanguageTag
#define ILanguage_get_DisplayName __x_ABI_CWindows_CGlobalization_CILanguage_get_DisplayName
#define ILanguage_get_NativeName __x_ABI_CWindows_CGlobalization_CILanguage_get_NativeName
#define ILanguage_get_Script __x_ABI_CWindows_CGlobalization_CILanguage_get_Script
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguage_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ILanguage2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguage2, 0x6a47e5b5, 0xd94d, 0x4886, 0xa4,0x04, 0xa5,0xa5,0xb9,0xd5,0xb4,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("6a47e5b5-d94d-4886-a404-a5a5b9d5b494")
            ILanguage2 : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_LayoutDirection(
                    enum LanguageLayoutDirection *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguage2, 0x6a47e5b5, 0xd94d, 0x4886, 0xa4,0x04, 0xa5,0xa5,0xb9,0xd5,0xb4,0x94)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguage2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguage2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_LayoutDirection)(
        __x_ABI_CWindows_CGlobalization_CILanguage2 *This,
        enum __x_ABI_CWindows_CGlobalization_CLanguageLayoutDirection *value);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguage2Vtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguage2 {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguage2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguage2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguage2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguage2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguage2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguage2 methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage2_get_LayoutDirection(This,value) (This)->lpVtbl->get_LayoutDirection(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage2_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguage2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguage2_AddRef(__x_ABI_CWindows_CGlobalization_CILanguage2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguage2_Release(__x_ABI_CWindows_CGlobalization_CILanguage2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage2_GetIids(__x_ABI_CWindows_CGlobalization_CILanguage2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage2_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguage2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage2_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguage2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguage2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage2_get_LayoutDirection(__x_ABI_CWindows_CGlobalization_CILanguage2* This,enum __x_ABI_CWindows_CGlobalization_CLanguageLayoutDirection *value) {
    return This->lpVtbl->get_LayoutDirection(This,value);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguage2 IID___x_ABI_CWindows_CGlobalization_CILanguage2
#define ILanguage2Vtbl __x_ABI_CWindows_CGlobalization_CILanguage2Vtbl
#define ILanguage2 __x_ABI_CWindows_CGlobalization_CILanguage2
#define ILanguage2_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguage2_QueryInterface
#define ILanguage2_AddRef __x_ABI_CWindows_CGlobalization_CILanguage2_AddRef
#define ILanguage2_Release __x_ABI_CWindows_CGlobalization_CILanguage2_Release
#define ILanguage2_GetIids __x_ABI_CWindows_CGlobalization_CILanguage2_GetIids
#define ILanguage2_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguage2_GetRuntimeClassName
#define ILanguage2_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguage2_GetTrustLevel
#define ILanguage2_get_LayoutDirection __x_ABI_CWindows_CGlobalization_CILanguage2_get_LayoutDirection
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguage2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */

/*****************************************************************************
 * ILanguage3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguage3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguage3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguage3, 0xc6af3d10, 0x641a, 0x5ba4, 0xbb,0x43, 0x5e,0x12,0xae,0xd7,0x59,0x54);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("c6af3d10-641a-5ba4-bb43-5e12aed75954")
            ILanguage3 : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_AbbreviatedName(
                    HSTRING *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguage3, 0xc6af3d10, 0x641a, 0x5ba4, 0xbb,0x43, 0x5e,0x12,0xae,0xd7,0x59,0x54)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguage3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguage3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AbbreviatedName)(
        __x_ABI_CWindows_CGlobalization_CILanguage3 *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguage3Vtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguage3 {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguage3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguage3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguage3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguage3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguage3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguage3 methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguage3_get_AbbreviatedName(This,value) (This)->lpVtbl->get_AbbreviatedName(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage3_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguage3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguage3_AddRef(__x_ABI_CWindows_CGlobalization_CILanguage3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguage3_Release(__x_ABI_CWindows_CGlobalization_CILanguage3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage3_GetIids(__x_ABI_CWindows_CGlobalization_CILanguage3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage3_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguage3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage3_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguage3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguage3 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguage3_get_AbbreviatedName(__x_ABI_CWindows_CGlobalization_CILanguage3* This,HSTRING *value) {
    return This->lpVtbl->get_AbbreviatedName(This,value);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguage3 IID___x_ABI_CWindows_CGlobalization_CILanguage3
#define ILanguage3Vtbl __x_ABI_CWindows_CGlobalization_CILanguage3Vtbl
#define ILanguage3 __x_ABI_CWindows_CGlobalization_CILanguage3
#define ILanguage3_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguage3_QueryInterface
#define ILanguage3_AddRef __x_ABI_CWindows_CGlobalization_CILanguage3_AddRef
#define ILanguage3_Release __x_ABI_CWindows_CGlobalization_CILanguage3_Release
#define ILanguage3_GetIids __x_ABI_CWindows_CGlobalization_CILanguage3_GetIids
#define ILanguage3_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguage3_GetRuntimeClassName
#define ILanguage3_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguage3_GetTrustLevel
#define ILanguage3_get_AbbreviatedName __x_ABI_CWindows_CGlobalization_CILanguage3_get_AbbreviatedName
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguage3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */

/*****************************************************************************
 * ILanguageExtensionSubtags interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags, 0x7d7daf45, 0x368d, 0x4364, 0x85,0x2b, 0xde,0xc9,0x27,0x03,0x7b,0x85);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("7d7daf45-368d-4364-852b-dec927037b85")
            ILanguageExtensionSubtags : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE GetExtensionSubtags(
                    HSTRING tag,
                    ABI::Windows::Foundation::Collections::IVectorView<HSTRING > **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags, 0x7d7daf45, 0x368d, 0x4364, 0x85,0x2b, 0xde,0xc9,0x27,0x03,0x7b,0x85)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtagsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguageExtensionSubtags methods ***/
    HRESULT (STDMETHODCALLTYPE *GetExtensionSubtags)(
        __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags *This,
        HSTRING tag,
        __FIVectorView_1_HSTRING **value);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtagsVtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtagsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguageExtensionSubtags methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetExtensionSubtags(This,tag,value) (This)->lpVtbl->GetExtensionSubtags(This,tag,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_AddRef(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_Release(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetIids(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguageExtensionSubtags methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetExtensionSubtags(__x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags* This,HSTRING tag,__FIVectorView_1_HSTRING **value) {
    return This->lpVtbl->GetExtensionSubtags(This,tag,value);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguageExtensionSubtags IID___x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags
#define ILanguageExtensionSubtagsVtbl __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtagsVtbl
#define ILanguageExtensionSubtags __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags
#define ILanguageExtensionSubtags_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_QueryInterface
#define ILanguageExtensionSubtags_AddRef __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_AddRef
#define ILanguageExtensionSubtags_Release __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_Release
#define ILanguageExtensionSubtags_GetIids __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetIids
#define ILanguageExtensionSubtags_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetRuntimeClassName
#define ILanguageExtensionSubtags_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetTrustLevel
#define ILanguageExtensionSubtags_GetExtensionSubtags __x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_GetExtensionSubtags
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguageExtensionSubtags_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ILanguageFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguageFactory, 0x9b0252ac, 0x0c27, 0x44f8, 0xb7,0x92, 0x97,0x93,0xfb,0x66,0xc6,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("9b0252ac-0c27-44f8-b792-9793fb66c63e")
            ILanguageFactory : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE CreateLanguage(
                    HSTRING tag,
                    ABI::Windows::Globalization::ILanguage **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguageFactory, 0x9b0252ac, 0x0c27, 0x44f8, 0xb7,0x92, 0x97,0x93,0xfb,0x66,0xc6,0x3e)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguageFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguageFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateLanguage)(
        __x_ABI_CWindows_CGlobalization_CILanguageFactory *This,
        HSTRING tag,
        __x_ABI_CWindows_CGlobalization_CILanguage **value);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguageFactoryVtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguageFactory {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguageFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguageFactory methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageFactory_CreateLanguage(This,tag,value) (This)->lpVtbl->CreateLanguage(This,tag,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageFactory_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguageFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageFactory_AddRef(__x_ABI_CWindows_CGlobalization_CILanguageFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageFactory_Release(__x_ABI_CWindows_CGlobalization_CILanguageFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetIids(__x_ABI_CWindows_CGlobalization_CILanguageFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguageFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguageFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguageFactory methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageFactory_CreateLanguage(__x_ABI_CWindows_CGlobalization_CILanguageFactory* This,HSTRING tag,__x_ABI_CWindows_CGlobalization_CILanguage **value) {
    return This->lpVtbl->CreateLanguage(This,tag,value);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguageFactory IID___x_ABI_CWindows_CGlobalization_CILanguageFactory
#define ILanguageFactoryVtbl __x_ABI_CWindows_CGlobalization_CILanguageFactoryVtbl
#define ILanguageFactory __x_ABI_CWindows_CGlobalization_CILanguageFactory
#define ILanguageFactory_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguageFactory_QueryInterface
#define ILanguageFactory_AddRef __x_ABI_CWindows_CGlobalization_CILanguageFactory_AddRef
#define ILanguageFactory_Release __x_ABI_CWindows_CGlobalization_CILanguageFactory_Release
#define ILanguageFactory_GetIids __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetIids
#define ILanguageFactory_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetRuntimeClassName
#define ILanguageFactory_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguageFactory_GetTrustLevel
#define ILanguageFactory_CreateLanguage __x_ABI_CWindows_CGlobalization_CILanguageFactory_CreateLanguage
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguageFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ILanguageStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguageStatics, 0xb23cd557, 0x0865, 0x46d4, 0x89,0xb8, 0xd5,0x9b,0xe8,0x99,0x0f,0x0d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("b23cd557-0865-46d4-89b8-d59be8990f0d")
            ILanguageStatics : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE IsWellFormed(
                    HSTRING tag,
                    BOOLEAN *result) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_CurrentInputMethodLanguageTag(
                    HSTRING *value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguageStatics, 0xb23cd557, 0x0865, 0x46d4, 0x89,0xb8, 0xd5,0x9b,0xe8,0x99,0x0f,0x0d)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguageStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguageStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *IsWellFormed)(
        __x_ABI_CWindows_CGlobalization_CILanguageStatics *This,
        HSTRING tag,
        BOOLEAN *result);

    HRESULT (STDMETHODCALLTYPE *get_CurrentInputMethodLanguageTag)(
        __x_ABI_CWindows_CGlobalization_CILanguageStatics *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguageStaticsVtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguageStatics {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguageStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguageStatics methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_IsWellFormed(This,tag,result) (This)->lpVtbl->IsWellFormed(This,tag,result)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics_get_CurrentInputMethodLanguageTag(This,value) (This)->lpVtbl->get_CurrentInputMethodLanguageTag(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageStatics_AddRef(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageStatics_Release(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetIids(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguageStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics_IsWellFormed(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This,HSTRING tag,BOOLEAN *result) {
    return This->lpVtbl->IsWellFormed(This,tag,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics_get_CurrentInputMethodLanguageTag(__x_ABI_CWindows_CGlobalization_CILanguageStatics* This,HSTRING *value) {
    return This->lpVtbl->get_CurrentInputMethodLanguageTag(This,value);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguageStatics IID___x_ABI_CWindows_CGlobalization_CILanguageStatics
#define ILanguageStaticsVtbl __x_ABI_CWindows_CGlobalization_CILanguageStaticsVtbl
#define ILanguageStatics __x_ABI_CWindows_CGlobalization_CILanguageStatics
#define ILanguageStatics_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguageStatics_QueryInterface
#define ILanguageStatics_AddRef __x_ABI_CWindows_CGlobalization_CILanguageStatics_AddRef
#define ILanguageStatics_Release __x_ABI_CWindows_CGlobalization_CILanguageStatics_Release
#define ILanguageStatics_GetIids __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetIids
#define ILanguageStatics_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetRuntimeClassName
#define ILanguageStatics_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguageStatics_GetTrustLevel
#define ILanguageStatics_IsWellFormed __x_ABI_CWindows_CGlobalization_CILanguageStatics_IsWellFormed
#define ILanguageStatics_get_CurrentInputMethodLanguageTag __x_ABI_CWindows_CGlobalization_CILanguageStatics_get_CurrentInputMethodLanguageTag
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguageStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ILanguageStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguageStatics2, 0x30199f6e, 0x914b, 0x4b2a, 0x9d,0x6e, 0xe3,0xb0,0xe2,0x7d,0xbe,0x4f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("30199f6e-914b-4b2a-9d6e-e3b0e27dbe4f")
            ILanguageStatics2 : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE TrySetInputMethodLanguageTag(
                    HSTRING tag,
                    BOOLEAN *result) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguageStatics2, 0x30199f6e, 0x914b, 0x4b2a, 0x9d,0x6e, 0xe3,0xb0,0xe2,0x7d,0xbe,0x4f)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguageStatics2Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguageStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *TrySetInputMethodLanguageTag)(
        __x_ABI_CWindows_CGlobalization_CILanguageStatics2 *This,
        HSTRING tag,
        BOOLEAN *result);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguageStatics2Vtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguageStatics2 {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguageStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguageStatics2 methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics2_TrySetInputMethodLanguageTag(This,tag,result) (This)->lpVtbl->TrySetInputMethodLanguageTag(This,tag,result)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics2_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguageStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageStatics2_AddRef(__x_ABI_CWindows_CGlobalization_CILanguageStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageStatics2_Release(__x_ABI_CWindows_CGlobalization_CILanguageStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetIids(__x_ABI_CWindows_CGlobalization_CILanguageStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguageStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguageStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguageStatics2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics2_TrySetInputMethodLanguageTag(__x_ABI_CWindows_CGlobalization_CILanguageStatics2* This,HSTRING tag,BOOLEAN *result) {
    return This->lpVtbl->TrySetInputMethodLanguageTag(This,tag,result);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguageStatics2 IID___x_ABI_CWindows_CGlobalization_CILanguageStatics2
#define ILanguageStatics2Vtbl __x_ABI_CWindows_CGlobalization_CILanguageStatics2Vtbl
#define ILanguageStatics2 __x_ABI_CWindows_CGlobalization_CILanguageStatics2
#define ILanguageStatics2_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguageStatics2_QueryInterface
#define ILanguageStatics2_AddRef __x_ABI_CWindows_CGlobalization_CILanguageStatics2_AddRef
#define ILanguageStatics2_Release __x_ABI_CWindows_CGlobalization_CILanguageStatics2_Release
#define ILanguageStatics2_GetIids __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetIids
#define ILanguageStatics2_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetRuntimeClassName
#define ILanguageStatics2_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguageStatics2_GetTrustLevel
#define ILanguageStatics2_TrySetInputMethodLanguageTag __x_ABI_CWindows_CGlobalization_CILanguageStatics2_TrySetInputMethodLanguageTag
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguageStatics2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ILanguageStatics3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000
#ifndef ____x_ABI_CWindows_CGlobalization_CILanguageStatics3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CILanguageStatics3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CILanguageStatics3, 0xd15ecb5a, 0x71de, 0x5752, 0x95,0x42, 0xfa,0xc5,0xb4,0xf2,0x72,0x61);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("d15ecb5a-71de-5752-9542-fac5b4f27261")
            ILanguageStatics3 : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE GetMuiCompatibleLanguageListFromLanguageTags(
                    ABI::Windows::Foundation::Collections::IIterable<HSTRING > *tags,
                    ABI::Windows::Foundation::Collections::IVector<HSTRING > **result) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CILanguageStatics3, 0xd15ecb5a, 0x71de, 0x5752, 0x95,0x42, 0xfa,0xc5,0xb4,0xf2,0x72,0x61)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CILanguageStatics3Vtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** ILanguageStatics3 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMuiCompatibleLanguageListFromLanguageTags)(
        __x_ABI_CWindows_CGlobalization_CILanguageStatics3 *This,
        __FIIterable_1_HSTRING *tags,
        __FIVector_1_HSTRING **result);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CILanguageStatics3Vtbl;

interface __x_ABI_CWindows_CGlobalization_CILanguageStatics3 {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CILanguageStatics3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ILanguageStatics3 methods ***/
#define __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetMuiCompatibleLanguageListFromLanguageTags(This,tags,result) (This)->lpVtbl->GetMuiCompatibleLanguageListFromLanguageTags(This,tags,result)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics3_QueryInterface(__x_ABI_CWindows_CGlobalization_CILanguageStatics3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageStatics3_AddRef(__x_ABI_CWindows_CGlobalization_CILanguageStatics3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CILanguageStatics3_Release(__x_ABI_CWindows_CGlobalization_CILanguageStatics3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetIids(__x_ABI_CWindows_CGlobalization_CILanguageStatics3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CILanguageStatics3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CILanguageStatics3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ILanguageStatics3 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetMuiCompatibleLanguageListFromLanguageTags(__x_ABI_CWindows_CGlobalization_CILanguageStatics3* This,__FIIterable_1_HSTRING *tags,__FIVector_1_HSTRING **result) {
    return This->lpVtbl->GetMuiCompatibleLanguageListFromLanguageTags(This,tags,result);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_ILanguageStatics3 IID___x_ABI_CWindows_CGlobalization_CILanguageStatics3
#define ILanguageStatics3Vtbl __x_ABI_CWindows_CGlobalization_CILanguageStatics3Vtbl
#define ILanguageStatics3 __x_ABI_CWindows_CGlobalization_CILanguageStatics3
#define ILanguageStatics3_QueryInterface __x_ABI_CWindows_CGlobalization_CILanguageStatics3_QueryInterface
#define ILanguageStatics3_AddRef __x_ABI_CWindows_CGlobalization_CILanguageStatics3_AddRef
#define ILanguageStatics3_Release __x_ABI_CWindows_CGlobalization_CILanguageStatics3_Release
#define ILanguageStatics3_GetIids __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetIids
#define ILanguageStatics3_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetRuntimeClassName
#define ILanguageStatics3_GetTrustLevel __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetTrustLevel
#define ILanguageStatics3_GetMuiCompatibleLanguageListFromLanguageTags __x_ABI_CWindows_CGlobalization_CILanguageStatics3_GetMuiCompatibleLanguageListFromLanguageTags
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CILanguageStatics3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xa0000 */

/*****************************************************************************
 * IGeographicRegion interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGlobalization_CIGeographicRegion_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CIGeographicRegion_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CIGeographicRegion, 0x01e9a621, 0x4a64, 0x4ed9, 0x95,0x4f, 0x9e,0xde,0xb0,0x7b,0xd9,0x03);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("01e9a621-4a64-4ed9-954f-9edeb07bd903")
            IGeographicRegion : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE get_Code(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_CodeTwoLetter(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_CodeThreeLetter(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_CodeThreeDigit(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_DisplayName(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_NativeName(
                    HSTRING *value) = 0;

                virtual HRESULT STDMETHODCALLTYPE get_CurrenciesInUse(
                    ABI::Windows::Foundation::Collections::IVectorView<HSTRING > **value) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CIGeographicRegion, 0x01e9a621, 0x4a64, 0x4ed9, 0x95,0x4f, 0x9e,0xde,0xb0,0x7b,0xd9,0x03)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CIGeographicRegionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IGeographicRegion methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Code)(
        __x_ABI_CWindows_CGlobalization_CIGeographicRegion *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_CodeTwoLetter)(
        __x_ABI_CWindows_CGlobalization_CIGeographicRegion *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_CodeThreeLetter)(
        __x_ABI_CWindows_CGlobalization_CIGeographicRegion *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_CodeThreeDigit)(
        __x_ABI_CWindows_CGlobalization_CIGeographicRegion *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_DisplayName)(
        __x_ABI_CWindows_CGlobalization_CIGeographicRegion *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_NativeName)(
        __x_ABI_CWindows_CGlobalization_CIGeographicRegion *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_CurrenciesInUse)(
        __x_ABI_CWindows_CGlobalization_CIGeographicRegion *This,
        __FIVectorView_1_HSTRING **value);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CIGeographicRegionVtbl;

interface __x_ABI_CWindows_CGlobalization_CIGeographicRegion {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CIGeographicRegionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IGeographicRegion methods ***/
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_Code(This,value) (This)->lpVtbl->get_Code(This,value)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_CodeTwoLetter(This,value) (This)->lpVtbl->get_CodeTwoLetter(This,value)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_CodeThreeLetter(This,value) (This)->lpVtbl->get_CodeThreeLetter(This,value)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_CodeThreeDigit(This,value) (This)->lpVtbl->get_CodeThreeDigit(This,value)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_DisplayName(This,value) (This)->lpVtbl->get_DisplayName(This,value)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_NativeName(This,value) (This)->lpVtbl->get_NativeName(This,value)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_CurrenciesInUse(This,value) (This)->lpVtbl->get_CurrenciesInUse(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegion_QueryInterface(__x_ABI_CWindows_CGlobalization_CIGeographicRegion* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CIGeographicRegion_AddRef(__x_ABI_CWindows_CGlobalization_CIGeographicRegion* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CIGeographicRegion_Release(__x_ABI_CWindows_CGlobalization_CIGeographicRegion* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegion_GetIids(__x_ABI_CWindows_CGlobalization_CIGeographicRegion* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegion_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CIGeographicRegion* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegion_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CIGeographicRegion* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IGeographicRegion methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_Code(__x_ABI_CWindows_CGlobalization_CIGeographicRegion* This,HSTRING *value) {
    return This->lpVtbl->get_Code(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_CodeTwoLetter(__x_ABI_CWindows_CGlobalization_CIGeographicRegion* This,HSTRING *value) {
    return This->lpVtbl->get_CodeTwoLetter(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_CodeThreeLetter(__x_ABI_CWindows_CGlobalization_CIGeographicRegion* This,HSTRING *value) {
    return This->lpVtbl->get_CodeThreeLetter(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_CodeThreeDigit(__x_ABI_CWindows_CGlobalization_CIGeographicRegion* This,HSTRING *value) {
    return This->lpVtbl->get_CodeThreeDigit(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_DisplayName(__x_ABI_CWindows_CGlobalization_CIGeographicRegion* This,HSTRING *value) {
    return This->lpVtbl->get_DisplayName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_NativeName(__x_ABI_CWindows_CGlobalization_CIGeographicRegion* This,HSTRING *value) {
    return This->lpVtbl->get_NativeName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_CurrenciesInUse(__x_ABI_CWindows_CGlobalization_CIGeographicRegion* This,__FIVectorView_1_HSTRING **value) {
    return This->lpVtbl->get_CurrenciesInUse(This,value);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_IGeographicRegion IID___x_ABI_CWindows_CGlobalization_CIGeographicRegion
#define IGeographicRegionVtbl __x_ABI_CWindows_CGlobalization_CIGeographicRegionVtbl
#define IGeographicRegion __x_ABI_CWindows_CGlobalization_CIGeographicRegion
#define IGeographicRegion_QueryInterface __x_ABI_CWindows_CGlobalization_CIGeographicRegion_QueryInterface
#define IGeographicRegion_AddRef __x_ABI_CWindows_CGlobalization_CIGeographicRegion_AddRef
#define IGeographicRegion_Release __x_ABI_CWindows_CGlobalization_CIGeographicRegion_Release
#define IGeographicRegion_GetIids __x_ABI_CWindows_CGlobalization_CIGeographicRegion_GetIids
#define IGeographicRegion_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CIGeographicRegion_GetRuntimeClassName
#define IGeographicRegion_GetTrustLevel __x_ABI_CWindows_CGlobalization_CIGeographicRegion_GetTrustLevel
#define IGeographicRegion_get_Code __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_Code
#define IGeographicRegion_get_CodeTwoLetter __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_CodeTwoLetter
#define IGeographicRegion_get_CodeThreeLetter __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_CodeThreeLetter
#define IGeographicRegion_get_CodeThreeDigit __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_CodeThreeDigit
#define IGeographicRegion_get_DisplayName __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_DisplayName
#define IGeographicRegion_get_NativeName __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_NativeName
#define IGeographicRegion_get_CurrenciesInUse __x_ABI_CWindows_CGlobalization_CIGeographicRegion_get_CurrenciesInUse
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CIGeographicRegion_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IGeographicRegionFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory, 0x53425270, 0x77b4, 0x426b, 0x85,0x9f, 0x81,0xe1,0x9d,0x51,0x25,0x46);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("53425270-77b4-426b-859f-81e19d512546")
            IGeographicRegionFactory : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE CreateGeographicRegion(
                    HSTRING region_code,
                    ABI::Windows::Globalization::IGeographicRegion **result) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory, 0x53425270, 0x77b4, 0x426b, 0x85,0x9f, 0x81,0xe1,0x9d,0x51,0x25,0x46)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IGeographicRegionFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateGeographicRegion)(
        __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory *This,
        HSTRING region_code,
        __x_ABI_CWindows_CGlobalization_CIGeographicRegion **result);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactoryVtbl;

interface __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IGeographicRegionFactory methods ***/
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_CreateGeographicRegion(This,region_code,result) (This)->lpVtbl->CreateGeographicRegion(This,region_code,result)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_QueryInterface(__x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_AddRef(__x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_Release(__x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_GetIids(__x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IGeographicRegionFactory methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_CreateGeographicRegion(__x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory* This,HSTRING region_code,__x_ABI_CWindows_CGlobalization_CIGeographicRegion **result) {
    return This->lpVtbl->CreateGeographicRegion(This,region_code,result);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_IGeographicRegionFactory IID___x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory
#define IGeographicRegionFactoryVtbl __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactoryVtbl
#define IGeographicRegionFactory __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory
#define IGeographicRegionFactory_QueryInterface __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_QueryInterface
#define IGeographicRegionFactory_AddRef __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_AddRef
#define IGeographicRegionFactory_Release __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_Release
#define IGeographicRegionFactory_GetIids __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_GetIids
#define IGeographicRegionFactory_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_GetRuntimeClassName
#define IGeographicRegionFactory_GetTrustLevel __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_GetTrustLevel
#define IGeographicRegionFactory_CreateGeographicRegion __x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_CreateGeographicRegion
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CIGeographicRegionFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IGeographicRegionStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics, 0x29e28974, 0x7ad9, 0x4ef4, 0x87,0x99, 0xb3,0xb4,0x4f,0xad,0xec,0x08);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Globalization {
            MIDL_INTERFACE("29e28974-7ad9-4ef4-8799-b3b44fadec08")
            IGeographicRegionStatics : public IInspectable
            {
                virtual HRESULT STDMETHODCALLTYPE IsSupported(
                    HSTRING region_code,
                    boolean *result) = 0;

            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics, 0x29e28974, 0x7ad9, 0x4ef4, 0x87,0x99, 0xb3,0xb4,0x4f,0xad,0xec,0x08)
#endif
#else
typedef struct __x_ABI_CWindows_CGlobalization_CIGeographicRegionStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IGeographicRegionStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *IsSupported)(
        __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics *This,
        HSTRING region_code,
        boolean *result);

    END_INTERFACE
} __x_ABI_CWindows_CGlobalization_CIGeographicRegionStaticsVtbl;

interface __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics {
    CONST_VTBL __x_ABI_CWindows_CGlobalization_CIGeographicRegionStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IGeographicRegionStatics methods ***/
#define __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_IsSupported(This,region_code,result) (This)->lpVtbl->IsSupported(This,region_code,result)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_QueryInterface(__x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_AddRef(__x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_Release(__x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_GetIids(__x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_GetRuntimeClassName(__x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_GetTrustLevel(__x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IGeographicRegionStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_IsSupported(__x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics* This,HSTRING region_code,boolean *result) {
    return This->lpVtbl->IsSupported(This,region_code,result);
}
#endif
#ifdef WIDL_using_Windows_Globalization
#define IID_IGeographicRegionStatics IID___x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics
#define IGeographicRegionStaticsVtbl __x_ABI_CWindows_CGlobalization_CIGeographicRegionStaticsVtbl
#define IGeographicRegionStatics __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics
#define IGeographicRegionStatics_QueryInterface __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_QueryInterface
#define IGeographicRegionStatics_AddRef __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_AddRef
#define IGeographicRegionStatics_Release __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_Release
#define IGeographicRegionStatics_GetIids __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_GetIids
#define IGeographicRegionStatics_GetRuntimeClassName __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_GetRuntimeClassName
#define IGeographicRegionStatics_GetTrustLevel __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_GetTrustLevel
#define IGeographicRegionStatics_IsSupported __x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_IsSupported
#endif /* WIDL_using_Windows_Globalization */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CGlobalization_CIGeographicRegionStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Globalization.Language
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Globalization_Language_DEFINED
#define RUNTIMECLASS_Windows_Globalization_Language_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Globalization_Language[] = {'W','i','n','d','o','w','s','.','G','l','o','b','a','l','i','z','a','t','i','o','n','.','L','a','n','g','u','a','g','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Globalization_Language[] = L"Windows.Globalization.Language";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Globalization_Language[] = {'W','i','n','d','o','w','s','.','G','l','o','b','a','l','i','z','a','t','i','o','n','.','L','a','n','g','u','a','g','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Globalization_Language_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Globalization.GeographicRegion
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Globalization_GeographicRegion_DEFINED
#define RUNTIMECLASS_Windows_Globalization_GeographicRegion_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Globalization_GeographicRegion[] = {'W','i','n','d','o','w','s','.','G','l','o','b','a','l','i','z','a','t','i','o','n','.','G','e','o','g','r','a','p','h','i','c','R','e','g','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Globalization_GeographicRegion[] = L"Windows.Globalization.GeographicRegion";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Globalization_GeographicRegion[] = {'W','i','n','d','o','w','s','.','G','l','o','b','a','l','i','z','a','t','i','o','n','.','G','e','o','g','r','a','p','h','i','c','R','e','g','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Globalization_GeographicRegion_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IIterable<ABI::Windows::Globalization::Language* > interface
 */
#ifndef ____FIIterable_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CGlobalization__CLanguage, 0x48409a10, 0x61b6, 0x5db1, 0xa6,0x9d, 0x8a,0xbc,0x46,0xac,0x60,0x8a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("48409a10-61b6-5db1-a69d-8abc46ac608a")
                IIterable<ABI::Windows::Globalization::Language* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Globalization::Language*, ABI::Windows::Globalization::ILanguage* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CGlobalization__CLanguage, 0x48409a10, 0x61b6, 0x5db1, 0xa6,0x9d, 0x8a,0xbc,0x46,0xac,0x60,0x8a)
#endif
#else
typedef struct __FIIterable_1_Windows__CGlobalization__CLanguageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterable<ABI::Windows::Globalization::Language* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CGlobalization__CLanguage *This,
        __FIIterator_1_Windows__CGlobalization__CLanguage **value);

    END_INTERFACE
} __FIIterable_1_Windows__CGlobalization__CLanguageVtbl;

interface __FIIterable_1_Windows__CGlobalization__CLanguage {
    CONST_VTBL __FIIterable_1_Windows__CGlobalization__CLanguageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CGlobalization__CLanguage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CGlobalization__CLanguage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CGlobalization__CLanguage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CGlobalization__CLanguage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CGlobalization__CLanguage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Globalization::Language* > methods ***/
#define __FIIterable_1_Windows__CGlobalization__CLanguage_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGlobalization__CLanguage_QueryInterface(__FIIterable_1_Windows__CGlobalization__CLanguage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGlobalization__CLanguage_AddRef(__FIIterable_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CGlobalization__CLanguage_Release(__FIIterable_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGlobalization__CLanguage_GetIids(__FIIterable_1_Windows__CGlobalization__CLanguage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(__FIIterable_1_Windows__CGlobalization__CLanguage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGlobalization__CLanguage_GetTrustLevel(__FIIterable_1_Windows__CGlobalization__CLanguage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Globalization::Language* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CGlobalization__CLanguage_First(__FIIterable_1_Windows__CGlobalization__CLanguage* This,__FIIterator_1_Windows__CGlobalization__CLanguage **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_Language IID___FIIterable_1_Windows__CGlobalization__CLanguage
#define IIterable_LanguageVtbl __FIIterable_1_Windows__CGlobalization__CLanguageVtbl
#define IIterable_Language __FIIterable_1_Windows__CGlobalization__CLanguage
#define IIterable_Language_QueryInterface __FIIterable_1_Windows__CGlobalization__CLanguage_QueryInterface
#define IIterable_Language_AddRef __FIIterable_1_Windows__CGlobalization__CLanguage_AddRef
#define IIterable_Language_Release __FIIterable_1_Windows__CGlobalization__CLanguage_Release
#define IIterable_Language_GetIids __FIIterable_1_Windows__CGlobalization__CLanguage_GetIids
#define IIterable_Language_GetRuntimeClassName __FIIterable_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName
#define IIterable_Language_GetTrustLevel __FIIterable_1_Windows__CGlobalization__CLanguage_GetTrustLevel
#define IIterable_Language_First __FIIterable_1_Windows__CGlobalization__CLanguage_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Globalization::Language* > interface
 */
#ifndef ____FIIterator_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CGlobalization__CLanguage, 0x30e99ae6, 0xf414, 0x5243, 0x8d,0xb2, 0xaa,0xb3,0x8e,0xa3,0xf1,0xf1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("30e99ae6-f414-5243-8db2-aab38ea3f1f1")
                IIterator<ABI::Windows::Globalization::Language* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Globalization::Language*, ABI::Windows::Globalization::ILanguage* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CGlobalization__CLanguage, 0x30e99ae6, 0xf414, 0x5243, 0x8d,0xb2, 0xaa,0xb3,0x8e,0xa3,0xf1,0xf1)
#endif
#else
typedef struct __FIIterator_1_Windows__CGlobalization__CLanguageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IIterator<ABI::Windows::Globalization::Language* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CGlobalization__CLanguage *This,
        __x_ABI_CWindows_CGlobalization_CILanguage **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CGlobalization__CLanguage *This,
        WINBOOL *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CGlobalization__CLanguage *This,
        WINBOOL *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CGlobalization__CLanguage *This,
        UINT32 items_size,
        __x_ABI_CWindows_CGlobalization_CILanguage **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CGlobalization__CLanguageVtbl;

interface __FIIterator_1_Windows__CGlobalization__CLanguage {
    CONST_VTBL __FIIterator_1_Windows__CGlobalization__CLanguageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CGlobalization__CLanguage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CGlobalization__CLanguage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CGlobalization__CLanguage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CGlobalization__CLanguage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CGlobalization__CLanguage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Globalization::Language* > methods ***/
#define __FIIterator_1_Windows__CGlobalization__CLanguage_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CGlobalization__CLanguage_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CGlobalization__CLanguage_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CGlobalization__CLanguage_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_QueryInterface(__FIIterator_1_Windows__CGlobalization__CLanguage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGlobalization__CLanguage_AddRef(__FIIterator_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CGlobalization__CLanguage_Release(__FIIterator_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_GetIids(__FIIterator_1_Windows__CGlobalization__CLanguage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(__FIIterator_1_Windows__CGlobalization__CLanguage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_GetTrustLevel(__FIIterator_1_Windows__CGlobalization__CLanguage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Globalization::Language* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_get_Current(__FIIterator_1_Windows__CGlobalization__CLanguage* This,__x_ABI_CWindows_CGlobalization_CILanguage **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_get_HasCurrent(__FIIterator_1_Windows__CGlobalization__CLanguage* This,WINBOOL *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_MoveNext(__FIIterator_1_Windows__CGlobalization__CLanguage* This,WINBOOL *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CGlobalization__CLanguage_GetMany(__FIIterator_1_Windows__CGlobalization__CLanguage* This,UINT32 items_size,__x_ABI_CWindows_CGlobalization_CILanguage **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_Language IID___FIIterator_1_Windows__CGlobalization__CLanguage
#define IIterator_LanguageVtbl __FIIterator_1_Windows__CGlobalization__CLanguageVtbl
#define IIterator_Language __FIIterator_1_Windows__CGlobalization__CLanguage
#define IIterator_Language_QueryInterface __FIIterator_1_Windows__CGlobalization__CLanguage_QueryInterface
#define IIterator_Language_AddRef __FIIterator_1_Windows__CGlobalization__CLanguage_AddRef
#define IIterator_Language_Release __FIIterator_1_Windows__CGlobalization__CLanguage_Release
#define IIterator_Language_GetIids __FIIterator_1_Windows__CGlobalization__CLanguage_GetIids
#define IIterator_Language_GetRuntimeClassName __FIIterator_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName
#define IIterator_Language_GetTrustLevel __FIIterator_1_Windows__CGlobalization__CLanguage_GetTrustLevel
#define IIterator_Language_get_Current __FIIterator_1_Windows__CGlobalization__CLanguage_get_Current
#define IIterator_Language_get_HasCurrent __FIIterator_1_Windows__CGlobalization__CLanguage_get_HasCurrent
#define IIterator_Language_MoveNext __FIIterator_1_Windows__CGlobalization__CLanguage_MoveNext
#define IIterator_Language_GetMany __FIIterator_1_Windows__CGlobalization__CLanguage_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Globalization::Language* > interface
 */
#ifndef ____FIVectorView_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CGlobalization__CLanguage, 0x144b0f3d, 0x2d59, 0x5dd2, 0xb0,0x12, 0x90,0x8e,0xc3,0xe0,0x64,0x35);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("144b0f3d-2d59-5dd2-b012-908ec3e06435")
                IVectorView<ABI::Windows::Globalization::Language* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Globalization::Language*, ABI::Windows::Globalization::ILanguage* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CGlobalization__CLanguage, 0x144b0f3d, 0x2d59, 0x5dd2, 0xb0,0x12, 0x90,0x8e,0xc3,0xe0,0x64,0x35)
#endif
#else
typedef struct __FIVectorView_1_Windows__CGlobalization__CLanguageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVectorView<ABI::Windows::Globalization::Language* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CGlobalization__CLanguage *This,
        UINT32 index,
        __x_ABI_CWindows_CGlobalization_CILanguage **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CGlobalization__CLanguage *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CGlobalization__CLanguage *This,
        __x_ABI_CWindows_CGlobalization_CILanguage *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CGlobalization__CLanguage *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGlobalization_CILanguage **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CGlobalization__CLanguageVtbl;

interface __FIVectorView_1_Windows__CGlobalization__CLanguage {
    CONST_VTBL __FIVectorView_1_Windows__CGlobalization__CLanguageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Globalization::Language* > methods ***/
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CGlobalization__CLanguage_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_QueryInterface(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CGlobalization__CLanguage_AddRef(__FIVectorView_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CGlobalization__CLanguage_Release(__FIVectorView_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_GetIids(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_GetTrustLevel(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Globalization::Language* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_GetAt(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,UINT32 index,__x_ABI_CWindows_CGlobalization_CILanguage **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_get_Size(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_IndexOf(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,__x_ABI_CWindows_CGlobalization_CILanguage *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CGlobalization__CLanguage_GetMany(__FIVectorView_1_Windows__CGlobalization__CLanguage* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGlobalization_CILanguage **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_Language IID___FIVectorView_1_Windows__CGlobalization__CLanguage
#define IVectorView_LanguageVtbl __FIVectorView_1_Windows__CGlobalization__CLanguageVtbl
#define IVectorView_Language __FIVectorView_1_Windows__CGlobalization__CLanguage
#define IVectorView_Language_QueryInterface __FIVectorView_1_Windows__CGlobalization__CLanguage_QueryInterface
#define IVectorView_Language_AddRef __FIVectorView_1_Windows__CGlobalization__CLanguage_AddRef
#define IVectorView_Language_Release __FIVectorView_1_Windows__CGlobalization__CLanguage_Release
#define IVectorView_Language_GetIids __FIVectorView_1_Windows__CGlobalization__CLanguage_GetIids
#define IVectorView_Language_GetRuntimeClassName __FIVectorView_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName
#define IVectorView_Language_GetTrustLevel __FIVectorView_1_Windows__CGlobalization__CLanguage_GetTrustLevel
#define IVectorView_Language_GetAt __FIVectorView_1_Windows__CGlobalization__CLanguage_GetAt
#define IVectorView_Language_get_Size __FIVectorView_1_Windows__CGlobalization__CLanguage_get_Size
#define IVectorView_Language_IndexOf __FIVectorView_1_Windows__CGlobalization__CLanguage_IndexOf
#define IVectorView_Language_GetMany __FIVectorView_1_Windows__CGlobalization__CLanguage_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<ABI::Windows::Globalization::Language* > interface
 */
#ifndef ____FIVector_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__
#define ____FIVector_1_Windows__CGlobalization__CLanguage_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_Windows__CGlobalization__CLanguage, 0xdcf2525a, 0x42c0, 0x501d, 0x9f,0xcb, 0x47,0x1f,0xae,0x06,0x03,0x96);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("dcf2525a-42c0-501d-9fcb-471fae060396")
                IVector<ABI::Windows::Globalization::Language* > : IVector_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Globalization::Language*, ABI::Windows::Globalization::ILanguage* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_Windows__CGlobalization__CLanguage, 0xdcf2525a, 0x42c0, 0x501d, 0x9f,0xcb, 0x47,0x1f,0xae,0x06,0x03,0x96)
#endif
#else
typedef struct __FIVector_1_Windows__CGlobalization__CLanguageVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IVector<ABI::Windows::Globalization::Language* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        UINT32 index,
        __x_ABI_CWindows_CGlobalization_CILanguage **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        __FIVectorView_1_Windows__CGlobalization__CLanguage **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        __x_ABI_CWindows_CGlobalization_CILanguage *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        UINT32 index,
        __x_ABI_CWindows_CGlobalization_CILanguage *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        UINT32 index,
        __x_ABI_CWindows_CGlobalization_CILanguage *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        __x_ABI_CWindows_CGlobalization_CILanguage *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAtEnd)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CGlobalization_CILanguage **items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_Windows__CGlobalization__CLanguage *This,
        UINT32 count,
        __x_ABI_CWindows_CGlobalization_CILanguage **items);

    END_INTERFACE
} __FIVector_1_Windows__CGlobalization__CLanguageVtbl;

interface __FIVector_1_Windows__CGlobalization__CLanguage {
    CONST_VTBL __FIVector_1_Windows__CGlobalization__CLanguageVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_Windows__CGlobalization__CLanguage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_Windows__CGlobalization__CLanguage_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_Windows__CGlobalization__CLanguage_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_Windows__CGlobalization__CLanguage_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_Windows__CGlobalization__CLanguage_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<ABI::Windows::Globalization::Language* > methods ***/
#define __FIVector_1_Windows__CGlobalization__CLanguage_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_Windows__CGlobalization__CLanguage_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_Windows__CGlobalization__CLanguage_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_Windows__CGlobalization__CLanguage_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_Windows__CGlobalization__CLanguage_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_QueryInterface(__FIVector_1_Windows__CGlobalization__CLanguage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CGlobalization__CLanguage_AddRef(__FIVector_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVector_1_Windows__CGlobalization__CLanguage_Release(__FIVector_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_GetIids(__FIVector_1_Windows__CGlobalization__CLanguage* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName(__FIVector_1_Windows__CGlobalization__CLanguage* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_GetTrustLevel(__FIVector_1_Windows__CGlobalization__CLanguage* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<ABI::Windows::Globalization::Language* > methods ***/
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_GetAt(__FIVector_1_Windows__CGlobalization__CLanguage* This,UINT32 index,__x_ABI_CWindows_CGlobalization_CILanguage **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_get_Size(__FIVector_1_Windows__CGlobalization__CLanguage* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_GetView(__FIVector_1_Windows__CGlobalization__CLanguage* This,__FIVectorView_1_Windows__CGlobalization__CLanguage **value) {
    return This->lpVtbl->GetView(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_IndexOf(__FIVector_1_Windows__CGlobalization__CLanguage* This,__x_ABI_CWindows_CGlobalization_CILanguage *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_SetAt(__FIVector_1_Windows__CGlobalization__CLanguage* This,UINT32 index,__x_ABI_CWindows_CGlobalization_CILanguage *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_InsertAt(__FIVector_1_Windows__CGlobalization__CLanguage* This,UINT32 index,__x_ABI_CWindows_CGlobalization_CILanguage *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_RemoveAt(__FIVector_1_Windows__CGlobalization__CLanguage* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_Append(__FIVector_1_Windows__CGlobalization__CLanguage* This,__x_ABI_CWindows_CGlobalization_CILanguage *value) {
    return This->lpVtbl->Append(This,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_RemoveAtEnd(__FIVector_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_Clear(__FIVector_1_Windows__CGlobalization__CLanguage* This) {
    return This->lpVtbl->Clear(This);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_GetMany(__FIVector_1_Windows__CGlobalization__CLanguage* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CGlobalization_CILanguage **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static __WIDL_INLINE HRESULT __FIVector_1_Windows__CGlobalization__CLanguage_ReplaceAll(__FIVector_1_Windows__CGlobalization__CLanguage* This,UINT32 count,__x_ABI_CWindows_CGlobalization_CILanguage **items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_Language IID___FIVector_1_Windows__CGlobalization__CLanguage
#define IVector_LanguageVtbl __FIVector_1_Windows__CGlobalization__CLanguageVtbl
#define IVector_Language __FIVector_1_Windows__CGlobalization__CLanguage
#define IVector_Language_QueryInterface __FIVector_1_Windows__CGlobalization__CLanguage_QueryInterface
#define IVector_Language_AddRef __FIVector_1_Windows__CGlobalization__CLanguage_AddRef
#define IVector_Language_Release __FIVector_1_Windows__CGlobalization__CLanguage_Release
#define IVector_Language_GetIids __FIVector_1_Windows__CGlobalization__CLanguage_GetIids
#define IVector_Language_GetRuntimeClassName __FIVector_1_Windows__CGlobalization__CLanguage_GetRuntimeClassName
#define IVector_Language_GetTrustLevel __FIVector_1_Windows__CGlobalization__CLanguage_GetTrustLevel
#define IVector_Language_GetAt __FIVector_1_Windows__CGlobalization__CLanguage_GetAt
#define IVector_Language_get_Size __FIVector_1_Windows__CGlobalization__CLanguage_get_Size
#define IVector_Language_GetView __FIVector_1_Windows__CGlobalization__CLanguage_GetView
#define IVector_Language_IndexOf __FIVector_1_Windows__CGlobalization__CLanguage_IndexOf
#define IVector_Language_SetAt __FIVector_1_Windows__CGlobalization__CLanguage_SetAt
#define IVector_Language_InsertAt __FIVector_1_Windows__CGlobalization__CLanguage_InsertAt
#define IVector_Language_RemoveAt __FIVector_1_Windows__CGlobalization__CLanguage_RemoveAt
#define IVector_Language_Append __FIVector_1_Windows__CGlobalization__CLanguage_Append
#define IVector_Language_RemoveAtEnd __FIVector_1_Windows__CGlobalization__CLanguage_RemoveAtEnd
#define IVector_Language_Clear __FIVector_1_Windows__CGlobalization__CLanguage_Clear
#define IVector_Language_GetMany __FIVector_1_Windows__CGlobalization__CLanguage_GetMany
#define IVector_Language_ReplaceAll __FIVector_1_Windows__CGlobalization__CLanguage_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_Windows__CGlobalization__CLanguage_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_globalization_h__ */
