template<template<int> typename> struct Ti;
template<template<int...> typename> struct TPi;
template<template<int, int...> typename> struct TiPi;
template<template<int..., int...> typename> struct TPiPi;
template<typename T, template<T> typename> struct tT0;
template<template<typename T, T> typename> struct Tt0;
template<template<typename> typename> struct Tt;
template<template<typename, typename...> typename> struct TtPt;
template<int> struct i;
template<int, int = 0> struct iDi;
template<int, int> struct ii;
template<int...> struct Pi;
template<int, int, int...> struct iiPi;
template<int, typename = int> struct iDt;
template<int, typename> struct it;
template<typename T, T v> struct t0;
template<typename...> struct Pt;
namespace IntParam {
using ok = Pt<Ti<i>,
Ti<iDi>,
Ti<Pi>,
Ti<iDt>>;
using err1 = Ti<ii>; using err2 = Ti<iiPi>; using err3 = Ti<t0>; using err4 = Ti<it>; }
namespace IntPackParam {
using ok = TPi<Pi>;
using ok_compat = Pt<TPi<i>, TPi<iDi>, TPi<ii>, TPi<iiPi>>;
using err1 = TPi<t0>; using err2 = TPi<iDt>; using err3 = TPi<it>; }
namespace IntAndPackParam {
using ok = TiPi<Pi>;
using ok_compat = Pt<TiPi<ii>, TiPi<iDi>, TiPi<iiPi>>;
using err = TiPi<iDi>;
}
namespace DependentType {
using ok = Pt<tT0<int, i>, tT0<int, iDi>>;
using err1 = tT0<int, ii>; using err2 = tT0<short, i>; using err2a = tT0<long long, i>; using err2b = tT0<void*, i>; using err3 = tT0<short, t0>;
using ok2 = Tt0<t0>;
using err4 = Tt0<it>; }
namespace Auto {
template<template<int> typename T> struct TInt {};
template<template<int*> typename T> struct TIntPtr {};
template<template<auto> typename T> struct TAuto {};
template<template<auto*> typename T> struct TAutoPtr {};
template<template<decltype(auto)> typename T> struct TDecltypeAuto {};
template<auto> struct Auto;
template<auto*> struct AutoPtr;
template<decltype(auto)> struct DecltypeAuto;
template<int> struct Int;
template<int*> struct IntPtr;
TInt<Auto> ia;
TInt<AutoPtr> iap; TInt<DecltypeAuto> ida;
TInt<Int> ii;
TInt<IntPtr> iip;
TIntPtr<Auto> ipa;
TIntPtr<AutoPtr> ipap;
TIntPtr<DecltypeAuto> ipda;
TIntPtr<Int> ipi; TIntPtr<IntPtr> ipip;
TAuto<Auto> aa;
TAuto<AutoPtr> aap; TAuto<Int> ai; TAuto<IntPtr> aip;
TAutoPtr<Auto> apa;
TAutoPtr<AutoPtr> apap;
TAutoPtr<Int> api; TAutoPtr<IntPtr> apip;
TDecltypeAuto<DecltypeAuto> dada;
TDecltypeAuto<Int> dai; TDecltypeAuto<IntPtr> daip;
TAuto<DecltypeAuto> ada;
TAutoPtr<DecltypeAuto> apda;
TDecltypeAuto<Auto> daa;
TDecltypeAuto<AutoPtr> daap;
int n;
template<auto A, decltype(A) B = &n> struct SubstFailure;
TInt<SubstFailure> isf; TIntPtr<SubstFailure> ipsf;
}