diff --git a/.metadata b/.metadata index 5edc66d..4ebc96a 100644 --- a/.metadata +++ b/.metadata @@ -21,6 +21,9 @@ migration: - platform: ios create_revision: 7482962148e8d758338d8a28f589f317e1e42ba4 base_revision: 7482962148e8d758338d8a28f589f317e1e42ba4 + - platform: linux + create_revision: 7482962148e8d758338d8a28f589f317e1e42ba4 + base_revision: 7482962148e8d758338d8a28f589f317e1e42ba4 # User provided section diff --git a/README.md b/README.md index 8b37ef4..2afc804 100644 --- a/README.md +++ b/README.md @@ -90,3 +90,35 @@ For help getting started with Flutter, view our [online documentation](https://flutter.dev/docs), which offers tutorials, samples, guidance on mobile development, and a full API reference. + +# Developer Notes + +You'll get an error with Eiger, so watch out. + +``` +$ make +finition.hpp:17:10: fatal error: Eigen/Dense: No such file or directory + 17 | #include + | ^~~~~~~~~~~~~ +compilation terminated. +``` + + +```shell +$ sudo at install -y libeigen3-dev +$ sudo ln -sf /usr/include/eigen3/Eigen /usr/include/Eigen +``` + +git clone --single-branch --branch n6.1 https://git.ffmpeg.org/ffmpeg.git + +Can I expose `FILE` in dart? + +Yea...no! https://github.com/dart-lang/sdk/issues/4160 + +Instead, I'll have to load the data in directly. + +buliding open mvg needs to be done with the PIC flag + +```shell +$ cmake ../src -DCMAKE_INSTALL_PREFIX="../../openMVG/build/_install" -DCMAKE_POSITION_INDEPENDENT_CODE=ON +``` \ No newline at end of file diff --git a/archimedes_mobile_lib.dart b/archimedes_mobile_lib.dart new file mode 100644 index 0000000..3bfb47f --- /dev/null +++ b/archimedes_mobile_lib.dart @@ -0,0 +1,4180 @@ +// AUTO GENERATED FILE, DO NOT EDIT. +// +// Generated by `package:ffigen`. +// ignore_for_file: type=lint +import 'dart:ffi' as ffi; + +final class __mbstate_t extends ffi.Struct { + @ffi.Int() + external int __count; + + external UnnamedUnion1 __value; +} + +final class UnnamedUnion1 extends ffi.Union { + @ffi.UnsignedInt() + external int __wch; + + @ffi.Array.multi([4]) + external ffi.Array __wchb; +} + +final class _IO_FILE extends ffi.Struct { + @ffi.Int() + external int _flags; + + external ffi.Pointer _IO_read_ptr; + + external ffi.Pointer _IO_read_end; + + external ffi.Pointer _IO_read_base; + + external ffi.Pointer _IO_write_base; + + external ffi.Pointer _IO_write_ptr; + + external ffi.Pointer _IO_write_end; + + external ffi.Pointer _IO_buf_base; + + external ffi.Pointer _IO_buf_end; + + external ffi.Pointer _IO_save_base; + + external ffi.Pointer _IO_backup_base; + + external ffi.Pointer _IO_save_end; + + external ffi.Pointer<_IO_marker> _markers; + + external ffi.Pointer<_IO_FILE> _chain; + + @ffi.Int() + external int _fileno; + + @ffi.Int() + external int _flags2; + + @__off_t() + external int _old_offset; + + @ffi.UnsignedShort() + external int _cur_column; + + @ffi.SignedChar() + external int _vtable_offset; + + @ffi.Array.multi([1]) + external ffi.Array _shortbuf; + + external ffi.Pointer<_IO_lock_t> _lock; + + @__off64_t() + external int _offset; + + external ffi.Pointer<_IO_codecvt> _codecvt; + + external ffi.Pointer<_IO_wide_data> _wide_data; + + external ffi.Pointer<_IO_FILE> _freeres_list; + + external ffi.Pointer _freeres_buf; + + @ffi.Size() + external int __pad5; + + @ffi.Int() + external int _mode; + + @ffi.Array.multi([20]) + external ffi.Array _unused2; +} + +final class _IO_marker extends ffi.Opaque {} + +typedef __off_t = ffi.Long; +typedef _IO_lock_t = ffi.Void; +typedef __off64_t = ffi.Long; + +final class _IO_codecvt extends ffi.Opaque {} + +final class _IO_wide_data extends ffi.Opaque {} + +final class max_align_t extends ffi.Opaque {} + +final class sched_param extends ffi.Struct { + @ffi.Int() + external int sched_priority; +} + +final class cpu_set_t extends ffi.Struct { + @ffi.Array.multi([16]) + external ffi.Array<__cpu_mask> __bits; +} + +typedef __cpu_mask = ffi.UnsignedLong; + +final class timex extends ffi.Opaque {} + +final class tm extends ffi.Struct { + @ffi.Int() + external int tm_sec; + + @ffi.Int() + external int tm_min; + + @ffi.Int() + external int tm_hour; + + @ffi.Int() + external int tm_mday; + + @ffi.Int() + external int tm_mon; + + @ffi.Int() + external int tm_year; + + @ffi.Int() + external int tm_wday; + + @ffi.Int() + external int tm_yday; + + @ffi.Int() + external int tm_isdst; + + @ffi.Long() + external int tm_gmtoff; + + external ffi.Pointer tm_zone; +} + +final class itimerspec extends ffi.Struct { + external timespec it_interval; + + external timespec it_value; +} + +final class timespec extends ffi.Struct { + @__time_t() + external int tv_sec; + + @__syscall_slong_t() + external int tv_nsec; +} + +typedef __time_t = ffi.Long; +typedef __syscall_slong_t = ffi.Long; + +final class sigevent extends ffi.Opaque {} + +final class __jmp_buf_tag extends ffi.Struct { + @ffi.Array.multi([8]) + external ffi.Array __jmpbuf; + + @ffi.Int() + external int __mask_was_saved; + + external __sigset_t __saved_mask; +} + +final class __sigset_t extends ffi.Struct { + @ffi.Array.multi([16]) + external ffi.Array __val; +} + +final class _pthread_cleanup_buffer extends ffi.Struct { + external ffi + .Pointer)>> + __routine; + + external ffi.Pointer __arg; + + @ffi.Int() + external int __canceltype; + + external ffi.Pointer<_pthread_cleanup_buffer> __prev; +} + +final class _Frame extends ffi.Struct { + external ffi.Pointer stream; + + @ffi.Int() + external int w; + + @ffi.Int() + external int h; + + @ffi.Int() + external int depth; +} + +typedef FILE = _IO_FILE; + +const int PTHREAD_CREATE_JOINABLE = 0; + +const int PTHREAD_CREATE_DETACHED = 1; + +const int PTHREAD_MUTEX_TIMED_NP = 0; + +const int PTHREAD_MUTEX_RECURSIVE_NP = 1; + +const int PTHREAD_MUTEX_ERRORCHECK_NP = 2; + +const int PTHREAD_MUTEX_ADAPTIVE_NP = 3; + +const int PTHREAD_MUTEX_NORMAL = 0; + +const int PTHREAD_MUTEX_RECURSIVE = 1; + +const int PTHREAD_MUTEX_ERRORCHECK = 2; + +const int PTHREAD_MUTEX_DEFAULT = 0; + +const int PTHREAD_MUTEX_FAST_NP = 0; + +const int PTHREAD_MUTEX_STALLED = 0; + +const int PTHREAD_MUTEX_STALLED_NP = 0; + +const int PTHREAD_MUTEX_ROBUST = 1; + +const int PTHREAD_MUTEX_ROBUST_NP = 1; + +const int PTHREAD_PRIO_NONE = 0; + +const int PTHREAD_PRIO_INHERIT = 1; + +const int PTHREAD_PRIO_PROTECT = 2; + +const int PTHREAD_RWLOCK_PREFER_READER_NP = 0; + +const int PTHREAD_RWLOCK_PREFER_WRITER_NP = 1; + +const int PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP = 2; + +const int PTHREAD_RWLOCK_DEFAULT_NP = 0; + +const int PTHREAD_INHERIT_SCHED = 0; + +const int PTHREAD_EXPLICIT_SCHED = 1; + +const int PTHREAD_SCOPE_SYSTEM = 0; + +const int PTHREAD_SCOPE_PROCESS = 1; + +const int PTHREAD_PROCESS_PRIVATE = 0; + +const int PTHREAD_PROCESS_SHARED = 1; + +const int PTHREAD_CANCEL_ENABLE = 0; + +const int PTHREAD_CANCEL_DISABLE = 1; + +const int PTHREAD_CANCEL_DEFERRED = 0; + +const int PTHREAD_CANCEL_ASYNCHRONOUS = 1; + +const int __ISwupper = 0; + +const int __ISwlower = 1; + +const int __ISwalpha = 2; + +const int __ISwdigit = 3; + +const int __ISwxdigit = 4; + +const int __ISwspace = 5; + +const int __ISwprint = 6; + +const int __ISwgraph = 7; + +const int __ISwblank = 8; + +const int __ISwcntrl = 9; + +const int __ISwpunct = 10; + +const int __ISwalnum = 11; + +const int _ISwupper = 16777216; + +const int _ISwlower = 33554432; + +const int _ISwalpha = 67108864; + +const int _ISwdigit = 134217728; + +const int _ISwxdigit = 268435456; + +const int _ISwspace = 536870912; + +const int _ISwprint = 1073741824; + +const int _ISwgraph = -2147483648; + +const int _ISwblank = 65536; + +const int _ISwcntrl = 131072; + +const int _ISwpunct = 262144; + +const int _ISwalnum = 524288; + +const int EIGEN_WORLD_VERSION = 3; + +const int EIGEN_MAJOR_VERSION = 4; + +const int EIGEN_MINOR_VERSION = 0; + +const int EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION = 0; + +const int EIGEN_MAX_CPP_VER = 99; + +const int EIGEN_FAST_MATH = 1; + +const int EIGEN_STACK_ALLOCATION_LIMIT = 131072; + +const int EIGEN_COMP_GNUC = 42; + +const int EIGEN_COMP_CLANG = 1600; + +const int EIGEN_COMP_CASTXML = 0; + +const int EIGEN_COMP_LLVM = 1; + +const int EIGEN_COMP_ICC = 0; + +const int EIGEN_COMP_MINGW = 0; + +const int EIGEN_COMP_SUNCC = 0; + +const int EIGEN_COMP_MSVC = 0; + +const int EIGEN_COMP_NVCC = 0; + +const int EIGEN_COMP_MSVC_LANG = 0; + +const int EIGEN_COMP_MSVC_STRICT = 0; + +const int EIGEN_COMP_IBM = 0; + +const int EIGEN_COMP_PGI = 0; + +const int EIGEN_COMP_ARM = 0; + +const int EIGEN_COMP_EMSCRIPTEN = 0; + +const int EIGEN_COMP_GNUC_STRICT = 0; + +const int EIGEN_GCC3_OR_OLDER = 0; + +const int EIGEN_ARCH_x86_64 = 1; + +const int EIGEN_ARCH_i386 = 0; + +const int EIGEN_ARCH_i386_OR_x86_64 = 1; + +const int EIGEN_ARCH_ARM = 0; + +const int EIGEN_ARCH_ARM64 = 0; + +const int EIGEN_ARCH_ARM_OR_ARM64 = 0; + +const int EIGEN_ARCH_ARMV8 = 0; + +const int EIGEN_ARCH_MIPS = 0; + +const int EIGEN_ARCH_SPARC = 0; + +const int EIGEN_ARCH_IA64 = 0; + +const int EIGEN_ARCH_PPC = 0; + +const int EIGEN_OS_UNIX = 1; + +const int EIGEN_OS_LINUX = 1; + +const int EIGEN_OS_ANDROID = 0; + +const int EIGEN_OS_GNULINUX = 1; + +const int EIGEN_OS_BSD = 0; + +const int EIGEN_OS_MAC = 0; + +const int EIGEN_OS_QNX = 0; + +const int EIGEN_OS_WIN = 0; + +const int EIGEN_OS_WIN64 = 0; + +const int EIGEN_OS_WINCE = 0; + +const int EIGEN_OS_CYGWIN = 0; + +const int EIGEN_OS_WIN_STRICT = 0; + +const int EIGEN_OS_SUN = 0; + +const int EIGEN_OS_SOLARIS = 0; + +const int EIGEN_CUDA_SDK_VER = 0; + +const int EIGEN_SAFE_TO_USE_STANDARD_ASSERT_MACRO = 1; + +const int EIGEN_HAS_STATIC_ARRAY_TEMPLATE = 1; + +const int EIGEN_CPLUSPLUS = 201703; + +const int EIGEN_COMP_CXXVER = 17; + +const int EIGEN_HAS_CXX14_VARIABLE_TEMPLATES = 1; + +const int EIGEN_HAS_CXX11 = 1; + +const int EIGEN_HAS_CXX14 = 1; + +const int EIGEN_HAS_RVALUE_REFERENCES = 1; + +const int _REQUIRES_FREESTANDING_H = 1; + +const int _GLIBCXX_CXX_CONFIG_H = 1; + +const int _GLIBCXX_RELEASE = 13; + +const int __GLIBCXX__ = 20230913; + +const int _GLIBCXX_HAVE_ATTRIBUTE_VISIBILITY = 1; + +const int _GLIBCXX_USE_DEPRECATED = 1; + +const int _GLIBCXX_NOEXCEPT_QUAL = 1; + +const int _GLIBCXX_EXTERN_TEMPLATE = 1; + +const int _GLIBCXX_USE_DUAL_ABI = 1; + +const int _GLIBCXX_USE_CXX11_ABI = 1; + +const int _GLIBCXX_INLINE_VERSION = 0; + +const int _GLIBCXX_HAVE_IS_CONSTANT_EVALUATED = 1; + +const int _GLIBCXX_VERBOSE_ASSERT = 1; + +const int _GLIBCXX_USE_ALLOCATOR_NEW = 1; + +const int _GLIBCXX_OS_DEFINES = 1; + +const int __NO_CTYPE = 1; + +const int _FEATURES_H = 1; + +const int _ISOC95_SOURCE = 1; + +const int _ISOC99_SOURCE = 1; + +const int _ISOC11_SOURCE = 1; + +const int _ISOC2X_SOURCE = 1; + +const int _POSIX_SOURCE = 1; + +const int _POSIX_C_SOURCE = 200809; + +const int _XOPEN_SOURCE = 700; + +const int _XOPEN_SOURCE_EXTENDED = 1; + +const int _LARGEFILE64_SOURCE = 1; + +const int _DEFAULT_SOURCE = 1; + +const int _ATFILE_SOURCE = 1; + +const int _DYNAMIC_STACK_SIZE_SOURCE = 1; + +const int __GLIBC_USE_ISOC2X = 1; + +const int __USE_ISOC11 = 1; + +const int __USE_ISOC99 = 1; + +const int __USE_ISOC95 = 1; + +const int __USE_ISOCXX11 = 1; + +const int __USE_POSIX = 1; + +const int __USE_POSIX2 = 1; + +const int __USE_POSIX199309 = 1; + +const int __USE_POSIX199506 = 1; + +const int __USE_XOPEN2K = 1; + +const int __USE_XOPEN2K8 = 1; + +const int __USE_XOPEN = 1; + +const int __USE_XOPEN_EXTENDED = 1; + +const int __USE_UNIX98 = 1; + +const int _LARGEFILE_SOURCE = 1; + +const int __USE_XOPEN2K8XSI = 1; + +const int __USE_XOPEN2KXSI = 1; + +const int __USE_LARGEFILE = 1; + +const int __USE_LARGEFILE64 = 1; + +const int __WORDSIZE = 64; + +const int __WORDSIZE_TIME64_COMPAT32 = 1; + +const int __SYSCALL_WORDSIZE = 64; + +const int __TIMESIZE = 64; + +const int __USE_MISC = 1; + +const int __USE_ATFILE = 1; + +const int __USE_DYNAMIC_STACK_SIZE = 1; + +const int __USE_GNU = 1; + +const int __USE_FORTIFY_LEVEL = 0; + +const int __GLIBC_USE_DEPRECATED_GETS = 0; + +const int __GLIBC_USE_DEPRECATED_SCANF = 0; + +const int __GLIBC_USE_C2X_STRTOL = 1; + +const int _STDC_PREDEF_H = 1; + +const int __STDC_IEC_559__ = 1; + +const int __STDC_IEC_60559_BFP__ = 201404; + +const int __STDC_IEC_559_COMPLEX__ = 1; + +const int __STDC_IEC_60559_COMPLEX__ = 201404; + +const int __STDC_ISO_10646__ = 201706; + +const int __GNU_LIBRARY__ = 6; + +const int __GLIBC__ = 2; + +const int __GLIBC_MINOR__ = 38; + +const int _SYS_CDEFS_H = 1; + +const int __THROW = 1; + +const int __THROWNL = 1; + +const int __glibc_c99_flexarr_available = 1; + +const int __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI = 0; + +const int __HAVE_GENERIC_SELECTION = 0; + +const int _GLIBCXX_NO_OBSOLETE_ISINF_ISNAN_DYNAMIC = 1; + +const int _GLIBCXX_HAVE_FLOAT128_MATH = 1; + +const int _GLIBCXX_GTHREAD_USE_WEAK = 0; + +const int _GLIBCXX_CPU_DEFINES = 1; + +const int _GLIBCXX_USE_WEAK_REF = 1; + +const int _GLIBCXX_USE_STD_SPEC_FUNCS = 1; + +const int _GLIBCXX_FAST_MATH = 0; + +const int _GLIBCXX_USE_C99_MATH = 1; + +const int _GLIBCXX_USE_C99_COMPLEX = 1; + +const int _GLIBCXX_USE_C99_STDIO = 1; + +const int _GLIBCXX_USE_C99_STDLIB = 1; + +const int _GLIBCXX_USE_C99_WCHAR = 1; + +const int _GLIBCXX_USE_FLOAT128 = 1; + +const int _GLIBCXX_FLOAT_IS_IEEE_BINARY32 = 1; + +const int _GLIBCXX_DOUBLE_IS_IEEE_BINARY64 = 1; + +const int _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP = 1; + +const int _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE = 1; + +const int _GLIBCXX_HAVE_BUILTIN_IS_SAME = 1; + +const int _GLIBCXX_HAVE_BUILTIN_LAUNDER = 1; + +const int _PSTL_VERSION = 12000; + +const int _PSTL_VERSION_MAJOR = 12; + +const int _PSTL_VERSION_MINOR = 0; + +const int _PSTL_VERSION_PATCH = 0; + +const int _PSTL_USAGE_WARNINGS = 0; + +const int _PSTL_GCC_VERSION = 40201; + +const int _PSTL_CLANG_VERSION = 160006; + +const int _PSTL_UDR_PRESENT = 0; + +const String _PSTL_PRAGMA_LOCATION = ' [Parallel STL message]: '; + +const int _GLIBCXX_HAVE_ACOSF = 1; + +const int _GLIBCXX_HAVE_ACOSL = 1; + +const int _GLIBCXX_HAVE_ALIGNED_ALLOC = 1; + +const int _GLIBCXX_HAVE_ARC4RANDOM = 1; + +const int _GLIBCXX_HAVE_ARPA_INET_H = 1; + +const int _GLIBCXX_HAVE_ASINF = 1; + +const int _GLIBCXX_HAVE_ASINL = 1; + +const int _GLIBCXX_HAVE_AS_SYMVER_DIRECTIVE = 1; + +const int _GLIBCXX_HAVE_ATAN2F = 1; + +const int _GLIBCXX_HAVE_ATAN2L = 1; + +const int _GLIBCXX_HAVE_ATANF = 1; + +const int _GLIBCXX_HAVE_ATANL = 1; + +const int _GLIBCXX_HAVE_ATOMIC_LOCK_POLICY = 1; + +const int _GLIBCXX_HAVE_AT_QUICK_EXIT = 1; + +const int _GLIBCXX_HAVE_CEILF = 1; + +const int _GLIBCXX_HAVE_CEILL = 1; + +const int _GLIBCXX_HAVE_COMPLEX_H = 1; + +const int _GLIBCXX_HAVE_COSF = 1; + +const int _GLIBCXX_HAVE_COSHF = 1; + +const int _GLIBCXX_HAVE_COSHL = 1; + +const int _GLIBCXX_HAVE_COSL = 1; + +const int _GLIBCXX_HAVE_DECL_STRNLEN = 1; + +const int _GLIBCXX_HAVE_DIRENT_H = 1; + +const int _GLIBCXX_HAVE_DIRFD = 1; + +const int _GLIBCXX_HAVE_DLFCN_H = 1; + +const int _GLIBCXX_HAVE_ENDIAN_H = 1; + +const int _GLIBCXX_HAVE_EXCEPTION_PTR_SINCE_GCC46 = 1; + +const int _GLIBCXX_HAVE_EXECINFO_H = 1; + +const int _GLIBCXX_HAVE_EXPF = 1; + +const int _GLIBCXX_HAVE_EXPL = 1; + +const int _GLIBCXX_HAVE_FABSF = 1; + +const int _GLIBCXX_HAVE_FABSL = 1; + +const int _GLIBCXX_HAVE_FCNTL_H = 1; + +const int _GLIBCXX_HAVE_FDOPENDIR = 1; + +const int _GLIBCXX_HAVE_FENV_H = 1; + +const int _GLIBCXX_HAVE_FINITE = 1; + +const int _GLIBCXX_HAVE_FINITEF = 1; + +const int _GLIBCXX_HAVE_FINITEL = 1; + +const int _GLIBCXX_HAVE_FLOAT_H = 1; + +const int _GLIBCXX_HAVE_FLOORF = 1; + +const int _GLIBCXX_HAVE_FLOORL = 1; + +const int _GLIBCXX_HAVE_FMODF = 1; + +const int _GLIBCXX_HAVE_FMODL = 1; + +const int _GLIBCXX_HAVE_FREXPF = 1; + +const int _GLIBCXX_HAVE_FREXPL = 1; + +const int _GLIBCXX_HAVE_GETENTROPY = 1; + +const int _GLIBCXX_HAVE_GETIPINFO = 1; + +const int _GLIBCXX_HAVE_GETS = 1; + +const int _GLIBCXX_HAVE_HYPOT = 1; + +const int _GLIBCXX_HAVE_HYPOTF = 1; + +const int _GLIBCXX_HAVE_HYPOTL = 1; + +const int _GLIBCXX_HAVE_ICONV = 1; + +const int _GLIBCXX_HAVE_INTTYPES_H = 1; + +const int _GLIBCXX_HAVE_ISINFF = 1; + +const int _GLIBCXX_HAVE_ISINFL = 1; + +const int _GLIBCXX_HAVE_ISNANF = 1; + +const int _GLIBCXX_HAVE_ISNANL = 1; + +const int _GLIBCXX_HAVE_ISWBLANK = 1; + +const int _GLIBCXX_HAVE_LC_MESSAGES = 1; + +const int _GLIBCXX_HAVE_LDEXPF = 1; + +const int _GLIBCXX_HAVE_LDEXPL = 1; + +const int _GLIBCXX_HAVE_LIBINTL_H = 1; + +const int _GLIBCXX_HAVE_LIMIT_AS = 1; + +const int _GLIBCXX_HAVE_LIMIT_DATA = 1; + +const int _GLIBCXX_HAVE_LIMIT_FSIZE = 1; + +const int _GLIBCXX_HAVE_LIMIT_RSS = 1; + +const int _GLIBCXX_HAVE_LIMIT_VMEM = 0; + +const int _GLIBCXX_HAVE_LINK = 1; + +const int _GLIBCXX_HAVE_LINK_H = 1; + +const int _GLIBCXX_HAVE_LINUX_FUTEX = 1; + +const int _GLIBCXX_HAVE_LINUX_RANDOM_H = 1; + +const int _GLIBCXX_HAVE_LINUX_TYPES_H = 1; + +const int _GLIBCXX_HAVE_LOCALE_H = 1; + +const int _GLIBCXX_HAVE_LOG10F = 1; + +const int _GLIBCXX_HAVE_LOG10L = 1; + +const int _GLIBCXX_HAVE_LOGF = 1; + +const int _GLIBCXX_HAVE_LOGL = 1; + +const int _GLIBCXX_HAVE_MBSTATE_T = 1; + +const int _GLIBCXX_HAVE_MEMALIGN = 1; + +const int _GLIBCXX_HAVE_MEMORY_H = 1; + +const int _GLIBCXX_HAVE_MODF = 1; + +const int _GLIBCXX_HAVE_MODFF = 1; + +const int _GLIBCXX_HAVE_MODFL = 1; + +const int _GLIBCXX_HAVE_NETDB_H = 1; + +const int _GLIBCXX_HAVE_NETINET_IN_H = 1; + +const int _GLIBCXX_HAVE_NETINET_TCP_H = 1; + +const int _GLIBCXX_HAVE_OPENAT = 1; + +const int _GLIBCXX_HAVE_POLL = 1; + +const int _GLIBCXX_HAVE_POLL_H = 1; + +const int _GLIBCXX_HAVE_POSIX_MEMALIGN = 1; + +const int _GLIBCXX_HAVE_POSIX_SEMAPHORE = 1; + +const int _GLIBCXX_HAVE_POWF = 1; + +const int _GLIBCXX_HAVE_POWL = 1; + +const int _GLIBCXX_HAVE_QUICK_EXIT = 1; + +const int _GLIBCXX_HAVE_READLINK = 1; + +const int _GLIBCXX_HAVE_SECURE_GETENV = 1; + +const int _GLIBCXX_HAVE_SETENV = 1; + +const int _GLIBCXX_HAVE_SINCOS = 1; + +const int _GLIBCXX_HAVE_SINCOSF = 1; + +const int _GLIBCXX_HAVE_SINCOSL = 1; + +const int _GLIBCXX_HAVE_SINF = 1; + +const int _GLIBCXX_HAVE_SINHF = 1; + +const int _GLIBCXX_HAVE_SINHL = 1; + +const int _GLIBCXX_HAVE_SINL = 1; + +const int _GLIBCXX_HAVE_SOCKATMARK = 1; + +const int _GLIBCXX_HAVE_SQRTF = 1; + +const int _GLIBCXX_HAVE_SQRTL = 1; + +const int _GLIBCXX_HAVE_STDALIGN_H = 1; + +const int _GLIBCXX_HAVE_STDBOOL_H = 1; + +const int _GLIBCXX_HAVE_STDINT_H = 1; + +const int _GLIBCXX_HAVE_STDLIB_H = 1; + +const int _GLIBCXX_HAVE_STRERROR_L = 1; + +const int _GLIBCXX_HAVE_STRERROR_R = 1; + +const int _GLIBCXX_HAVE_STRINGS_H = 1; + +const int _GLIBCXX_HAVE_STRING_H = 1; + +const int _GLIBCXX_HAVE_STRTOF = 1; + +const int _GLIBCXX_HAVE_STRTOLD = 1; + +const int _GLIBCXX_HAVE_STRUCT_DIRENT_D_TYPE = 1; + +const int _GLIBCXX_HAVE_STRXFRM_L = 1; + +const int _GLIBCXX_HAVE_SYMLINK = 1; + +const int _GLIBCXX_HAVE_SYMVER_SYMBOL_RENAMING_RUNTIME_SUPPORT = 1; + +const int _GLIBCXX_HAVE_SYS_IOCTL_H = 1; + +const int _GLIBCXX_HAVE_SYS_IPC_H = 1; + +const int _GLIBCXX_HAVE_SYS_PARAM_H = 1; + +const int _GLIBCXX_HAVE_SYS_RESOURCE_H = 1; + +const int _GLIBCXX_HAVE_SYS_SDT_H = 1; + +const int _GLIBCXX_HAVE_SYS_SEM_H = 1; + +const int _GLIBCXX_HAVE_SYS_SOCKET_H = 1; + +const int _GLIBCXX_HAVE_SYS_STATVFS_H = 1; + +const int _GLIBCXX_HAVE_SYS_STAT_H = 1; + +const int _GLIBCXX_HAVE_SYS_SYSINFO_H = 1; + +const int _GLIBCXX_HAVE_SYS_TIME_H = 1; + +const int _GLIBCXX_HAVE_SYS_TYPES_H = 1; + +const int _GLIBCXX_HAVE_SYS_UIO_H = 1; + +const int _GLIBCXX_HAVE_S_ISREG = 1; + +const int _GLIBCXX_HAVE_TANF = 1; + +const int _GLIBCXX_HAVE_TANHF = 1; + +const int _GLIBCXX_HAVE_TANHL = 1; + +const int _GLIBCXX_HAVE_TANL = 1; + +const int _GLIBCXX_HAVE_TGMATH_H = 1; + +const int _GLIBCXX_HAVE_TIMESPEC_GET = 1; + +const int _GLIBCXX_HAVE_TLS = 1; + +const int _GLIBCXX_HAVE_TRUNCATE = 1; + +const int _GLIBCXX_HAVE_UCHAR_H = 1; + +const int _GLIBCXX_HAVE_UNISTD_H = 1; + +const int _GLIBCXX_HAVE_UNLINKAT = 1; + +const int _GLIBCXX_HAVE_USELOCALE = 1; + +const int _GLIBCXX_HAVE_UTIME_H = 1; + +const int _GLIBCXX_HAVE_VFWSCANF = 1; + +const int _GLIBCXX_HAVE_VSWSCANF = 1; + +const int _GLIBCXX_HAVE_VWSCANF = 1; + +const int _GLIBCXX_HAVE_WCHAR_H = 1; + +const int _GLIBCXX_HAVE_WCSTOF = 1; + +const int _GLIBCXX_HAVE_WCTYPE_H = 1; + +const int _GLIBCXX_HAVE_WRITEV = 1; + +const int _GLIBCXX_HAVE___CXA_THREAD_ATEXIT_IMPL = 1; + +const String _GLIBCXX_LT_OBJDIR = '.libs/'; + +const String _GLIBCXX_PACKAGE_BUGREPORT = ''; + +const String _GLIBCXX_PACKAGE_NAME = 'package-unused'; + +const String _GLIBCXX_PACKAGE_STRING = 'package-unused version-unused'; + +const String _GLIBCXX_PACKAGE_TARNAME = 'libstdc++'; + +const String _GLIBCXX_PACKAGE_URL = ''; + +const String _GLIBCXX_PACKAGE__GLIBCXX_VERSION = 'version-unused'; + +const int _GLIBCXX_STDC_HEADERS = 1; + +const int _GLIBCXX_DARWIN_USE_64_BIT_INODE = 1; + +const int _GLIBCXX11_USE_C99_COMPLEX = 1; + +const int _GLIBCXX11_USE_C99_MATH = 1; + +const int _GLIBCXX11_USE_C99_STDIO = 1; + +const int _GLIBCXX11_USE_C99_STDLIB = 1; + +const int _GLIBCXX11_USE_C99_WCHAR = 1; + +const int _GLIBCXX98_USE_C99_COMPLEX = 1; + +const int _GLIBCXX98_USE_C99_MATH = 1; + +const int _GLIBCXX98_USE_C99_STDIO = 1; + +const int _GLIBCXX98_USE_C99_STDLIB = 1; + +const int _GLIBCXX98_USE_C99_WCHAR = 1; + +const int _GLIBCXX_ATOMIC_BUILTINS = 1; + +const int _GLIBCXX_CAN_ALIGNAS_DESTRUCTIVE_SIZE = 1; + +const int _GLIBCXX_FULLY_DYNAMIC_STRING = 0; + +const int _GLIBCXX_HAS_GTHREADS = 1; + +const int _GLIBCXX_HOSTED = 1; + +const int _GLIBCXX_RES_LIMITS = 1; + +const int _GLIBCXX_STATIC_TZDATA = 1; + +const int _GLIBCXX_STDIO_EOF = -1; + +const int _GLIBCXX_STDIO_SEEK_CUR = 1; + +const int _GLIBCXX_STDIO_SEEK_END = 2; + +const int _GLIBCXX_SYMVER = 1; + +const int _GLIBCXX_SYMVER_GNU = 1; + +const int _GLIBCXX_USE_C11_UCHAR_CXX11 = 1; + +const int _GLIBCXX_USE_C99 = 1; + +const int _GLIBCXX_USE_C99_COMPLEX_TR1 = 1; + +const int _GLIBCXX_USE_C99_CTYPE_TR1 = 1; + +const int _GLIBCXX_USE_C99_FENV_TR1 = 1; + +const int _GLIBCXX_USE_C99_INTTYPES_TR1 = 1; + +const int _GLIBCXX_USE_C99_INTTYPES_WCHAR_T_TR1 = 1; + +const int _GLIBCXX_USE_C99_MATH_TR1 = 1; + +const int _GLIBCXX_USE_C99_STDINT_TR1 = 1; + +const int _GLIBCXX_USE_CLOCK_MONOTONIC = 1; + +const int _GLIBCXX_USE_CLOCK_REALTIME = 1; + +const int _GLIBCXX_USE_DECIMAL_FLOAT = 1; + +const int _GLIBCXX_USE_DEV_RANDOM = 1; + +const int _GLIBCXX_USE_FCHMOD = 1; + +const int _GLIBCXX_USE_FCHMODAT = 1; + +const int _GLIBCXX_USE_FSEEKO_FTELLO = 1; + +const int _GLIBCXX_USE_GETTIMEOFDAY = 1; + +const int _GLIBCXX_USE_GET_NPROCS = 1; + +const int _GLIBCXX_USE_INIT_PRIORITY_ATTRIBUTE = 1; + +const int _GLIBCXX_USE_LFS = 1; + +const int _GLIBCXX_USE_LONG_LONG = 1; + +const int _GLIBCXX_USE_LSTAT = 1; + +const int _GLIBCXX_USE_NANOSLEEP = 1; + +const int _GLIBCXX_USE_NLS = 1; + +const int _GLIBCXX_USE_PTHREAD_COND_CLOCKWAIT = 1; + +const int _GLIBCXX_USE_PTHREAD_MUTEX_CLOCKLOCK = 1; + +const int _GLIBCXX_USE_PTHREAD_RWLOCK_CLOCKLOCK = 1; + +const int _GLIBCXX_USE_PTHREAD_RWLOCK_T = 1; + +const int _GLIBCXX_USE_RANDOM_TR1 = 1; + +const int _GLIBCXX_USE_REALPATH = 1; + +const int _GLIBCXX_USE_SCHED_YIELD = 1; + +const int _GLIBCXX_USE_SC_NPROCESSORS_ONLN = 1; + +const int _GLIBCXX_USE_SENDFILE = 1; + +const int _GLIBCXX_USE_ST_MTIM = 1; + +const int _GLIBCXX_USE_TMPNAM = 1; + +const int _GLIBCXX_USE_UCHAR_C8RTOMB_MBRTOC8_CXX20 = 1; + +const int _GLIBCXX_USE_UCHAR_C8RTOMB_MBRTOC8_FCHAR8_T = 1; + +const int _GLIBCXX_USE_UTIME = 1; + +const int _GLIBCXX_USE_UTIMENSAT = 1; + +const int _GLIBCXX_USE_WCHAR_T = 1; + +const int _GLIBCXX_VERBOSE = 1; + +const int _GLIBCXX_X86_RDRAND = 1; + +const int _GLIBCXX_X86_RDSEED = 1; + +const String _GLIBCXX_ZONEINFO_DIR = '/usr/share/zoneinfo'; + +const int _GTHREAD_USE_MUTEX_TIMEDLOCK = 1; + +const int _CPP_TYPE_TRAITS_H = 1; + +const int _EXT_TYPE_TRAITS = 1; + +const int _MATH_H = 1; + +const int __GLIBC_USE_LIB_EXT2 = 1; + +const int __GLIBC_USE_IEC_60559_BFP_EXT = 1; + +const int __GLIBC_USE_IEC_60559_BFP_EXT_C2X = 1; + +const int __GLIBC_USE_IEC_60559_EXT = 1; + +const int __GLIBC_USE_IEC_60559_FUNCS_EXT = 1; + +const int __GLIBC_USE_IEC_60559_FUNCS_EXT_C2X = 1; + +const int __GLIBC_USE_IEC_60559_TYPES_EXT = 1; + +const int _BITS_TYPES_H = 1; + +const int _BITS_TYPESIZES_H = 1; + +const int __OFF_T_MATCHES_OFF64_T = 1; + +const int __INO_T_MATCHES_INO64_T = 1; + +const int __RLIM_T_MATCHES_RLIM64_T = 1; + +const int __STATFS_MATCHES_STATFS64 = 1; + +const int __KERNEL_OLD_TIMEVAL_MATCHES_TIMEVAL64 = 1; + +const int __FD_SETSIZE = 1024; + +const int _BITS_TIME64_H = 1; + +const int _BITS_LIBM_SIMD_DECL_STUBS_H = 1; + +const int __HAVE_FLOAT128 = 0; + +const int __HAVE_DISTINCT_FLOAT128 = 0; + +const int __HAVE_FLOAT64X = 1; + +const int __HAVE_FLOAT64X_LONG_DOUBLE = 1; + +const int __HAVE_FLOAT16 = 0; + +const int __HAVE_FLOAT32 = 1; + +const int __HAVE_FLOAT64 = 1; + +const int __HAVE_FLOAT32X = 1; + +const int __HAVE_FLOAT128X = 0; + +const int __HAVE_DISTINCT_FLOAT16 = 0; + +const int __HAVE_DISTINCT_FLOAT32 = 0; + +const int __HAVE_DISTINCT_FLOAT64 = 0; + +const int __HAVE_DISTINCT_FLOAT32X = 0; + +const int __HAVE_DISTINCT_FLOAT64X = 0; + +const int __HAVE_DISTINCT_FLOAT128X = 0; + +const int __HAVE_FLOAT128_UNLIKE_LDBL = 0; + +const int __HAVE_FLOATN_NOT_TYPEDEF = 0; + +const double HUGE_VAL = double.infinity; + +const double HUGE_VALF = double.infinity; + +const double HUGE_VALL = double.infinity; + +const double HUGE_VAL_F32 = double.infinity; + +const double HUGE_VAL_F64 = double.infinity; + +const double HUGE_VAL_F32X = double.infinity; + +const double HUGE_VAL_F64X = double.infinity; + +const double INFINITY = double.infinity; + +const double NAN = double.nan; + +const double SNANF = double.nan; + +const double SNAN = double.nan; + +const double SNANL = double.nan; + +const double SNANF32 = double.nan; + +const double SNANF64 = double.nan; + +const double SNANF32X = double.nan; + +const double SNANF64X = double.nan; + +const int __GLIBC_FLT_EVAL_METHOD = 0; + +const int __FP_LOGB0_IS_MIN = 1; + +const int __FP_LOGBNAN_IS_MIN = 1; + +const int FP_ILOGB0 = -2147483648; + +const int FP_ILOGBNAN = -2147483648; + +const int __FP_LONG_MAX = 9223372036854775807; + +const int FP_LLOGB0 = -9223372036854775808; + +const int FP_LLOGBNAN = -9223372036854775808; + +const int FP_INT_UPWARD = 0; + +const int FP_INT_DOWNWARD = 1; + +const int FP_INT_TOWARDZERO = 2; + +const int FP_INT_TONEARESTFROMZERO = 3; + +const int FP_INT_TONEAREST = 4; + +const int __MATH_DECLARE_LDOUBLE = 1; + +const int FP_NAN = 0; + +const int FP_INFINITE = 1; + +const int FP_ZERO = 2; + +const int FP_SUBNORMAL = 3; + +const int FP_NORMAL = 4; + +const int MATH_ERRNO = 1; + +const int MATH_ERREXCEPT = 2; + +const int math_errhandling = 3; + +const double MAXFLOAT = 3.4028234663852886e+38; + +const double M_E = 2.718281828459045; + +const double M_LOG2E = 1.4426950408889634; + +const double M_LOG10E = 0.4342944819032518; + +const double M_LN2 = 0.6931471805599453; + +const double M_LN10 = 2.302585092994046; + +const double M_PI = 3.141592653589793; + +const double M_PI_2 = 1.5707963267948966; + +const double M_PI_4 = 0.7853981633974483; + +const double M_1_PI = 0.3183098861837907; + +const double M_2_PI = 0.6366197723675814; + +const double M_2_SQRTPI = 1.1283791670955126; + +const double M_SQRT2 = 1.4142135623730951; + +const double M_SQRT1_2 = 0.7071067811865476; + +const double M_Ef = 2.7182817459106445; + +const double M_LOG2Ef = 1.4426950216293335; + +const double M_LOG10Ef = 0.4342944920063019; + +const double M_LN2f = 0.6931471824645996; + +const double M_LN10f = 2.3025851249694824; + +const double M_PIf = 3.1415927410125732; + +const double M_PI_2f = 1.5707963705062866; + +const double M_PI_4f = 0.7853981852531433; + +const double M_1_PIf = 0.31830987334251404; + +const double M_2_PIf = 0.6366197466850281; + +const double M_2_SQRTPIf = 1.128379225730896; + +const double M_SQRT2f = 1.4142135381698608; + +const double M_SQRT1_2f = 0.7071067690849304; + +const double M_El = 2.718281828459045; + +const double M_LOG2El = 1.4426950408889634; + +const double M_LOG10El = 0.4342944819032518; + +const double M_LN2l = 0.6931471805599453; + +const double M_LN10l = 2.302585092994046; + +const double M_PIl = 3.141592653589793; + +const double M_PI_2l = 1.5707963267948966; + +const double M_PI_4l = 0.7853981633974483; + +const double M_1_PIl = 0.3183098861837907; + +const double M_2_PIl = 0.6366197723675814; + +const double M_2_SQRTPIl = 1.1283791670955126; + +const double M_SQRT2l = 1.4142135623730951; + +const double M_SQRT1_2l = 0.7071067811865476; + +const double M_Ef32 = 2.7182817459106445; + +const double M_LOG2Ef32 = 1.4426950216293335; + +const double M_LOG10Ef32 = 0.4342944920063019; + +const double M_LN2f32 = 0.6931471824645996; + +const double M_LN10f32 = 2.3025851249694824; + +const double M_PIf32 = 3.1415927410125732; + +const double M_PI_2f32 = 1.5707963705062866; + +const double M_PI_4f32 = 0.7853981852531433; + +const double M_1_PIf32 = 0.31830987334251404; + +const double M_2_PIf32 = 0.6366197466850281; + +const double M_2_SQRTPIf32 = 1.128379225730896; + +const double M_SQRT2f32 = 1.4142135381698608; + +const double M_SQRT1_2f32 = 0.7071067690849304; + +const double M_Ef64 = 2.718281828459045; + +const double M_LOG2Ef64 = 1.4426950408889634; + +const double M_LOG10Ef64 = 0.4342944819032518; + +const double M_LN2f64 = 0.6931471805599453; + +const double M_LN10f64 = 2.302585092994046; + +const double M_PIf64 = 3.141592653589793; + +const double M_PI_2f64 = 1.5707963267948966; + +const double M_PI_4f64 = 0.7853981633974483; + +const double M_1_PIf64 = 0.3183098861837907; + +const double M_2_PIf64 = 0.6366197723675814; + +const double M_2_SQRTPIf64 = 1.1283791670955126; + +const double M_SQRT2f64 = 1.4142135623730951; + +const double M_SQRT1_2f64 = 0.7071067811865476; + +const double M_Ef32x = 2.718281828459045; + +const double M_LOG2Ef32x = 1.4426950408889634; + +const double M_LOG10Ef32x = 0.4342944819032518; + +const double M_LN2f32x = 0.6931471805599453; + +const double M_LN10f32x = 2.302585092994046; + +const double M_PIf32x = 3.141592653589793; + +const double M_PI_2f32x = 1.5707963267948966; + +const double M_PI_4f32x = 0.7853981633974483; + +const double M_1_PIf32x = 0.3183098861837907; + +const double M_2_PIf32x = 0.6366197723675814; + +const double M_2_SQRTPIf32x = 1.1283791670955126; + +const double M_SQRT2f32x = 1.4142135623730951; + +const double M_SQRT1_2f32x = 0.7071067811865476; + +const double M_Ef64x = 2.718281828459045; + +const double M_LOG2Ef64x = 1.4426950408889634; + +const double M_LOG10Ef64x = 0.4342944819032518; + +const double M_LN2f64x = 0.6931471805599453; + +const double M_LN10f64x = 2.302585092994046; + +const double M_PIf64x = 3.141592653589793; + +const double M_PI_2f64x = 1.5707963267948966; + +const double M_PI_4f64x = 0.7853981633974483; + +const double M_1_PIf64x = 0.3183098861837907; + +const double M_2_PIf64x = 0.6366197723675814; + +const double M_2_SQRTPIf64x = 1.1283791670955126; + +const double M_SQRT2f64x = 1.4142135623730951; + +const double M_SQRT1_2f64x = 0.7071067811865476; + +const int NULL = 0; + +const int _STDLIB_H = 1; + +const int WNOHANG = 1; + +const int WUNTRACED = 2; + +const int WSTOPPED = 2; + +const int WEXITED = 4; + +const int WCONTINUED = 8; + +const int WNOWAIT = 16777216; + +const int __WNOTHREAD = 536870912; + +const int __WALL = 1073741824; + +const int __WCLONE = 2147483648; + +const int __W_CONTINUED = 65535; + +const int __WCOREFLAG = 128; + +const int __ldiv_t_defined = 1; + +const int __lldiv_t_defined = 1; + +const int RAND_MAX = 2147483647; + +const int EXIT_FAILURE = 1; + +const int EXIT_SUCCESS = 0; + +const int _BITS_TYPES_LOCALE_T_H = 1; + +const int _BITS_TYPES___LOCALE_T_H = 1; + +const int _SYS_TYPES_H = 1; + +const int __clock_t_defined = 1; + +const int __clockid_t_defined = 1; + +const int __time_t_defined = 1; + +const int __timer_t_defined = 1; + +const int _BITS_STDINT_INTN_H = 1; + +const int __BIT_TYPES_DEFINED__ = 1; + +const int _ENDIAN_H = 1; + +const int _BITS_ENDIAN_H = 1; + +const int __LITTLE_ENDIAN = 1234; + +const int __BIG_ENDIAN = 4321; + +const int __PDP_ENDIAN = 3412; + +const int _BITS_ENDIANNESS_H = 1; + +const int __BYTE_ORDER = 1234; + +const int __FLOAT_WORD_ORDER = 1234; + +const int LITTLE_ENDIAN = 1234; + +const int BIG_ENDIAN = 4321; + +const int PDP_ENDIAN = 3412; + +const int BYTE_ORDER = 1234; + +const int _BITS_BYTESWAP_H = 1; + +const int _BITS_UINTN_IDENTITY_H = 1; + +const int _SYS_SELECT_H = 1; + +const int __sigset_t_defined = 1; + +const int _SIGSET_NWORDS = 16; + +const int __timeval_defined = 1; + +const int _STRUCT_TIMESPEC = 1; + +const int __NFDBITS = 64; + +const int FD_SETSIZE = 1024; + +const int NFDBITS = 64; + +const int _BITS_PTHREADTYPES_COMMON_H = 1; + +const int _THREAD_SHARED_TYPES_H = 1; + +const int _BITS_PTHREADTYPES_ARCH_H = 1; + +const int __SIZEOF_PTHREAD_MUTEX_T = 40; + +const int __SIZEOF_PTHREAD_ATTR_T = 56; + +const int __SIZEOF_PTHREAD_RWLOCK_T = 56; + +const int __SIZEOF_PTHREAD_BARRIER_T = 32; + +const int __SIZEOF_PTHREAD_MUTEXATTR_T = 4; + +const int __SIZEOF_PTHREAD_COND_T = 48; + +const int __SIZEOF_PTHREAD_CONDATTR_T = 4; + +const int __SIZEOF_PTHREAD_RWLOCKATTR_T = 8; + +const int __SIZEOF_PTHREAD_BARRIERATTR_T = 4; + +const int _THREAD_MUTEX_INTERNAL_H = 1; + +const int __PTHREAD_MUTEX_HAVE_PREV = 1; + +const int __PTHREAD_RWLOCK_ELISION_EXTRA = 0; + +const int __have_pthread_attr_t = 1; + +const int _ALLOCA_H = 1; + +const int _GLIBCXX_CMATH = 1; + +const int __cpp_lib_hypot = 201603; + +const int _GLIBCXX_BITS_SPECFUN_H = 1; + +const int __STDCPP_MATH_SPEC_FUNCS__ = 201003; + +const int __cpp_lib_math_special_functions = 201603; + +const int _STL_ALGOBASE_H = 1; + +const int _FUNCTEXCEPT_H = 1; + +const int _EXCEPTION_DEFINES_H = 1; + +const int _EXT_NUMERIC_TRAITS = 1; + +const int _STL_PAIR_H = 1; + +const int _GLIBCXX_TYPE_TRAITS = 1; + +const int __cpp_lib_integral_constant_callable = 201304; + +const int __cpp_lib_bool_constant = 201505; + +const int __cpp_lib_logical_traits = 201510; + +const int __cpp_lib_is_null_pointer = 201309; + +const int __cpp_lib_is_final = 201402; + +const int __cpp_lib_transformation_trait_aliases = 201304; + +const int __cpp_lib_result_of_sfinae = 201210; + +const int __cpp_lib_void_t = 201411; + +const int __cpp_lib_is_swappable = 201603; + +const int __cpp_lib_is_invocable = 201703; + +const int __cpp_lib_type_trait_variable_templates = 201510; + +const int __cpp_lib_has_unique_object_representations = 201606; + +const int __cpp_lib_is_aggregate = 201703; + +const int _MOVE_H = 1; + +const int __cpp_lib_addressof_constexpr = 201603; + +const int _GLIBCXX_UTILITY_H = 1; + +const int __cpp_lib_tuple_element_t = 201402; + +const int __cpp_lib_integer_sequence = 201304; + +const int __cpp_lib_tuples_by_type = 201304; + +const int _STL_ITERATOR_BASE_TYPES_H = 1; + +const int _STL_ITERATOR_BASE_FUNCS_H = 1; + +const int _CONCEPT_CHECK_H = 1; + +const int _GLIBCXX_DEBUG_ASSERTIONS_H = 1; + +const int _STL_ITERATOR_H = 1; + +const int _PTR_TRAITS_H = 1; + +const int __cpp_lib_array_constexpr = 201803; + +const int __cpp_lib_make_reverse_iterator = 201402; + +const int _GLIBCXX_DEBUG_MACRO_SWITCH_H = 1; + +const int _GLIBCXX_PREDEFINED_OPS_H = 1; + +const int _GLIBCXX_BIT = 1; + +const int __cpp_lib_robust_nonmodifying_seq_ops = 201304; + +const int _GLIBCXX_NUMERIC_LIMITS = 1; + +const int __glibcxx_integral_traps = 1; + +const int _GLIBCXX_TR1_GAMMA_TCC = 1; + +const int _GLIBCXX_TR1_SPECIAL_FUNCTION_UTIL_H = 1; + +const int _GLIBCXX_TR1_BESSEL_FUNCTION_TCC = 1; + +const int _GLIBCXX_TR1_BETA_FUNCTION_TCC = 1; + +const int _GLIBCXX_TR1_ELL_INTEGRAL_TCC = 1; + +const int _GLIBCXX_TR1_EXP_INTEGRAL_TCC = 1; + +const int _GLIBCXX_TR1_HYPERGEOMETRIC_TCC = 1; + +const int _GLIBCXX_TR1_LEGENDRE_FUNCTION_TCC = 1; + +const int _GLIBCXX_TR1_MODIFIED_BESSEL_FUNC_TCC = 1; + +const int _GLIBCXX_TR1_POLY_HERMITE_TCC = 1; + +const int _GLIBCXX_TR1_POLY_LAGUERRE_TCC = 1; + +const int _GLIBCXX_TR1_RIEMANN_ZETA_TCC = 1; + +const int EIGEN_HAS_C99_MATH = 1; + +const int EIGEN_HAS_STD_RESULT_OF = 0; + +const int EIGEN_HAS_STD_HASH = 1; + +const int EIGEN_HAS_STD_INVOKE_RESULT = 1; + +const int EIGEN_HAS_ALIGNAS = 1; + +const int EIGEN_HAS_TYPE_TRAITS = 1; + +const int EIGEN_HAS_VARIADIC_TEMPLATES = 1; + +const int EIGEN_HAS_CONSTEXPR = 1; + +const int EIGEN_HAS_CXX11_MATH = 1; + +const int EIGEN_HAS_CXX11_CONTAINERS = 1; + +const int EIGEN_HAS_CXX11_NOEXCEPT = 1; + +const int EIGEN_HAS_CXX11_ATOMIC = 1; + +const int EIGEN_HAS_CXX11_OVERRIDE_FINAL = 1; + +const int EIGEN_HAS_CXX17_OVERALIGN = 1; + +const int EIGEN_HAS_BUILTIN_INT128 = 1; + +const int EIGEN_NO_THROW = 1; + +const int EIGEN_IDEAL_MAX_ALIGN_BYTES = 16; + +const int EIGEN_MIN_ALIGN_BYTES = 16; + +const int EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT = 0; + +const int EIGEN_ARCH_WANTS_STACK_ALIGNMENT = 1; + +const int EIGEN_MAX_STATIC_ALIGN_BYTES = 16; + +const int EIGEN_MAX_ALIGN_BYTES = 16; + +const int EIGEN_DEFAULT_ALIGN_BYTES = 16; + +const int EIGEN_UNALIGNED_VECTORIZE = 1; + +const int _GLIBCXX_STDLIB_H = 1; + +const int _GLIBCXX_CSTDLIB = 1; + +const int _MM_HINT_ET0 = 7; + +const int _MM_HINT_ET1 = 6; + +const int _MM_HINT_T0 = 3; + +const int _MM_HINT_T1 = 2; + +const int _MM_HINT_T2 = 1; + +const int _MM_HINT_NTA = 0; + +const int _MM_EXCEPT_INVALID = 1; + +const int _MM_EXCEPT_DENORM = 2; + +const int _MM_EXCEPT_DIV_ZERO = 4; + +const int _MM_EXCEPT_OVERFLOW = 8; + +const int _MM_EXCEPT_UNDERFLOW = 16; + +const int _MM_EXCEPT_INEXACT = 32; + +const int _MM_EXCEPT_MASK = 63; + +const int _MM_MASK_INVALID = 128; + +const int _MM_MASK_DENORM = 256; + +const int _MM_MASK_DIV_ZERO = 512; + +const int _MM_MASK_OVERFLOW = 1024; + +const int _MM_MASK_UNDERFLOW = 2048; + +const int _MM_MASK_INEXACT = 4096; + +const int _MM_MASK_MASK = 8064; + +const int _MM_ROUND_NEAREST = 0; + +const int _MM_ROUND_DOWN = 8192; + +const int _MM_ROUND_UP = 16384; + +const int _MM_ROUND_TOWARD_ZERO = 24576; + +const int _MM_ROUND_MASK = 24576; + +const int _MM_FLUSH_ZERO_MASK = 32768; + +const int _MM_FLUSH_ZERO_ON = 32768; + +const int _MM_FLUSH_ZERO_OFF = 0; + +const int _MM_DENORMALS_ZERO_ON = 64; + +const int _MM_DENORMALS_ZERO_OFF = 0; + +const int _MM_DENORMALS_ZERO_MASK = 64; + +const int __EXCEPTION_H = 1; + +const int __cpp_lib_launder = 201606; + +const int _GLIBCXX_COMPLEX = 1; + +const int _GLIBCXX_SSTREAM = 1; + +const int _GLIBCXX_ISTREAM = 1; + +const int _GLIBCXX_IOS = 1; + +const int _GLIBCXX_IOSFWD = 1; + +const int _STRINGFWD_H = 1; + +const int _MEMORYFWD_H = 1; + +const int _GLIBCXX_POSTYPES_H = 1; + +const int _WCHAR_H = 1; + +const int _BITS_WCHAR_H = 1; + +const int __WCHAR_MAX = 2147483647; + +const int __WCHAR_MIN = -2147483648; + +const int __wint_t_defined = 1; + +const int _WINT_T = 1; + +const int __mbstate_t_defined = 1; + +const int ____mbstate_t_defined = 1; + +const int ____FILE_defined = 1; + +const int __FILE_defined = 1; + +const int WCHAR_MIN = -2147483648; + +const int WCHAR_MAX = 2147483647; + +const int WEOF = 4294967295; + +const int _GLIBCXX_CWCHAR = 1; + +const int __cpp_lib_uncaught_exceptions = 201411; + +const int _CXXABI_INIT_EXCEPTION_H = 1; + +const int _GLIBCXX_HAVE_CDTOR_CALLABI = 0; + +const int _HASH_BYTES_H = 1; + +const int __GXX_MERGED_TYPEINFO_NAMES = 0; + +const int __GXX_TYPEINFO_EQUALITY_INLINE = 1; + +const int _GLIBCXX_NESTED_EXCEPTION_H = 1; + +const int _CHAR_TRAITS_H = 1; + +const int __cpp_lib_constexpr_char_traits = 201611; + +const int _LOCALE_FWD_H = 1; + +const int _GLIBCXX_CXX_LOCALE_H = 1; + +const int _LOCALE_H = 1; + +const int _BITS_LOCALE_H = 1; + +const int __LC_CTYPE = 0; + +const int __LC_NUMERIC = 1; + +const int __LC_TIME = 2; + +const int __LC_COLLATE = 3; + +const int __LC_MONETARY = 4; + +const int __LC_MESSAGES = 5; + +const int __LC_ALL = 6; + +const int __LC_PAPER = 7; + +const int __LC_NAME = 8; + +const int __LC_ADDRESS = 9; + +const int __LC_TELEPHONE = 10; + +const int __LC_MEASUREMENT = 11; + +const int __LC_IDENTIFICATION = 12; + +const int LC_CTYPE = 0; + +const int LC_NUMERIC = 1; + +const int LC_TIME = 2; + +const int LC_COLLATE = 3; + +const int LC_MONETARY = 4; + +const int LC_MESSAGES = 5; + +const int LC_ALL = 6; + +const int LC_PAPER = 7; + +const int LC_NAME = 8; + +const int LC_ADDRESS = 9; + +const int LC_TELEPHONE = 10; + +const int LC_MEASUREMENT = 11; + +const int LC_IDENTIFICATION = 12; + +const int LC_CTYPE_MASK = 1; + +const int LC_NUMERIC_MASK = 2; + +const int LC_TIME_MASK = 4; + +const int LC_COLLATE_MASK = 8; + +const int LC_MONETARY_MASK = 16; + +const int LC_MESSAGES_MASK = 32; + +const int LC_PAPER_MASK = 128; + +const int LC_NAME_MASK = 256; + +const int LC_ADDRESS_MASK = 512; + +const int LC_TELEPHONE_MASK = 1024; + +const int LC_MEASUREMENT_MASK = 2048; + +const int LC_IDENTIFICATION_MASK = 4096; + +const int LC_ALL_MASK = 8127; + +const int _GLIBCXX_CLOCALE = 1; + +const int _GLIBCXX_C_LOCALE_GNU = 1; + +const int _GLIBCXX_NUM_CATEGORIES = 6; + +const int _CTYPE_H = 1; + +const int _GLIBCXX_CCTYPE = 1; + +const int _IOS_BASE_H = 1; + +const int _GLIBCXX_ATOMICITY_H = 1; + +const int __GTHREADS = 1; + +const int __GTHREADS_CXX0X = 1; + +const int _PTHREAD_H = 1; + +const int _SCHED_H = 1; + +const int _BITS_SCHED_H = 1; + +const int SCHED_OTHER = 0; + +const int SCHED_FIFO = 1; + +const int SCHED_RR = 2; + +const int SCHED_BATCH = 3; + +const int SCHED_ISO = 4; + +const int SCHED_IDLE = 5; + +const int SCHED_DEADLINE = 6; + +const int SCHED_RESET_ON_FORK = 1073741824; + +const int CSIGNAL = 255; + +const int CLONE_VM = 256; + +const int CLONE_FS = 512; + +const int CLONE_FILES = 1024; + +const int CLONE_SIGHAND = 2048; + +const int CLONE_PIDFD = 4096; + +const int CLONE_PTRACE = 8192; + +const int CLONE_VFORK = 16384; + +const int CLONE_PARENT = 32768; + +const int CLONE_THREAD = 65536; + +const int CLONE_NEWNS = 131072; + +const int CLONE_SYSVSEM = 262144; + +const int CLONE_SETTLS = 524288; + +const int CLONE_PARENT_SETTID = 1048576; + +const int CLONE_CHILD_CLEARTID = 2097152; + +const int CLONE_DETACHED = 4194304; + +const int CLONE_UNTRACED = 8388608; + +const int CLONE_CHILD_SETTID = 16777216; + +const int CLONE_NEWCGROUP = 33554432; + +const int CLONE_NEWUTS = 67108864; + +const int CLONE_NEWIPC = 134217728; + +const int CLONE_NEWUSER = 268435456; + +const int CLONE_NEWPID = 536870912; + +const int CLONE_NEWNET = 1073741824; + +const int CLONE_IO = 2147483648; + +const int CLONE_NEWTIME = 128; + +const int _BITS_TYPES_STRUCT_SCHED_PARAM = 1; + +const int _BITS_CPU_SET_H = 1; + +const int __CPU_SETSIZE = 1024; + +const int __NCPUBITS = 64; + +const int CPU_SETSIZE = 1024; + +const int _TIME_H = 1; + +const int _BITS_TIME_H = 1; + +const int CLOCKS_PER_SEC = 1000000; + +const int CLOCK_REALTIME = 0; + +const int CLOCK_MONOTONIC = 1; + +const int CLOCK_PROCESS_CPUTIME_ID = 2; + +const int CLOCK_THREAD_CPUTIME_ID = 3; + +const int CLOCK_MONOTONIC_RAW = 4; + +const int CLOCK_REALTIME_COARSE = 5; + +const int CLOCK_MONOTONIC_COARSE = 6; + +const int CLOCK_BOOTTIME = 7; + +const int CLOCK_REALTIME_ALARM = 8; + +const int CLOCK_BOOTTIME_ALARM = 9; + +const int CLOCK_TAI = 11; + +const int TIMER_ABSTIME = 1; + +const int _BITS_TIMEX_H = 1; + +const int ADJ_OFFSET = 1; + +const int ADJ_FREQUENCY = 2; + +const int ADJ_MAXERROR = 4; + +const int ADJ_ESTERROR = 8; + +const int ADJ_STATUS = 16; + +const int ADJ_TIMECONST = 32; + +const int ADJ_TAI = 128; + +const int ADJ_SETOFFSET = 256; + +const int ADJ_MICRO = 4096; + +const int ADJ_NANO = 8192; + +const int ADJ_TICK = 16384; + +const int ADJ_OFFSET_SINGLESHOT = 32769; + +const int ADJ_OFFSET_SS_READ = 40961; + +const int MOD_OFFSET = 1; + +const int MOD_FREQUENCY = 2; + +const int MOD_MAXERROR = 4; + +const int MOD_ESTERROR = 8; + +const int MOD_STATUS = 16; + +const int MOD_TIMECONST = 32; + +const int MOD_CLKB = 16384; + +const int MOD_CLKA = 32769; + +const int MOD_TAI = 128; + +const int MOD_MICRO = 4096; + +const int MOD_NANO = 8192; + +const int STA_PLL = 1; + +const int STA_PPSFREQ = 2; + +const int STA_PPSTIME = 4; + +const int STA_FLL = 8; + +const int STA_INS = 16; + +const int STA_DEL = 32; + +const int STA_UNSYNC = 64; + +const int STA_FREQHOLD = 128; + +const int STA_PPSSIGNAL = 256; + +const int STA_PPSJITTER = 512; + +const int STA_PPSWANDER = 1024; + +const int STA_PPSERROR = 2048; + +const int STA_CLOCKERR = 4096; + +const int STA_NANO = 8192; + +const int STA_MODE = 16384; + +const int STA_CLK = 32768; + +const int STA_RONLY = 65280; + +const int __struct_tm_defined = 1; + +const int __itimerspec_defined = 1; + +const int TIME_UTC = 1; + +const int _BITS_SETJMP_H = 1; + +const int __jmp_buf_tag_defined = 1; + +const int __SC_THREAD_STACK_MIN_VALUE = 75; + +const int PTHREAD_CREATE_JOINABLE1 = 0; + +const int PTHREAD_CREATE_DETACHED1 = 1; + +const int PTHREAD_INHERIT_SCHED1 = 0; + +const int PTHREAD_EXPLICIT_SCHED1 = 1; + +const int PTHREAD_SCOPE_SYSTEM1 = 0; + +const int PTHREAD_SCOPE_PROCESS1 = 1; + +const int PTHREAD_PROCESS_PRIVATE1 = 0; + +const int PTHREAD_PROCESS_SHARED1 = 1; + +const int PTHREAD_CANCEL_ENABLE1 = 0; + +const int PTHREAD_CANCEL_DISABLE1 = 1; + +const int PTHREAD_CANCEL_DEFERRED1 = 0; + +const int PTHREAD_CANCEL_ASYNCHRONOUS1 = 1; + +const int PTHREAD_ONCE_INIT = 0; + +const int PTHREAD_BARRIER_SERIAL_THREAD = -1; + +const int PTHREAD_ATTR_NO_SIGMASK_NP = -1; + +const int __GTHREAD_HAS_COND = 1; + +const int __GTHREAD_ONCE_INIT = 0; + +const int _GLIBCXX_ATOMIC_WORD_H = 1; + +const int _LOCALE_CLASSES_H = 1; + +const int _GLIBCXX_STRING = 1; + +const int _ALLOCATOR_H = 1; + +const int _GLIBCXX_CXX_ALLOCATOR_H = 1; + +const int _STD_NEW_ALLOCATOR_H = 1; + +const int __cpp_lib_incomplete_container_elements = 201505; + +const int _OSTREAM_INSERT_H = 1; + +const int _CXXABI_FORCED_H = 1; + +const int _STL_FUNCTION_H = 1; + +const int __cpp_lib_transparent_operators = 201510; + +const int _BACKWARD_BINDERS_H = 1; + +const int _GLIBCXX_REFWRAP_H = 1; + +const int _GLIBCXX_INVOKE_H = 1; + +const int _GLIBCXX_RANGE_ACCESS_H = 1; + +const int __cpp_lib_nonmember_container_access = 201411; + +const int _BASIC_STRING_H = 1; + +const int _EXT_ALLOC_TRAITS_H = 1; + +const int _ALLOC_TRAITS_H = 1; + +const int _STL_CONSTRUCT_H = 1; + +const int __cpp_lib_allocator_traits_is_always_equal = 201411; + +const int _GLIBCXX_STRING_VIEW = 1; + +const int _FUNCTIONAL_HASH_H = 1; + +const int __cpp_lib_string_view = 201803; + +const int _GLIBCXX_STRING_VIEW_TCC = 1; + +const int __cpp_lib_constexpr_string = 201611; + +const int _STRING_CONVERSIONS_H = 1; + +const int _STDIO_H = 1; + +const int _____fpos_t_defined = 1; + +const int _____fpos64_t_defined = 1; + +const int __struct_FILE_defined = 1; + +const int _IO_EOF_SEEN = 16; + +const int _IO_ERR_SEEN = 32; + +const int _IO_USER_LOCK = 32768; + +const int __cookie_io_functions_t_defined = 1; + +const int _IOFBF = 0; + +const int _IOLBF = 1; + +const int _IONBF = 2; + +const int BUFSIZ = 8192; + +const int EOF = -1; + +const int SEEK_SET = 0; + +const int SEEK_CUR = 1; + +const int SEEK_END = 2; + +const int SEEK_DATA = 3; + +const int SEEK_HOLE = 4; + +const String P_tmpdir = '/tmp'; + +const int L_tmpnam = 20; + +const int TMP_MAX = 238328; + +const int _BITS_STDIO_LIM_H = 1; + +const int FILENAME_MAX = 4096; + +const int L_ctermid = 9; + +const int L_cuserid = 9; + +const int FOPEN_MAX = 16; + +const int _PRINTF_NAN_LEN_MAX = 4; + +const int RENAME_NOREPLACE = 1; + +const int RENAME_EXCHANGE = 2; + +const int RENAME_WHITEOUT = 4; + +const int _GLIBCXX_CSTDIO = 1; + +const int _ERRNO_H = 1; + +const int _BITS_ERRNO_H = 1; + +const int EPERM = 1; + +const int ENOENT = 2; + +const int ESRCH = 3; + +const int EINTR = 4; + +const int EIO = 5; + +const int ENXIO = 6; + +const int E2BIG = 7; + +const int ENOEXEC = 8; + +const int EBADF = 9; + +const int ECHILD = 10; + +const int EAGAIN = 11; + +const int ENOMEM = 12; + +const int EACCES = 13; + +const int EFAULT = 14; + +const int ENOTBLK = 15; + +const int EBUSY = 16; + +const int EEXIST = 17; + +const int EXDEV = 18; + +const int ENODEV = 19; + +const int ENOTDIR = 20; + +const int EISDIR = 21; + +const int EINVAL = 22; + +const int ENFILE = 23; + +const int EMFILE = 24; + +const int ENOTTY = 25; + +const int ETXTBSY = 26; + +const int EFBIG = 27; + +const int ENOSPC = 28; + +const int ESPIPE = 29; + +const int EROFS = 30; + +const int EMLINK = 31; + +const int EPIPE = 32; + +const int EDOM = 33; + +const int ERANGE = 34; + +const int EDEADLK = 35; + +const int ENAMETOOLONG = 36; + +const int ENOLCK = 37; + +const int ENOSYS = 38; + +const int ENOTEMPTY = 39; + +const int ELOOP = 40; + +const int EWOULDBLOCK = 11; + +const int ENOMSG = 42; + +const int EIDRM = 43; + +const int ECHRNG = 44; + +const int EL2NSYNC = 45; + +const int EL3HLT = 46; + +const int EL3RST = 47; + +const int ELNRNG = 48; + +const int EUNATCH = 49; + +const int ENOCSI = 50; + +const int EL2HLT = 51; + +const int EBADE = 52; + +const int EBADR = 53; + +const int EXFULL = 54; + +const int ENOANO = 55; + +const int EBADRQC = 56; + +const int EBADSLT = 57; + +const int EDEADLOCK = 35; + +const int EBFONT = 59; + +const int ENOSTR = 60; + +const int ENODATA = 61; + +const int ETIME = 62; + +const int ENOSR = 63; + +const int ENONET = 64; + +const int ENOPKG = 65; + +const int EREMOTE = 66; + +const int ENOLINK = 67; + +const int EADV = 68; + +const int ESRMNT = 69; + +const int ECOMM = 70; + +const int EPROTO = 71; + +const int EMULTIHOP = 72; + +const int EDOTDOT = 73; + +const int EBADMSG = 74; + +const int EOVERFLOW = 75; + +const int ENOTUNIQ = 76; + +const int EBADFD = 77; + +const int EREMCHG = 78; + +const int ELIBACC = 79; + +const int ELIBBAD = 80; + +const int ELIBSCN = 81; + +const int ELIBMAX = 82; + +const int ELIBEXEC = 83; + +const int EILSEQ = 84; + +const int ERESTART = 85; + +const int ESTRPIPE = 86; + +const int EUSERS = 87; + +const int ENOTSOCK = 88; + +const int EDESTADDRREQ = 89; + +const int EMSGSIZE = 90; + +const int EPROTOTYPE = 91; + +const int ENOPROTOOPT = 92; + +const int EPROTONOSUPPORT = 93; + +const int ESOCKTNOSUPPORT = 94; + +const int EOPNOTSUPP = 95; + +const int EPFNOSUPPORT = 96; + +const int EAFNOSUPPORT = 97; + +const int EADDRINUSE = 98; + +const int EADDRNOTAVAIL = 99; + +const int ENETDOWN = 100; + +const int ENETUNREACH = 101; + +const int ENETRESET = 102; + +const int ECONNABORTED = 103; + +const int ECONNRESET = 104; + +const int ENOBUFS = 105; + +const int EISCONN = 106; + +const int ENOTCONN = 107; + +const int ESHUTDOWN = 108; + +const int ETOOMANYREFS = 109; + +const int ETIMEDOUT = 110; + +const int ECONNREFUSED = 111; + +const int EHOSTDOWN = 112; + +const int EHOSTUNREACH = 113; + +const int EALREADY = 114; + +const int EINPROGRESS = 115; + +const int ESTALE = 116; + +const int EUCLEAN = 117; + +const int ENOTNAM = 118; + +const int ENAVAIL = 119; + +const int EISNAM = 120; + +const int EREMOTEIO = 121; + +const int EDQUOT = 122; + +const int ENOMEDIUM = 123; + +const int EMEDIUMTYPE = 124; + +const int ECANCELED = 125; + +const int ENOKEY = 126; + +const int EKEYEXPIRED = 127; + +const int EKEYREVOKED = 128; + +const int EKEYREJECTED = 129; + +const int EOWNERDEAD = 130; + +const int ENOTRECOVERABLE = 131; + +const int ERFKILL = 132; + +const int EHWPOISON = 133; + +const int ENOTSUP = 95; + +const int __error_t_defined = 1; + +const int _GLIBCXX_CERRNO = 1; + +const int _GLIBCXX_CHARCONV_H = 1; + +const int __cpp_lib_string_udls = 201304; + +const int _BASIC_STRING_TCC = 1; + +const int _GLIBCXX_MEMORY_RESOURCE_H = 1; + +const int _GLIBCXX_CSTDDEF = 1; + +const int __cpp_lib_byte = 201603; + +const int _USES_ALLOCATOR_H = 1; + +const int _USES_ALLOCATOR_ARGS = 1; + +const int _GLIBCXX_TUPLE = 1; + +const int __cpp_lib_apply = 201603; + +const int __cpp_lib_make_from_tuple = 201606; + +const int _LOCALE_CLASSES_TCC = 1; + +const int _GLIBCXX_SYSTEM_ERROR = 1; + +const int _GLIBCXX_ERROR_CONSTANTS = 1; + +const int _GLIBCXX_STDEXCEPT = 1; + +const int _GLIBXX_STREAMBUF = 1; + +const int _STREAMBUF_TCC = 1; + +const int _BASIC_IOS_H = 1; + +const int _LOCALE_FACETS_H = 1; + +const int _WCTYPE_H = 1; + +const int _BITS_WCTYPE_WCHAR_H = 1; + +const int _GLIBCXX_CWCTYPE = 1; + +const int _STREAMBUF_ITERATOR_H = 1; + +const int _GLIBCXX_NUM_FACETS = 14; + +const int _GLIBCXX_NUM_CXX11_FACETS = 8; + +const int _GLIBCXX_NUM_UNICODE_FACETS = 2; + +const int _GLIBCXX_NUM_LBDL_ALT128_FACETS = 6; + +const int _LOCALE_FACETS_TCC = 1; + +const int _BASIC_IOS_TCC = 1; + +const int _GLIBCXX_OSTREAM = 1; + +const int _OSTREAM_TCC = 1; + +const int _ISTREAM_TCC = 1; + +const int _SSTREAM_TCC = 1; + +const int __cpp_lib_complex_udls = 201309; + +const int _ASSERT_H = 1; + +const int __ASSERT_LINE = 1885; + +const int _GLIBCXX_FUNCTIONAL = 1; + +const int _GLIBCXX_STD_FUNCTION_H = 1; + +const int _GLIBCXX_UNORDERED_MAP = 1; + +const int _HASHTABLE_H = 1; + +const int _HASHTABLE_POLICY_H = 1; + +const int _ALIGNED_BUFFER_H = 1; + +const int _ENABLE_SPECIAL_MEMBERS_H = 1; + +const int _NODE_HANDLE = 1; + +const int __cpp_lib_node_extract = 201606; + +const int __cpp_lib_unordered_map_try_emplace = 201411; + +const int _GLIBCXX_ERASE_IF_H = 1; + +const int _GLIBCXX_VECTOR = 1; + +const int _STL_UNINITIALIZED_H = 1; + +const int __cpp_lib_raw_memory_algorithms = 201606; + +const int _STL_VECTOR_H = 1; + +const int _STL_BVECTOR_H = 1; + +const int _VECTOR_TCC = 1; + +const int _GLIBCXX_ARRAY = 1; + +const int _STL_ALGO_H = 1; + +const int _GLIBCXX_ALGORITHMFWD_H = 1; + +const int _STL_HEAP_H = 1; + +const int _STL_TEMPBUF_H = 1; + +const int __cpp_lib_clamp = 201603; + +const int __cpp_lib_sample = 201603; + +const int __cpp_lib_invoke = 201411; + +const int __cpp_lib_not_fn = 201603; + +const int __cpp_lib_boyer_moore_searcher = 201603; + +const int _STRING_H = 1; + +const int _STRINGS_H = 1; + +const int _GLIBCXX_CSTRING = 1; + +const int _LIBC_LIMITS_H_ = 1; + +const int MB_LEN_MAX = 16; + +const int LLONG_MIN = -9223372036854775808; + +const int LLONG_MAX = 9223372036854775807; + +const int ULLONG_MAX = -1; + +const int CHAR_WIDTH = 8; + +const int SCHAR_WIDTH = 8; + +const int UCHAR_WIDTH = 8; + +const int SHRT_WIDTH = 16; + +const int USHRT_WIDTH = 16; + +const int INT_WIDTH = 32; + +const int UINT_WIDTH = 32; + +const int LONG_WIDTH = 64; + +const int ULONG_WIDTH = 64; + +const int LLONG_WIDTH = 64; + +const int ULLONG_WIDTH = 64; + +const int BOOL_MAX = 1; + +const int BOOL_WIDTH = 1; + +const int _BITS_POSIX1_LIM_H = 1; + +const int _POSIX_AIO_LISTIO_MAX = 2; + +const int _POSIX_AIO_MAX = 1; + +const int _POSIX_ARG_MAX = 4096; + +const int _POSIX_CHILD_MAX = 25; + +const int _POSIX_DELAYTIMER_MAX = 32; + +const int _POSIX_HOST_NAME_MAX = 255; + +const int _POSIX_LINK_MAX = 8; + +const int _POSIX_LOGIN_NAME_MAX = 9; + +const int _POSIX_MAX_CANON = 255; + +const int _POSIX_MAX_INPUT = 255; + +const int _POSIX_MQ_OPEN_MAX = 8; + +const int _POSIX_MQ_PRIO_MAX = 32; + +const int _POSIX_NAME_MAX = 14; + +const int _POSIX_NGROUPS_MAX = 8; + +const int _POSIX_OPEN_MAX = 20; + +const int _POSIX_FD_SETSIZE = 20; + +const int _POSIX_PATH_MAX = 256; + +const int _POSIX_PIPE_BUF = 512; + +const int _POSIX_RE_DUP_MAX = 255; + +const int _POSIX_RTSIG_MAX = 8; + +const int _POSIX_SEM_NSEMS_MAX = 256; + +const int _POSIX_SEM_VALUE_MAX = 32767; + +const int _POSIX_SIGQUEUE_MAX = 32; + +const int _POSIX_SSIZE_MAX = 32767; + +const int _POSIX_STREAM_MAX = 8; + +const int _POSIX_SYMLINK_MAX = 255; + +const int _POSIX_SYMLOOP_MAX = 8; + +const int _POSIX_TIMER_MAX = 32; + +const int _POSIX_TTY_NAME_MAX = 9; + +const int _POSIX_TZNAME_MAX = 6; + +const int _POSIX_QLIMIT = 1; + +const int _POSIX_HIWAT = 512; + +const int _POSIX_UIO_MAXIOV = 16; + +const int _POSIX_CLOCKRES_MIN = 20000000; + +const int NGROUPS_MAX = 65536; + +const int MAX_CANON = 255; + +const int MAX_INPUT = 255; + +const int NAME_MAX = 255; + +const int PATH_MAX = 4096; + +const int PIPE_BUF = 4096; + +const int XATTR_NAME_MAX = 255; + +const int XATTR_SIZE_MAX = 65536; + +const int XATTR_LIST_MAX = 65536; + +const int RTSIG_MAX = 32; + +const int _POSIX_THREAD_KEYS_MAX = 128; + +const int PTHREAD_KEYS_MAX = 1024; + +const int _POSIX_THREAD_DESTRUCTOR_ITERATIONS = 4; + +const int PTHREAD_DESTRUCTOR_ITERATIONS = 4; + +const int _POSIX_THREAD_THREADS_MAX = 64; + +const int AIO_PRIO_DELTA_MAX = 20; + +const int DELAYTIMER_MAX = 2147483647; + +const int TTY_NAME_MAX = 32; + +const int LOGIN_NAME_MAX = 256; + +const int HOST_NAME_MAX = 64; + +const int MQ_PRIO_MAX = 32768; + +const int SEM_VALUE_MAX = 2147483647; + +const int SSIZE_MAX = 9223372036854775807; + +const int _BITS_POSIX2_LIM_H = 1; + +const int _POSIX2_BC_BASE_MAX = 99; + +const int _POSIX2_BC_DIM_MAX = 2048; + +const int _POSIX2_BC_SCALE_MAX = 99; + +const int _POSIX2_BC_STRING_MAX = 1000; + +const int _POSIX2_COLL_WEIGHTS_MAX = 2; + +const int _POSIX2_EXPR_NEST_MAX = 32; + +const int _POSIX2_LINE_MAX = 2048; + +const int _POSIX2_RE_DUP_MAX = 255; + +const int _POSIX2_CHARCLASS_NAME_MAX = 14; + +const int BC_BASE_MAX = 99; + +const int BC_DIM_MAX = 2048; + +const int BC_SCALE_MAX = 99; + +const int BC_STRING_MAX = 1000; + +const int COLL_WEIGHTS_MAX = 255; + +const int EXPR_NEST_MAX = 32; + +const int LINE_MAX = 2048; + +const int CHARCLASS_NAME_MAX = 2048; + +const int RE_DUP_MAX = 32767; + +const int _XOPEN_LIM_H = 1; + +const int _XOPEN_IOV_MAX = 16; + +const int _BITS_UIO_LIM_H = 1; + +const int __IOV_MAX = 1024; + +const int IOV_MAX = 1024; + +const int NL_ARGMAX = 4096; + +const int NL_LANGMAX = 2048; + +const int NL_MSGMAX = 2147483647; + +const int NL_NMAX = 2147483647; + +const int NL_SETMAX = 2147483647; + +const int NL_TEXTMAX = 2147483647; + +const int NZERO = 20; + +const int WORD_BIT = 32; + +const int LONG_BIT = 64; + +const int SCHAR_MAX = 127; + +const int SHRT_MAX = 32767; + +const int INT_MAX = 2147483647; + +const int LONG_MAX = 9223372036854775807; + +const int SCHAR_MIN = -128; + +const int SHRT_MIN = -32768; + +const int INT_MIN = -2147483648; + +const int LONG_MIN = -9223372036854775808; + +const int UCHAR_MAX = 255; + +const int USHRT_MAX = 65535; + +const int UINT_MAX = 4294967295; + +const int ULONG_MAX = -1; + +const int CHAR_BIT = 8; + +const int CHAR_MIN = -128; + +const int CHAR_MAX = 127; + +const int LONG_LONG_MAX = 9223372036854775807; + +const int LONG_LONG_MIN = -9223372036854775808; + +const int ULONG_LONG_MAX = -1; + +const int _GLIBCXX_CLIMITS = 1; + +const int _GLIBCXX_ALGORITHM = 1; + +const int _PSTL_ALGORITHM_FORWARD_DECLARED = 1; + +const int __cpp_lib_parallel_algorithm = 201603; + +const int _GLIBCXX_CSTDINT = 1; + +const int _STDINT_H = 1; + +const int _BITS_STDINT_UINTN_H = 1; + +const int INT8_MIN = -128; + +const int INT16_MIN = -32768; + +const int INT32_MIN = -2147483648; + +const int INT64_MIN = -9223372036854775808; + +const int INT8_MAX = 127; + +const int INT16_MAX = 32767; + +const int INT32_MAX = 2147483647; + +const int INT64_MAX = 9223372036854775807; + +const int UINT8_MAX = 255; + +const int UINT16_MAX = 65535; + +const int UINT32_MAX = 4294967295; + +const int UINT64_MAX = -1; + +const int INT_LEAST8_MIN = -128; + +const int INT_LEAST16_MIN = -32768; + +const int INT_LEAST32_MIN = -2147483648; + +const int INT_LEAST64_MIN = -9223372036854775808; + +const int INT_LEAST8_MAX = 127; + +const int INT_LEAST16_MAX = 32767; + +const int INT_LEAST32_MAX = 2147483647; + +const int INT_LEAST64_MAX = 9223372036854775807; + +const int UINT_LEAST8_MAX = 255; + +const int UINT_LEAST16_MAX = 65535; + +const int UINT_LEAST32_MAX = 4294967295; + +const int UINT_LEAST64_MAX = -1; + +const int INT_FAST8_MIN = -128; + +const int INT_FAST16_MIN = -9223372036854775808; + +const int INT_FAST32_MIN = -9223372036854775808; + +const int INT_FAST64_MIN = -9223372036854775808; + +const int INT_FAST8_MAX = 127; + +const int INT_FAST16_MAX = 9223372036854775807; + +const int INT_FAST32_MAX = 9223372036854775807; + +const int INT_FAST64_MAX = 9223372036854775807; + +const int UINT_FAST8_MAX = 255; + +const int UINT_FAST16_MAX = -1; + +const int UINT_FAST32_MAX = -1; + +const int UINT_FAST64_MAX = -1; + +const int INTPTR_MIN = -9223372036854775808; + +const int INTPTR_MAX = 9223372036854775807; + +const int UINTPTR_MAX = -1; + +const int INTMAX_MIN = -9223372036854775808; + +const int INTMAX_MAX = 9223372036854775807; + +const int UINTMAX_MAX = -1; + +const int PTRDIFF_MIN = -9223372036854775808; + +const int PTRDIFF_MAX = 9223372036854775807; + +const int SIG_ATOMIC_MIN = -2147483648; + +const int SIG_ATOMIC_MAX = 2147483647; + +const int SIZE_MAX = -1; + +const int WINT_MIN = 0; + +const int WINT_MAX = 4294967295; + +const int INT8_WIDTH = 8; + +const int UINT8_WIDTH = 8; + +const int INT16_WIDTH = 16; + +const int UINT16_WIDTH = 16; + +const int INT32_WIDTH = 32; + +const int UINT32_WIDTH = 32; + +const int INT64_WIDTH = 64; + +const int UINT64_WIDTH = 64; + +const int INT_LEAST8_WIDTH = 8; + +const int UINT_LEAST8_WIDTH = 8; + +const int INT_LEAST16_WIDTH = 16; + +const int UINT_LEAST16_WIDTH = 16; + +const int INT_LEAST32_WIDTH = 32; + +const int UINT_LEAST32_WIDTH = 32; + +const int INT_LEAST64_WIDTH = 64; + +const int UINT_LEAST64_WIDTH = 64; + +const int INT_FAST8_WIDTH = 8; + +const int UINT_FAST8_WIDTH = 8; + +const int INT_FAST16_WIDTH = 64; + +const int UINT_FAST16_WIDTH = 64; + +const int INT_FAST32_WIDTH = 64; + +const int UINT_FAST32_WIDTH = 64; + +const int INT_FAST64_WIDTH = 64; + +const int UINT_FAST64_WIDTH = 64; + +const int INTPTR_WIDTH = 64; + +const int UINTPTR_WIDTH = 64; + +const int INTMAX_WIDTH = 64; + +const int UINTMAX_WIDTH = 64; + +const int PTRDIFF_WIDTH = 64; + +const int SIG_ATOMIC_WIDTH = 32; + +const int SIZE_WIDTH = 64; + +const int WCHAR_WIDTH = 32; + +const int WINT_WIDTH = 32; + +const int EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED = 1; + +const int EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED = 0; + +const int EIGEN_MALLOC_ALREADY_ALIGNED = 1; + +const double EIGEN_PI = 3.141592653589793; + +const double EIGEN_LOG2E = 1.4426950408889634; + +const double EIGEN_LN2 = 0.6931471805599453; + +const int EIGEN_USE_STD_FPCLASSIFY = 1; + +const int EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD = 8; + +const int EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS = 16; + +const int EIGEN_UNROLLING_LIMIT = 110; + +const int EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH = 8; + +const int EIGEN_GEMM_TO_COEFFBASED_THRESHOLD = 20; + +const int _GLIBCXX_ATOMIC = 1; + +const int _GLIBCXX_ATOMIC_BASE_H = 1; + +const int _GLIBCXX_ATOMIC_LOCK_FREE_H = 1; + +const int ATOMIC_BOOL_LOCK_FREE = 2; + +const int ATOMIC_CHAR_LOCK_FREE = 2; + +const int ATOMIC_WCHAR_T_LOCK_FREE = 2; + +const int ATOMIC_CHAR16_T_LOCK_FREE = 2; + +const int ATOMIC_CHAR32_T_LOCK_FREE = 2; + +const int ATOMIC_SHORT_LOCK_FREE = 2; + +const int ATOMIC_INT_LOCK_FREE = 2; + +const int ATOMIC_LONG_LOCK_FREE = 2; + +const int ATOMIC_LLONG_LOCK_FREE = 2; + +const int ATOMIC_POINTER_LOCK_FREE = 2; + +const int __cpp_lib_atomic_is_always_lock_free = 201603; + +const int _GLIBCXX_ITERATOR = 1; + +const int _STREAM_ITERATOR_H = 1; + +const int __cpp_lib_null_iterators = 201304; + +const int _GLIBCXX_FSTREAM = 1; + +const int _CODECVT_H = 1; + +const int _GLIBCXX_BASIC_FILE_STDIO_H = 1; + +const int _GLIBCXX_CXX_IO_H = 1; + +const int _GLIBCXX_BUFSIZ = 8192; + +const int _FSTREAM_TCC = 1; + +const int _GLIBCXX_MAP = 1; + +const int _STL_TREE_H = 1; + +const int __cpp_lib_generic_associative_lookup = 201304; + +const int _STL_MAP_H = 1; + +const int __cpp_lib_map_try_emplace = 201411; + +const int _STL_MULTIMAP_H = 1; + +const int _GLIBCXX_MEMORY = 1; + +const int _STL_RAW_STORAGE_ITERATOR_H = 1; + +const int _GLIBCXX_ALIGN_H = 1; + +const int _UNIQUE_PTR_H = 1; + +const int __cpp_lib_make_unique = 201304; + +const int _SHARED_PTR_H = 1; + +const int _SHARED_PTR_BASE_H = 1; + +const int _ALLOCATED_PTR_H = 1; + +const int _CONCURRENCE_H = 1; + +const int __cpp_lib_shared_ptr_arrays = 201611; + +const int __cpp_lib_shared_ptr_weak_type = 201606; + +const int __cpp_lib_enable_shared_from_this = 201603; + +const int _SHARED_PTR_ATOMIC_H = 1; + +const int _BACKWARD_AUTO_PTR_H = 1; + +const int _GLIBCXX_IOSTREAM = 1; + +const int _GLIBCXX_FORWARD_LIST = 1; + +const int _FORWARD_LIST_H = 1; + +const int _FORWARD_LIST_TCC = 1; + +const int _GLIBCXX_SET = 1; + +const int _STL_SET_H = 1; + +const int _STL_MULTISET_H = 1; + +const int _GLIBCXX_UTILITY = 1; + +const int _STL_RELOPS_H = 1; + +const int __cpp_lib_exchange_function = 201304; + +const int __cpp_lib_as_const = 201510; + +const int _GLIBCXX_NUMERIC = 1; + +const int _STL_NUMERIC_H = 1; + +const int __cpp_lib_gcd_lcm = 201606; + +const int __cpp_lib_gcd = 201606; + +const int __cpp_lib_lcm = 201606; + +const int _PSTL_NUMERIC_FORWARD_DECLARED = 1; + +const int _GLIBCXX_MUTEX = 1; + +const int _GLIBCXX_CHRONO_H = 1; + +const int _GLIBCXX_RATIO = 1; + +const int _GLIBCXX_CTIME = 1; + +const int _GLIBCXX_PARSE_NUMBERS_H = 1; + +const int __cpp_lib_chrono = 201611; + +const int __cpp_lib_chrono_udls = 201304; + +const int _GLIBCXX_MUTEX_H = 1; + +const int _GLIBCXX_UNIQUE_LOCK_H = 1; + +const int __cpp_lib_scoped_lock = 201703; + +const int _UNISTD_H = 1; + +const int _POSIX_VERSION = 200809; + +const int __POSIX2_THIS_VERSION = 200809; + +const int _POSIX2_VERSION = 200809; + +const int _POSIX2_C_VERSION = 200809; + +const int _POSIX2_C_BIND = 200809; + +const int _POSIX2_C_DEV = 200809; + +const int _POSIX2_SW_DEV = 200809; + +const int _POSIX2_LOCALEDEF = 200809; + +const int _XOPEN_VERSION = 700; + +const int _XOPEN_XCU_VERSION = 4; + +const int _XOPEN_XPG2 = 1; + +const int _XOPEN_XPG3 = 1; + +const int _XOPEN_XPG4 = 1; + +const int _XOPEN_UNIX = 1; + +const int _XOPEN_ENH_I18N = 1; + +const int _XOPEN_LEGACY = 1; + +const int _BITS_POSIX_OPT_H = 1; + +const int _POSIX_JOB_CONTROL = 1; + +const int _POSIX_SAVED_IDS = 1; + +const int _POSIX_PRIORITY_SCHEDULING = 200809; + +const int _POSIX_SYNCHRONIZED_IO = 200809; + +const int _POSIX_FSYNC = 200809; + +const int _POSIX_MAPPED_FILES = 200809; + +const int _POSIX_MEMLOCK = 200809; + +const int _POSIX_MEMLOCK_RANGE = 200809; + +const int _POSIX_MEMORY_PROTECTION = 200809; + +const int _POSIX_CHOWN_RESTRICTED = 0; + +const int _POSIX_VDISABLE = 0; + +const int _POSIX_NO_TRUNC = 1; + +const int _XOPEN_REALTIME = 1; + +const int _XOPEN_REALTIME_THREADS = 1; + +const int _XOPEN_SHM = 1; + +const int _POSIX_THREADS = 200809; + +const int _POSIX_REENTRANT_FUNCTIONS = 1; + +const int _POSIX_THREAD_SAFE_FUNCTIONS = 200809; + +const int _POSIX_THREAD_PRIORITY_SCHEDULING = 200809; + +const int _POSIX_THREAD_ATTR_STACKSIZE = 200809; + +const int _POSIX_THREAD_ATTR_STACKADDR = 200809; + +const int _POSIX_THREAD_PRIO_INHERIT = 200809; + +const int _POSIX_THREAD_PRIO_PROTECT = 200809; + +const int _POSIX_THREAD_ROBUST_PRIO_INHERIT = 200809; + +const int _POSIX_THREAD_ROBUST_PRIO_PROTECT = -1; + +const int _POSIX_SEMAPHORES = 200809; + +const int _POSIX_REALTIME_SIGNALS = 200809; + +const int _POSIX_ASYNCHRONOUS_IO = 200809; + +const int _POSIX_ASYNC_IO = 1; + +const int _LFS_ASYNCHRONOUS_IO = 1; + +const int _POSIX_PRIORITIZED_IO = 200809; + +const int _LFS64_ASYNCHRONOUS_IO = 1; + +const int _LFS_LARGEFILE = 1; + +const int _LFS64_LARGEFILE = 1; + +const int _LFS64_STDIO = 1; + +const int _POSIX_SHARED_MEMORY_OBJECTS = 200809; + +const int _POSIX_CPUTIME = 0; + +const int _POSIX_THREAD_CPUTIME = 0; + +const int _POSIX_REGEXP = 1; + +const int _POSIX_READER_WRITER_LOCKS = 200809; + +const int _POSIX_SHELL = 1; + +const int _POSIX_TIMEOUTS = 200809; + +const int _POSIX_SPIN_LOCKS = 200809; + +const int _POSIX_SPAWN = 200809; + +const int _POSIX_TIMERS = 200809; + +const int _POSIX_BARRIERS = 200809; + +const int _POSIX_MESSAGE_PASSING = 200809; + +const int _POSIX_THREAD_PROCESS_SHARED = 200809; + +const int _POSIX_MONOTONIC_CLOCK = 0; + +const int _POSIX_CLOCK_SELECTION = 200809; + +const int _POSIX_ADVISORY_INFO = 200809; + +const int _POSIX_IPV6 = 200809; + +const int _POSIX_RAW_SOCKETS = 200809; + +const int _POSIX2_CHAR_TERM = 200809; + +const int _POSIX_SPORADIC_SERVER = -1; + +const int _POSIX_THREAD_SPORADIC_SERVER = -1; + +const int _POSIX_TRACE = -1; + +const int _POSIX_TRACE_EVENT_FILTER = -1; + +const int _POSIX_TRACE_INHERIT = -1; + +const int _POSIX_TRACE_LOG = -1; + +const int _POSIX_TYPED_MEMORY_OBJECTS = -1; + +const int _POSIX_V7_LPBIG_OFFBIG = -1; + +const int _POSIX_V6_LPBIG_OFFBIG = -1; + +const int _XBS5_LPBIG_OFFBIG = -1; + +const int _POSIX_V7_LP64_OFF64 = 1; + +const int _POSIX_V6_LP64_OFF64 = 1; + +const int _XBS5_LP64_OFF64 = 1; + +const String __ILP32_OFF32_CFLAGS = '-m32'; + +const String __ILP32_OFF32_LDFLAGS = '-m32'; + +const String __ILP32_OFFBIG_CFLAGS = + '-m32 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'; + +const String __ILP32_OFFBIG_LDFLAGS = '-m32'; + +const String __LP64_OFF64_CFLAGS = '-m64'; + +const String __LP64_OFF64_LDFLAGS = '-m64'; + +const int STDIN_FILENO = 0; + +const int STDOUT_FILENO = 1; + +const int STDERR_FILENO = 2; + +const int R_OK = 4; + +const int W_OK = 2; + +const int X_OK = 1; + +const int F_OK = 0; + +const int L_SET = 0; + +const int L_INCR = 1; + +const int L_XTND = 2; + +const int _PC_LINK_MAX = 0; + +const int _PC_MAX_CANON = 1; + +const int _PC_MAX_INPUT = 2; + +const int _PC_NAME_MAX = 3; + +const int _PC_PATH_MAX = 4; + +const int _PC_PIPE_BUF = 5; + +const int _PC_CHOWN_RESTRICTED = 6; + +const int _PC_NO_TRUNC = 7; + +const int _PC_VDISABLE = 8; + +const int _PC_SYNC_IO = 9; + +const int _PC_ASYNC_IO = 10; + +const int _PC_PRIO_IO = 11; + +const int _PC_SOCK_MAXBUF = 12; + +const int _PC_FILESIZEBITS = 13; + +const int _PC_REC_INCR_XFER_SIZE = 14; + +const int _PC_REC_MAX_XFER_SIZE = 15; + +const int _PC_REC_MIN_XFER_SIZE = 16; + +const int _PC_REC_XFER_ALIGN = 17; + +const int _PC_ALLOC_SIZE_MIN = 18; + +const int _PC_SYMLINK_MAX = 19; + +const int _PC_2_SYMLINKS = 20; + +const int _SC_ARG_MAX = 0; + +const int _SC_CHILD_MAX = 1; + +const int _SC_CLK_TCK = 2; + +const int _SC_NGROUPS_MAX = 3; + +const int _SC_OPEN_MAX = 4; + +const int _SC_STREAM_MAX = 5; + +const int _SC_TZNAME_MAX = 6; + +const int _SC_JOB_CONTROL = 7; + +const int _SC_SAVED_IDS = 8; + +const int _SC_REALTIME_SIGNALS = 9; + +const int _SC_PRIORITY_SCHEDULING = 10; + +const int _SC_TIMERS = 11; + +const int _SC_ASYNCHRONOUS_IO = 12; + +const int _SC_PRIORITIZED_IO = 13; + +const int _SC_SYNCHRONIZED_IO = 14; + +const int _SC_FSYNC = 15; + +const int _SC_MAPPED_FILES = 16; + +const int _SC_MEMLOCK = 17; + +const int _SC_MEMLOCK_RANGE = 18; + +const int _SC_MEMORY_PROTECTION = 19; + +const int _SC_MESSAGE_PASSING = 20; + +const int _SC_SEMAPHORES = 21; + +const int _SC_SHARED_MEMORY_OBJECTS = 22; + +const int _SC_AIO_LISTIO_MAX = 23; + +const int _SC_AIO_MAX = 24; + +const int _SC_AIO_PRIO_DELTA_MAX = 25; + +const int _SC_DELAYTIMER_MAX = 26; + +const int _SC_MQ_OPEN_MAX = 27; + +const int _SC_MQ_PRIO_MAX = 28; + +const int _SC_VERSION = 29; + +const int _SC_PAGESIZE = 30; + +const int _SC_PAGE_SIZE = 30; + +const int _SC_RTSIG_MAX = 31; + +const int _SC_SEM_NSEMS_MAX = 32; + +const int _SC_SEM_VALUE_MAX = 33; + +const int _SC_SIGQUEUE_MAX = 34; + +const int _SC_TIMER_MAX = 35; + +const int _SC_BC_BASE_MAX = 36; + +const int _SC_BC_DIM_MAX = 37; + +const int _SC_BC_SCALE_MAX = 38; + +const int _SC_BC_STRING_MAX = 39; + +const int _SC_COLL_WEIGHTS_MAX = 40; + +const int _SC_EQUIV_CLASS_MAX = 41; + +const int _SC_EXPR_NEST_MAX = 42; + +const int _SC_LINE_MAX = 43; + +const int _SC_RE_DUP_MAX = 44; + +const int _SC_CHARCLASS_NAME_MAX = 45; + +const int _SC_2_VERSION = 46; + +const int _SC_2_C_BIND = 47; + +const int _SC_2_C_DEV = 48; + +const int _SC_2_FORT_DEV = 49; + +const int _SC_2_FORT_RUN = 50; + +const int _SC_2_SW_DEV = 51; + +const int _SC_2_LOCALEDEF = 52; + +const int _SC_PII = 53; + +const int _SC_PII_XTI = 54; + +const int _SC_PII_SOCKET = 55; + +const int _SC_PII_INTERNET = 56; + +const int _SC_PII_OSI = 57; + +const int _SC_POLL = 58; + +const int _SC_SELECT = 59; + +const int _SC_UIO_MAXIOV = 60; + +const int _SC_IOV_MAX = 60; + +const int _SC_PII_INTERNET_STREAM = 61; + +const int _SC_PII_INTERNET_DGRAM = 62; + +const int _SC_PII_OSI_COTS = 63; + +const int _SC_PII_OSI_CLTS = 64; + +const int _SC_PII_OSI_M = 65; + +const int _SC_T_IOV_MAX = 66; + +const int _SC_THREADS = 67; + +const int _SC_THREAD_SAFE_FUNCTIONS = 68; + +const int _SC_GETGR_R_SIZE_MAX = 69; + +const int _SC_GETPW_R_SIZE_MAX = 70; + +const int _SC_LOGIN_NAME_MAX = 71; + +const int _SC_TTY_NAME_MAX = 72; + +const int _SC_THREAD_DESTRUCTOR_ITERATIONS = 73; + +const int _SC_THREAD_KEYS_MAX = 74; + +const int _SC_THREAD_STACK_MIN = 75; + +const int _SC_THREAD_THREADS_MAX = 76; + +const int _SC_THREAD_ATTR_STACKADDR = 77; + +const int _SC_THREAD_ATTR_STACKSIZE = 78; + +const int _SC_THREAD_PRIORITY_SCHEDULING = 79; + +const int _SC_THREAD_PRIO_INHERIT = 80; + +const int _SC_THREAD_PRIO_PROTECT = 81; + +const int _SC_THREAD_PROCESS_SHARED = 82; + +const int _SC_NPROCESSORS_CONF = 83; + +const int _SC_NPROCESSORS_ONLN = 84; + +const int _SC_PHYS_PAGES = 85; + +const int _SC_AVPHYS_PAGES = 86; + +const int _SC_ATEXIT_MAX = 87; + +const int _SC_PASS_MAX = 88; + +const int _SC_XOPEN_VERSION = 89; + +const int _SC_XOPEN_XCU_VERSION = 90; + +const int _SC_XOPEN_UNIX = 91; + +const int _SC_XOPEN_CRYPT = 92; + +const int _SC_XOPEN_ENH_I18N = 93; + +const int _SC_XOPEN_SHM = 94; + +const int _SC_2_CHAR_TERM = 95; + +const int _SC_2_C_VERSION = 96; + +const int _SC_2_UPE = 97; + +const int _SC_XOPEN_XPG2 = 98; + +const int _SC_XOPEN_XPG3 = 99; + +const int _SC_XOPEN_XPG4 = 100; + +const int _SC_CHAR_BIT = 101; + +const int _SC_CHAR_MAX = 102; + +const int _SC_CHAR_MIN = 103; + +const int _SC_INT_MAX = 104; + +const int _SC_INT_MIN = 105; + +const int _SC_LONG_BIT = 106; + +const int _SC_WORD_BIT = 107; + +const int _SC_MB_LEN_MAX = 108; + +const int _SC_NZERO = 109; + +const int _SC_SSIZE_MAX = 110; + +const int _SC_SCHAR_MAX = 111; + +const int _SC_SCHAR_MIN = 112; + +const int _SC_SHRT_MAX = 113; + +const int _SC_SHRT_MIN = 114; + +const int _SC_UCHAR_MAX = 115; + +const int _SC_UINT_MAX = 116; + +const int _SC_ULONG_MAX = 117; + +const int _SC_USHRT_MAX = 118; + +const int _SC_NL_ARGMAX = 119; + +const int _SC_NL_LANGMAX = 120; + +const int _SC_NL_MSGMAX = 121; + +const int _SC_NL_NMAX = 122; + +const int _SC_NL_SETMAX = 123; + +const int _SC_NL_TEXTMAX = 124; + +const int _SC_XBS5_ILP32_OFF32 = 125; + +const int _SC_XBS5_ILP32_OFFBIG = 126; + +const int _SC_XBS5_LP64_OFF64 = 127; + +const int _SC_XBS5_LPBIG_OFFBIG = 128; + +const int _SC_XOPEN_LEGACY = 129; + +const int _SC_XOPEN_REALTIME = 130; + +const int _SC_XOPEN_REALTIME_THREADS = 131; + +const int _SC_ADVISORY_INFO = 132; + +const int _SC_BARRIERS = 133; + +const int _SC_BASE = 134; + +const int _SC_C_LANG_SUPPORT = 135; + +const int _SC_C_LANG_SUPPORT_R = 136; + +const int _SC_CLOCK_SELECTION = 137; + +const int _SC_CPUTIME = 138; + +const int _SC_THREAD_CPUTIME = 139; + +const int _SC_DEVICE_IO = 140; + +const int _SC_DEVICE_SPECIFIC = 141; + +const int _SC_DEVICE_SPECIFIC_R = 142; + +const int _SC_FD_MGMT = 143; + +const int _SC_FIFO = 144; + +const int _SC_PIPE = 145; + +const int _SC_FILE_ATTRIBUTES = 146; + +const int _SC_FILE_LOCKING = 147; + +const int _SC_FILE_SYSTEM = 148; + +const int _SC_MONOTONIC_CLOCK = 149; + +const int _SC_MULTI_PROCESS = 150; + +const int _SC_SINGLE_PROCESS = 151; + +const int _SC_NETWORKING = 152; + +const int _SC_READER_WRITER_LOCKS = 153; + +const int _SC_SPIN_LOCKS = 154; + +const int _SC_REGEXP = 155; + +const int _SC_REGEX_VERSION = 156; + +const int _SC_SHELL = 157; + +const int _SC_SIGNALS = 158; + +const int _SC_SPAWN = 159; + +const int _SC_SPORADIC_SERVER = 160; + +const int _SC_THREAD_SPORADIC_SERVER = 161; + +const int _SC_SYSTEM_DATABASE = 162; + +const int _SC_SYSTEM_DATABASE_R = 163; + +const int _SC_TIMEOUTS = 164; + +const int _SC_TYPED_MEMORY_OBJECTS = 165; + +const int _SC_USER_GROUPS = 166; + +const int _SC_USER_GROUPS_R = 167; + +const int _SC_2_PBS = 168; + +const int _SC_2_PBS_ACCOUNTING = 169; + +const int _SC_2_PBS_LOCATE = 170; + +const int _SC_2_PBS_MESSAGE = 171; + +const int _SC_2_PBS_TRACK = 172; + +const int _SC_SYMLOOP_MAX = 173; + +const int _SC_STREAMS = 174; + +const int _SC_2_PBS_CHECKPOINT = 175; + +const int _SC_V6_ILP32_OFF32 = 176; + +const int _SC_V6_ILP32_OFFBIG = 177; + +const int _SC_V6_LP64_OFF64 = 178; + +const int _SC_V6_LPBIG_OFFBIG = 179; + +const int _SC_HOST_NAME_MAX = 180; + +const int _SC_TRACE = 181; + +const int _SC_TRACE_EVENT_FILTER = 182; + +const int _SC_TRACE_INHERIT = 183; + +const int _SC_TRACE_LOG = 184; + +const int _SC_LEVEL1_ICACHE_SIZE = 185; + +const int _SC_LEVEL1_ICACHE_ASSOC = 186; + +const int _SC_LEVEL1_ICACHE_LINESIZE = 187; + +const int _SC_LEVEL1_DCACHE_SIZE = 188; + +const int _SC_LEVEL1_DCACHE_ASSOC = 189; + +const int _SC_LEVEL1_DCACHE_LINESIZE = 190; + +const int _SC_LEVEL2_CACHE_SIZE = 191; + +const int _SC_LEVEL2_CACHE_ASSOC = 192; + +const int _SC_LEVEL2_CACHE_LINESIZE = 193; + +const int _SC_LEVEL3_CACHE_SIZE = 194; + +const int _SC_LEVEL3_CACHE_ASSOC = 195; + +const int _SC_LEVEL3_CACHE_LINESIZE = 196; + +const int _SC_LEVEL4_CACHE_SIZE = 197; + +const int _SC_LEVEL4_CACHE_ASSOC = 198; + +const int _SC_LEVEL4_CACHE_LINESIZE = 199; + +const int _SC_IPV6 = 235; + +const int _SC_RAW_SOCKETS = 236; + +const int _SC_V7_ILP32_OFF32 = 237; + +const int _SC_V7_ILP32_OFFBIG = 238; + +const int _SC_V7_LP64_OFF64 = 239; + +const int _SC_V7_LPBIG_OFFBIG = 240; + +const int _SC_SS_REPL_MAX = 241; + +const int _SC_TRACE_EVENT_NAME_MAX = 242; + +const int _SC_TRACE_NAME_MAX = 243; + +const int _SC_TRACE_SYS_MAX = 244; + +const int _SC_TRACE_USER_EVENT_MAX = 245; + +const int _SC_XOPEN_STREAMS = 246; + +const int _SC_THREAD_ROBUST_PRIO_INHERIT = 247; + +const int _SC_THREAD_ROBUST_PRIO_PROTECT = 248; + +const int _SC_MINSIGSTKSZ = 249; + +const int _SC_SIGSTKSZ = 250; + +const int _CS_PATH = 0; + +const int _CS_V6_WIDTH_RESTRICTED_ENVS = 1; + +const int _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS = 1; + +const int _CS_GNU_LIBC_VERSION = 2; + +const int _CS_GNU_LIBPTHREAD_VERSION = 3; + +const int _CS_V5_WIDTH_RESTRICTED_ENVS = 4; + +const int _CS_POSIX_V5_WIDTH_RESTRICTED_ENVS = 4; + +const int _CS_V7_WIDTH_RESTRICTED_ENVS = 5; + +const int _CS_POSIX_V7_WIDTH_RESTRICTED_ENVS = 5; + +const int _CS_LFS_CFLAGS = 1000; + +const int _CS_LFS_LDFLAGS = 1001; + +const int _CS_LFS_LIBS = 1002; + +const int _CS_LFS_LINTFLAGS = 1003; + +const int _CS_LFS64_CFLAGS = 1004; + +const int _CS_LFS64_LDFLAGS = 1005; + +const int _CS_LFS64_LIBS = 1006; + +const int _CS_LFS64_LINTFLAGS = 1007; + +const int _CS_XBS5_ILP32_OFF32_CFLAGS = 1100; + +const int _CS_XBS5_ILP32_OFF32_LDFLAGS = 1101; + +const int _CS_XBS5_ILP32_OFF32_LIBS = 1102; + +const int _CS_XBS5_ILP32_OFF32_LINTFLAGS = 1103; + +const int _CS_XBS5_ILP32_OFFBIG_CFLAGS = 1104; + +const int _CS_XBS5_ILP32_OFFBIG_LDFLAGS = 1105; + +const int _CS_XBS5_ILP32_OFFBIG_LIBS = 1106; + +const int _CS_XBS5_ILP32_OFFBIG_LINTFLAGS = 1107; + +const int _CS_XBS5_LP64_OFF64_CFLAGS = 1108; + +const int _CS_XBS5_LP64_OFF64_LDFLAGS = 1109; + +const int _CS_XBS5_LP64_OFF64_LIBS = 1110; + +const int _CS_XBS5_LP64_OFF64_LINTFLAGS = 1111; + +const int _CS_XBS5_LPBIG_OFFBIG_CFLAGS = 1112; + +const int _CS_XBS5_LPBIG_OFFBIG_LDFLAGS = 1113; + +const int _CS_XBS5_LPBIG_OFFBIG_LIBS = 1114; + +const int _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS = 1115; + +const int _CS_POSIX_V6_ILP32_OFF32_CFLAGS = 1116; + +const int _CS_POSIX_V6_ILP32_OFF32_LDFLAGS = 1117; + +const int _CS_POSIX_V6_ILP32_OFF32_LIBS = 1118; + +const int _CS_POSIX_V6_ILP32_OFF32_LINTFLAGS = 1119; + +const int _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS = 1120; + +const int _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS = 1121; + +const int _CS_POSIX_V6_ILP32_OFFBIG_LIBS = 1122; + +const int _CS_POSIX_V6_ILP32_OFFBIG_LINTFLAGS = 1123; + +const int _CS_POSIX_V6_LP64_OFF64_CFLAGS = 1124; + +const int _CS_POSIX_V6_LP64_OFF64_LDFLAGS = 1125; + +const int _CS_POSIX_V6_LP64_OFF64_LIBS = 1126; + +const int _CS_POSIX_V6_LP64_OFF64_LINTFLAGS = 1127; + +const int _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS = 1128; + +const int _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS = 1129; + +const int _CS_POSIX_V6_LPBIG_OFFBIG_LIBS = 1130; + +const int _CS_POSIX_V6_LPBIG_OFFBIG_LINTFLAGS = 1131; + +const int _CS_POSIX_V7_ILP32_OFF32_CFLAGS = 1132; + +const int _CS_POSIX_V7_ILP32_OFF32_LDFLAGS = 1133; + +const int _CS_POSIX_V7_ILP32_OFF32_LIBS = 1134; + +const int _CS_POSIX_V7_ILP32_OFF32_LINTFLAGS = 1135; + +const int _CS_POSIX_V7_ILP32_OFFBIG_CFLAGS = 1136; + +const int _CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS = 1137; + +const int _CS_POSIX_V7_ILP32_OFFBIG_LIBS = 1138; + +const int _CS_POSIX_V7_ILP32_OFFBIG_LINTFLAGS = 1139; + +const int _CS_POSIX_V7_LP64_OFF64_CFLAGS = 1140; + +const int _CS_POSIX_V7_LP64_OFF64_LDFLAGS = 1141; + +const int _CS_POSIX_V7_LP64_OFF64_LIBS = 1142; + +const int _CS_POSIX_V7_LP64_OFF64_LINTFLAGS = 1143; + +const int _CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS = 1144; + +const int _CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS = 1145; + +const int _CS_POSIX_V7_LPBIG_OFFBIG_LIBS = 1146; + +const int _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS = 1147; + +const int _CS_V6_ENV = 1148; + +const int _CS_V7_ENV = 1149; + +const int _GETOPT_POSIX_H = 1; + +const int _GETOPT_CORE_H = 1; + +const int F_ULOCK = 0; + +const int F_LOCK = 1; + +const int F_TLOCK = 2; + +const int F_TEST = 3; + +const int CLOSE_RANGE_UNSHARE = 2; + +const int CLOSE_RANGE_CLOEXEC = 4; + +const String PATH_SPLITTER = ':'; + +const int _GLIBCXX_BITSET = 1; + +const int _GLIBCXX_CHRONO = 1; + +const int _GLIBCXX_THREAD = 1; + +const int _GLIBCXX_THREAD_H = 1; + +const int _GLIBCXX_THIS_THREAD_SLEEP_H = 1; diff --git a/assets/test/frames/0001.png b/assets/test/frames/0001.png new file mode 100644 index 0000000..c97cbf3 Binary files /dev/null and b/assets/test/frames/0001.png differ diff --git a/example/linux/.gitignore b/example/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/example/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/example/linux/CMakeLists.txt b/example/linux/CMakeLists.txt new file mode 100644 index 0000000..efb8669 --- /dev/null +++ b/example/linux/CMakeLists.txt @@ -0,0 +1,145 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "archimedes_mobile_lib_example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.archimedes_mobile_lib") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/example/linux/flutter/CMakeLists.txt b/example/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..d5bd016 --- /dev/null +++ b/example/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/example/linux/main.cc b/example/linux/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/example/linux/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/example/linux/my_application.cc b/example/linux/my_application.cc new file mode 100644 index 0000000..740b3c5 --- /dev/null +++ b/example/linux/my_application.cc @@ -0,0 +1,124 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "archimedes_mobile_lib_example"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "archimedes_mobile_lib_example"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/example/linux/my_application.h b/example/linux/my_application.h new file mode 100644 index 0000000..72271d5 --- /dev/null +++ b/example/linux/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/ffigen.yaml b/ffigen.yaml index 581fb99..1b2680c 100644 --- a/ffigen.yaml +++ b/ffigen.yaml @@ -1,15 +1,16 @@ # Run with `flutter pub run ffigen --config ffigen.yaml`. name: ArchimedesMobileLibBindings description: | - Bindings for `src/archimedes_mobile_lib.h`. + Bindings for `src/image.h`. Regenerate bindings with `flutter pub run ffigen --config ffigen.yaml`. output: 'lib/archimedes_mobile_lib_bindings_generated.dart' +compiler-opts: '-I/usr/include -L /usr/lib/ -lpng' headers: entry-points: - - 'src/archimedes_mobile_lib.h' + - 'src/image.h' include-directives: - - 'src/archimedes_mobile_lib.h' + - 'src/image.h' preamble: | // ignore_for_file: always_specify_types // ignore_for_file: camel_case_types diff --git a/lib/archimedes_mobile_lib.dart b/lib/archimedes_mobile_lib.dart index 3572708..d1750a2 100644 --- a/lib/archimedes_mobile_lib.dart +++ b/lib/archimedes_mobile_lib.dart @@ -1,131 +1,59 @@ - -import 'dart:async'; +// import 'dart:async'; import 'dart:ffi'; import 'dart:io'; -import 'dart:isolate'; +import 'dart:typed_data'; +// import 'dart:isolate'; +// import 'dart:ui'; +import "package:ffi/ffi.dart"; +import "package:path/path.dart" show dirname, join; +import 'dart:io' show Platform; import 'archimedes_mobile_lib_bindings_generated.dart'; -/// A very short-lived native function. -/// -/// For very short-lived functions, it is fine to call them on the main isolate. -/// They will block the Dart execution while running the native function, so -/// only do this for native functions which are guaranteed to be short-lived. -int sum(int a, int b) => _bindings.sum(a, b); - -/// A longer lived native function, which occupies the thread calling it. -/// -/// Do not call these kind of native functions in the main isolate. They will -/// block Dart execution. This will cause dropped frames in Flutter applications. -/// Instead, call these native functions on a separate isolate. -/// -/// Modify this to suit your own use case. Example use cases: -/// -/// 1. Reuse a single isolate for various different kinds of requests. -/// 2. Use multiple helper isolates for parallel execution. -Future sumAsync(int a, int b) async { - final SendPort helperIsolateSendPort = await _helperIsolateSendPort; - final int requestId = _nextSumRequestId++; - final _SumRequest request = _SumRequest(requestId, a, b); - final Completer completer = Completer(); - _sumRequests[requestId] = completer; - helperIsolateSendPort.send(request); - return completer.future; -} - const String _libName = 'archimedes_mobile_lib'; +final here = dirname(Platform.script.path); +final build = join(dirname(here), "build"); /// The dynamic library in which the symbols for [ArchimedesMobileLibBindings] can be found. final DynamicLibrary _dylib = () { if (Platform.isMacOS || Platform.isIOS) { - return DynamicLibrary.open('$_libName.framework/$_libName'); + return DynamicLibrary.open(join(build, '$_libName.framework', _libName)); } if (Platform.isAndroid || Platform.isLinux) { - return DynamicLibrary.open('lib$_libName.so'); + return DynamicLibrary.open(join(build, 'lib$_libName.so')); } if (Platform.isWindows) { - return DynamicLibrary.open('$_libName.dll'); + return DynamicLibrary.open(join('$_libName.dll')); } throw UnsupportedError('Unknown platform: ${Platform.operatingSystem}'); }(); /// The bindings to the native functions in [_dylib]. -final ArchimedesMobileLibBindings _bindings = ArchimedesMobileLibBindings(_dylib); +final ArchimedesMobileLibBindings _bindings = + ArchimedesMobileLibBindings(_dylib); +int getImageData(Pointer frame, Pointer data) => + _bindings.archimedes_get_image_data(frame, data); -/// A request to compute `sum`. -/// -/// Typically sent from one isolate to another. -class _SumRequest { - final int id; - final int a; - final int b; +Pointer newFrame( + Pointer data, int dataLen, int w, int h, int depth) => + _bindings.new_frame_from_data(data, dataLen, w, h, depth); - const _SumRequest(this.id, this.a, this.b); +void main(List arguments) { + final assets = join(dirname(here), "assets"); + final testFrames = join(assets, "test", "frames"); + final firstFrame = join(testFrames, "0001.png"); + final f = File(firstFrame); + final l = f.readAsBytesSync().cast(); + final myPointer = malloc(l.length); + for (int i = 0; i < l.length; ++i) { + myPointer[i] = l[i]; + print(myPointer[i]); + } + + Pointer frame = newFrame(myPointer, l.length, 768, 768, 64); + + Pointer data = malloc(l.length * 4); + + getImageData(frame, data); } - -/// A response with the result of `sum`. -/// -/// Typically sent from one isolate to another. -class _SumResponse { - final int id; - final int result; - - const _SumResponse(this.id, this.result); -} - -/// Counter to identify [_SumRequest]s and [_SumResponse]s. -int _nextSumRequestId = 0; - -/// Mapping from [_SumRequest] `id`s to the completers corresponding to the correct future of the pending request. -final Map> _sumRequests = >{}; - -/// The SendPort belonging to the helper isolate. -Future _helperIsolateSendPort = () async { - // The helper isolate is going to send us back a SendPort, which we want to - // wait for. - final Completer completer = Completer(); - - // Receive port on the main isolate to receive messages from the helper. - // We receive two types of messages: - // 1. A port to send messages on. - // 2. Responses to requests we sent. - final ReceivePort receivePort = ReceivePort() - ..listen((dynamic data) { - if (data is SendPort) { - // The helper isolate sent us the port on which we can sent it requests. - completer.complete(data); - return; - } - if (data is _SumResponse) { - // The helper isolate sent us a response to a request we sent. - final Completer completer = _sumRequests[data.id]!; - _sumRequests.remove(data.id); - completer.complete(data.result); - return; - } - throw UnsupportedError('Unsupported message type: ${data.runtimeType}'); - }); - - // Start the helper isolate. - await Isolate.spawn((SendPort sendPort) async { - final ReceivePort helperReceivePort = ReceivePort() - ..listen((dynamic data) { - // On the helper isolate listen to requests and respond to them. - if (data is _SumRequest) { - final int result = _bindings.sum_long_running(data.a, data.b); - final _SumResponse response = _SumResponse(data.id, result); - sendPort.send(response); - return; - } - throw UnsupportedError('Unsupported message type: ${data.runtimeType}'); - }); - - // Send the port to the main isolate on which we can receive requests. - sendPort.send(helperReceivePort.sendPort); - }, receivePort.sendPort); - - // Wait until the helper isolate has sent us back the SendPort on which we - // can start sending requests. - return completer.future; -}(); diff --git a/lib/archimedes_mobile_lib_bindings_generated.dart b/lib/archimedes_mobile_lib_bindings_generated.dart index 53fda95..5cb679b 100644 --- a/lib/archimedes_mobile_lib_bindings_generated.dart +++ b/lib/archimedes_mobile_lib_bindings_generated.dart @@ -8,7 +8,7 @@ // ignore_for_file: type=lint import 'dart:ffi' as ffi; -/// Bindings for `src/archimedes_mobile_lib.h`. +/// Bindings for `src/image.h`. /// /// Regenerate bindings with `flutter pub run ffigen --config ffigen.yaml`. /// @@ -27,44 +27,164 @@ class ArchimedesMobileLibBindings { lookup) : _lookup = lookup; - /// A very short-lived native function. - /// - /// For very short-lived functions, it is fine to call them on the main isolate. - /// They will block the Dart execution while running the native function, so - /// only do this for native functions which are guaranteed to be short-lived. - int sum( - int a, - int b, + ffi.Pointer new_frame_from_handle( + ffi.Pointer arg0, + int arg1, + int arg2, + int arg3, ) { - return _sum( - a, - b, + return _new_frame_from_handle( + arg0, + arg1, + arg2, + arg3, ); } - late final _sumPtr = - _lookup>( - 'sum'); - late final _sum = _sumPtr.asFunction(); + late final _new_frame_from_handlePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, ffi.Int, ffi.Int, + ffi.Int)>>('new_frame_from_handle'); + late final _new_frame_from_handle = _new_frame_from_handlePtr.asFunction< + ffi.Pointer Function(ffi.Pointer, int, int, int)>(); - /// A longer lived native function, which occupies the thread calling it. - /// - /// Do not call these kind of native functions in the main isolate. They will - /// block Dart execution. This will cause dropped frames in Flutter applications. - /// Instead, call these native functions on a separate isolate. - int sum_long_running( - int a, - int b, + ffi.Pointer new_frame_from_data( + ffi.Pointer arg0, + int arg1, + int arg2, + int arg3, + int arg4, ) { - return _sum_long_running( - a, - b, + return _new_frame_from_data( + arg0, + arg1, + arg2, + arg3, + arg4, ); } - late final _sum_long_runningPtr = - _lookup>( - 'sum_long_running'); - late final _sum_long_running = - _sum_long_runningPtr.asFunction(); + late final _new_frame_from_dataPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, ffi.Size, ffi.Int, + ffi.Int, ffi.Int)>>('new_frame_from_data'); + late final _new_frame_from_data = _new_frame_from_dataPtr.asFunction< + ffi.Pointer Function( + ffi.Pointer, int, int, int, int)>(); + + int archimedes_get_image_data( + ffi.Pointer arg0, + ffi.Pointer arg1, + ) { + return _archimedes_get_image_data( + arg0, + arg1, + ); + } + + late final _archimedes_get_image_dataPtr = _lookup< + ffi.NativeFunction< + ffi.Int Function(ffi.Pointer, + ffi.Pointer)>>('archimedes_get_image_data'); + late final _archimedes_get_image_data = + _archimedes_get_image_dataPtr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); } + +final class _Frame extends ffi.Struct { + external ffi.Pointer stream; + + @ffi.Int() + external int w; + + @ffi.Int() + external int h; + + @ffi.Int() + external int depth; +} + +typedef FILE = _IO_FILE; + +final class _IO_FILE extends ffi.Struct { + @ffi.Int() + external int _flags; + + external ffi.Pointer _IO_read_ptr; + + external ffi.Pointer _IO_read_end; + + external ffi.Pointer _IO_read_base; + + external ffi.Pointer _IO_write_base; + + external ffi.Pointer _IO_write_ptr; + + external ffi.Pointer _IO_write_end; + + external ffi.Pointer _IO_buf_base; + + external ffi.Pointer _IO_buf_end; + + external ffi.Pointer _IO_save_base; + + external ffi.Pointer _IO_backup_base; + + external ffi.Pointer _IO_save_end; + + external ffi.Pointer<_IO_marker> _markers; + + external ffi.Pointer<_IO_FILE> _chain; + + @ffi.Int() + external int _fileno; + + @ffi.Int() + external int _flags2; + + @__off_t() + external int _old_offset; + + @ffi.UnsignedShort() + external int _cur_column; + + @ffi.SignedChar() + external int _vtable_offset; + + @ffi.Array.multi([1]) + external ffi.Array _shortbuf; + + external ffi.Pointer<_IO_lock_t> _lock; + + @__off64_t() + external int _offset; + + external ffi.Pointer<_IO_codecvt> _codecvt; + + external ffi.Pointer<_IO_wide_data> _wide_data; + + external ffi.Pointer<_IO_FILE> _freeres_list; + + external ffi.Pointer _freeres_buf; + + @ffi.Size() + external int __pad5; + + @ffi.Int() + external int _mode; + + @ffi.Array.multi([20]) + external ffi.Array _unused2; +} + +final class _IO_marker extends ffi.Opaque {} + +typedef __off_t = ffi.Long; +typedef _IO_lock_t = ffi.Void; +typedef __off64_t = ffi.Long; + +final class _IO_codecvt extends ffi.Opaque {} + +final class _IO_wide_data extends ffi.Opaque {} + +typedef Frame = _Frame; diff --git a/scripts/compilelib.sh b/scripts/compilelib.sh new file mode 100755 index 0000000..2a4d835 --- /dev/null +++ b/scripts/compilelib.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +SOURCE=${BASH_SOURCE[0]} +while [ -L "$SOURCE" ]; do + DIR=$(cd -P "$(dirname "$SOURCE")" >/dev/null 2>&1 && pwd) + SOURCE=$(readlink "$SOURCE") + [[ $SOURCE != /* ]] && SOURCE=$DIR/$SOURCE +done +DIR=$(cd -P "$(dirname "$SOURCE")" >/dev/null 2>&1 && pwd) + +BUILD_DIR=$(realpath $DIR/../build) +SRC_DIR=$(realpath $DIR/../src) +CMAKE_INSTALL_PREFIX=$(realpath $DIR/../../openMVG/build/_install) +ls $BUILD_DIR + +set -e +printf "\033c" + +cd ${BUILD_DIR} +cmake \ + ${SRC_DIR}\ + -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}\ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON +make + +set +e \ No newline at end of file diff --git a/scripts/dartffi.sh b/scripts/dartffi.sh new file mode 100755 index 0000000..318b889 --- /dev/null +++ b/scripts/dartffi.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +SOURCE=${BASH_SOURCE[0]} +while [ -L "$SOURCE" ]; do + DIR=$(cd -P "$(dirname "$SOURCE")" >/dev/null 2>&1 && pwd) + SOURCE=$(readlink "$SOURCE") + [[ $SOURCE != /* ]] && SOURCE=$DIR/$SOURCE +done +DIR=$(cd -P "$(dirname "$SOURCE")" >/dev/null 2>&1 && pwd) + +ROOT_DIR=$(realpath ${DIR}/..) + +cd -P ${ROOT_DIR} && dart run ffigen --config ffigen.yaml \ No newline at end of file diff --git a/scripts/watch_compilelib.sh b/scripts/watch_compilelib.sh new file mode 100755 index 0000000..e087ddd --- /dev/null +++ b/scripts/watch_compilelib.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +SOURCE=${BASH_SOURCE[0]} +while [ -L "$SOURCE" ]; do + DIR=$(cd -P "$(dirname "$SOURCE")" >/dev/null 2>&1 && pwd) + SOURCE=$(readlink "$SOURCE") + [[ $SOURCE != /* ]] && SOURCE=$DIR/$SOURCE +done +DIR=$(cd -P "$(dirname "$SOURCE")" >/dev/null 2>&1 && pwd) + +SRC_DIR=$(realpath ${DIR}/../src) + +find ${SRC_DIR} -name "*.c" -o -name "*.h" -o -name "CMakeLists.txt" | \ + entr -r ${DIR}/compilelib.sh \ No newline at end of file diff --git a/scripts/watch_dartffi.sh b/scripts/watch_dartffi.sh new file mode 100755 index 0000000..fcd21e7 --- /dev/null +++ b/scripts/watch_dartffi.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +SOURCE=${BASH_SOURCE[0]} +while [ -L "$SOURCE" ]; do + DIR=$(cd -P "$(dirname "$SOURCE")" >/dev/null 2>&1 && pwd) + SOURCE=$(readlink "$SOURCE") + [[ $SOURCE != /* ]] && SOURCE=$DIR/$SOURCE +done +DIR=$(cd -P "$(dirname "$SOURCE")" >/dev/null 2>&1 && pwd) + +SRC_DIR=$(realpath ${DIR}/../src) + +find ${SRC_DIR} -name "*.c" -o -name "*.h" -o -name "CMakeLists.txt" | \ + entr -r ${DIR}/dartffi.sh \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b68f736..da678c8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,30 +2,83 @@ # installed. You should not increase this version, as doing so will cause # the plugin to fail to compile for some customers of the plugin. cmake_minimum_required(VERSION 3.10) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) -include(ExternalProject) +function(dump_cmake_variables) + get_cmake_property(_variableNames VARIABLES) + list (SORT _variableNames) + foreach (_variableName ${_variableNames}) + if (ARGV0) + unset(MATCHED) -project(archimedes_mobile_lib_library VERSION 0.0.1 LANGUAGES C) + #case sensitive match + # string(REGEX MATCH ${ARGV0} MATCHED ${_variableName}) + # + #case insenstitive match + string( TOLOWER "${ARGV0}" ARGV0_lower ) + string( TOLOWER "${_variableName}" _variableName_lower ) + string(REGEX MATCH ${ARGV0_lower} MATCHED ${_variableName_lower}) -ExternalProject_Add(openMVG - GIT_REPOSITORY "git@github.com:src-r-r/openMVG.git" - GIT_TAG "develop" - SOURCE_SUBDIR "src" - CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_BUILD_DIR} -DCMAKE_INCLUDE-PATH=${CMAKE_BUILD_DIR}/include" - PREFIX ${CMAKE_BUILD_DIR} - INSTALL_DIR ${CMAKE_BUILD_DIR} + if (NOT MATCHED) + continue() + endif() + endif() + message(STATUS "${_variableName}=${${_variableName}}") + endforeach() +endfunction() + +project(archimedes_mobile_lib_library VERSION 0.0.1 LANGUAGES CXX) + +set (OPENMVG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../../openMVG/src) +set (FFMPEG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../../ffmpeg_install/include) +set (ARCHIMEDES_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}) +find_package( + OpenMVG + REQUIRED ) +set(PNG_SHARED ON CACHE BOOL "" FORCE) +set(PNG_STATIC OFF CACHE BOOL "" FORCE) +set(PNG_EXECUTABLES OFF CACHE BOOL "" FORCE) # we only want lib +set(PNG_TESTS OFF CACHE BOOL "" FORCE) # we only want lib +set(SKIP_INSTALL_ALL OFF CACHE BOOL "" FORCE) # we only want lib + +# find_package(PNG +# REQUIRED +# HINTS "../" +# ) + +add_definitions(${PNG_DEFINITIONS}) + add_library(archimedes_mobile_lib SHARED - "archimedes_mobile_lib.c" + "image.cxx" ) -target_link_libraries(archimedes_mobile_lib ${OPENMVG_LIBRARIES}) -include_directories(${OPENMVG_INCLUDE_DIRS}) -set_target_properties(archimedes_mobile_lib PROPERTIES - PUBLIC_HEADER archimedes_mobile_lib.h +dump_cmake_variables("^png") + +message("LIBRARIES:" ${OpenMVG_LIBRARIES}) + +target_link_libraries( + archimedes_mobile_lib + ${CMAKE_CURRENT_SOURCE_DIR}/../../libpng/_install/lib/libpng16.so + ${CMAKE_CURRENT_SOURCE_DIR}/../../openMVG/build/_install/lib/libopenMVG_image.a + ${OPENMVG_LIBRARIES} +) + +include_directories( + ${FFMPEG_INCLUDE_DIRS} + ${OPENMVG_INCLUDE_DIRS} + ${ARCHIMEDES_INCLUDE_DIRS} + ${PNG_INCLUDE_DIRS} +) + +set_target_properties(archimedes_mobile_lib + PROPERTIES + PUBLIC_HEADER image.h OUTPUT_NAME "archimedes_mobile_lib" ) +target_link_options(archimedes_mobile_lib PRIVATE "-Wl,-Bstatic") +target_link_options(archimedes_mobile_lib PRIVATE "-Wl,-Bdynamic") -target_compile_definitions(archimedes_mobile_lib PUBLIC DART_SHARED_LIB) +target_compile_definitions(archimedes_mobile_lib PUBLIC DART_SHARED_LIB) \ No newline at end of file diff --git a/src/image.cxx b/src/image.cxx new file mode 100644 index 0000000..b643261 --- /dev/null +++ b/src/image.cxx @@ -0,0 +1,71 @@ +#include "./image.h" + +#ifdef __cplusplus +#include +#include +#endif // __ cplusplus + +const Frame *new_frame_from_handle(FILE *stream, int w, int h, int depth) +{ + Frame *f = (Frame *)malloc(sizeof(Frame)); + f->stream = stream; + f->w = w; + f->h = h; + f->depth = depth; + return f; +} + +FILE *make_buffer(const uint8_t *data, const size_t data_len) +{ + FILE *file = fmemopen((char *)data, data_len, "r+"); + + if (file == NULL) + { + perror("Error opening file"); + return NULL; + } + + // Seek to the beginning of the file + rewind(file); + + // Write the data to the file + fwrite(data, sizeof(uint8_t), data_len, file); + + return file; +} + +#ifdef __cplusplus +extern "C" __attribute__((visibility("default"))) __attribute((used)) +#else +__attribute__((visibility("default"))) __attribute((used)) +#endif // __cplusplus +const Frame * +new_frame_from_data(const uint8_t *data, const size_t data_len, int w, int h, int depth) +{ + FILE *buf = make_buffer(data, data_len); + return new_frame_from_handle(buf, w, h, depth); +} + +#ifdef __cplusplus + +extern "C" int Archimedes::get_image_data(const Frame *frame, unsigned char *data) +{ + std::vector imageData; + openMVG::image::ReadPngStream(frame->stream, &imageData, (int *)&(frame->w), (int *)&(frame->h), (int *)&(frame->depth)); + data = (unsigned char *)calloc(imageData.size(), sizeof(imageData[0])); + memcpy(data, imageData.data(), imageData.size() * sizeof(imageData[0])); + return 1; +} + +#endif + +#ifdef __cplusplus +extern "C" __attribute__((visibility("default"))) __attribute((used)) +#else +__attribute__((visibility("default"))) __attribute((used)) +#endif // __cplusplus +int +archimedes_get_image_data(const Frame *frame, unsigned char *data) +{ + return Archimedes::get_image_data(frame, data); +} diff --git a/src/image.h b/src/image.h new file mode 100644 index 0000000..7b10a4c --- /dev/null +++ b/src/image.h @@ -0,0 +1,54 @@ +#ifdef __cplusplus +#include +#include +#include +#include +#include +#include +#include +#endif // __cplusplus + +#include +#include +#include +#include + +extern "C" auto png_sig_cm = png_sig_cmp; + +typedef struct _Frame +{ + FILE *stream; + int w; + int h; + int depth; +} Frame; + +const Frame *new_frame_from_handle(FILE *, int, int, int); +#ifdef __cplusplus +extern "C" __attribute__((visibility("default"))) __attribute((used)) +#else +__attribute__((visibility("default"))) __attribute((used)) +#endif // __cplusplus +const Frame * +new_frame_from_data(const uint8_t *, const size_t, int, int, int); + +#ifdef __cplusplus +typedef openMVG::image::Image RgbImage; +typedef std::vector FeatureVector; +typedef openMVG::image::Image UImage; +typedef std::vector RegionVector; +typedef openMVG::sfm::SfM_Data Sfm_Data; + +extern "C" namespace Archimedes +{ + int get_image_data(const Frame *, unsigned char *data); +} +#endif + +#ifdef __cplusplus +extern "C" __attribute__((visibility("default"))) __attribute((used)) +#else +__attribute__((visibility("default"))) __attribute((used)) +#endif // __cplusplus +int +archimedes_get_image_data(const Frame *, unsigned char *); \ No newline at end of file